我的问题与 XCode 的 Instruments 工具中的 UI 自动化模板有关。UI 自动化如何支持 UIActionSheet 测试?我知道有一个 UIAActionSheet 元素,我能够在我的应用程序中获得它。但我不知道如何从操作表中获取和操作按钮。UI 自动化不为这些按钮提供任何元素。UI 自动化文档也没有关于此事的任何信息。请参阅下面的链接。看起来这个控件没有为按钮使用 UIButton 类并以某种特定的方式呈现它们。你能给我一些线索如何从 UIAActionSheet 访问按钮吗?谢谢你。
4 回答
我找到了使用直接攻丝模拟的解决方案。这不是一个很好的解决方案,但至少它有效。我在 Apple Developer Forum 中问过同样的问题,但没有得到任何回应。
所以,下面的功能是我的解决方案。我已经对其进行了测试,并且表现良好。我仍然会继续寻找更好的方法。
function tapActionSheetButton(target, actionSheet, buttonIndex)
{
var headerHeight = 28;
var buttonHeight = 50;
if (buttonIndex >= 0)
{
var actionSheetRect = actionSheet.rect();
UIALogger.logMessage("actionSheet:{rect:{origin:{x:" + actionSheetRect.origin.x.toString()
+ ", y:" + actionSheetRect.origin.y.toString()
+ "}, size:{width:" + actionSheetRect.size.width.toString()
+ ", height:" + actionSheetRect.size.height.toString()
+ "}}}");
var xOffset = actionSheetRect.size.width / 2;
var yOffset = headerHeight + buttonIndex * buttonHeight + buttonHeight / 2;
if (yOffset < actionSheetRect.size.height) {
var tap_x = actionSheetRect.origin.x + xOffset;
var tap_y = actionSheetRect.origin.y + yOffset;
target.tap({x:tap_x, y:tap_y});
}
}
else
{
var message = "Cannot tap button " + buttonIndex.toString() + ". It does not exist";
throw message;
}
}
如您所见,有一种方法可以为每个操作表返回默认按钮,即取消按钮。由于操作表没有其他“默认”按钮,您需要自己实现这些按钮。
值得苹果参考的一件事是它跳过了从父类继承的给定类的方法。UIAActionSheet(像大多数 UIA 元素一样)从 UIAElement 类继承所有方法。检查此参考。您应该能够通过调用从操作表中获取所有按钮的数组
var arrButtons = objActionSheet.buttons();
然后您可以通过名称属性检查您需要哪个属性(再次来自 UIAElement 的方法name()
)。
头韵,如果您检查您感兴趣的数组中的哪个元素,您可以使用 UIAElement 方法直接调用该按钮(假设您不会更改 ActionSheet)elements()
。
例如,如果您想点击 ActionSheet 树中的第二个按钮,您只需调用
UIATarget.localTarget().frontMostApp().actionSheet().elements()[1].tap();
也许你可以跳过 localTarget(),不确定,但上面的代码应该可以工作。
由于我的操作表位于弹出窗口中,因此它返回一个 nil 元素:
UIATarget.localTarget().frontMostApp().actionSheet();
这确实返回了操作表:
UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet();
但它有零元素()和按钮()。
所以我使用 MikhailV 的功能来点击按钮。
var target = UIATarget.localTarget();
var actionSheet = UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet();
var buttonIndex = 1;
tapActionSheetButton(target, actionSheet, buttonIndex);
如果您想像我一样保持井井有条:
function getTarget() {
return UIATarget.localTarget();
}
function getApp() {
return getTarget().frontMostApp();
}
function getWindow() {
return getApp().mainWindow();
}
function tapActionSheetButtonInIndex(index) {
var actionSheet = getApp().actionSheet() || getWindow().popover().actionSheet();
actionSheet.buttons()[index].tap();
}