iOS / UI自动化:UIAActionSheet无法使用按钮进行操作

我的问题与XCode的Instruments工具中的UI Automation模板有关。 UI Automation如何支持UIActionSheet测试? 我知道有一个UIAActionSheet元素,我能够在我的应用程序中获取它。 但我不知道如何使用操作表中的按钮来操作和操作。 UI Automation不为这些按钮提供任何元素。 UI自动化文档也没有关于此事的任何信息。 请参阅以下链接。 看起来这个控件不使用UIButton类用于按钮并以某种特定方式呈现它们。 你能告诉我一些如何从UIAActionSheet到达按钮的线索吗? 谢谢。

http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Reference/UIAActionSheetClassReference/UIAActionSheet/UIAActionSheet.html#//apple_ref/doc/uid/TP40009895

如您所见,有一种方法可以为每个操作表返回默认按钮,即“取消”按钮。 由于操作表没有其他“默认”按钮,您需要自己实现这些按钮。
需要注意的一点是,它会跳过从父级inheritance的给定类的方法。 UIAActionSheet(与大多数UIA元素一样)inheritance了UIAElement类的所有方法。 检查此参考 。 您应该能够通过调用从操作表中获取所有按钮的数组

var arrButtons = objActionSheet.buttons(); 

然后你可以通过name属性检查你需要哪一个(来自UIAElement name() )。

总的来说,如果你检查你感兴趣的数组中的哪个元素,你可以直接调用该按钮(假设你不会改变ActionSheet),使用UIAElement方法elements()
例如,如果要在ActionSheet树中点击第二个按钮,则只需调用即可

 UIATarget.localTarget().frontMostApp().actionSheet().elements()[1].tap(); 

也许你可以跳过localTarget(),不确定,但上面的代码应该可以工作。

我已经找到了使用直接攻丝模拟的问题的解决方案。 它不是一个很好的解决方案,但至少它是有效的。 我在Apple开发者论坛上问了同样的问题,但没有得到任何回复。

所以,下面的function是我的解决方案。 我测试了它,它表现良好。 我仍将继续寻找更好的方法。

 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; } } 

由于我的操作表是在弹出窗口中,因此返回一个nil元素:

 UIATarget.localTarget().frontMostApp().actionSheet(); 

这确实会返回操作表:

 UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet(); 

但它有nil个元素()和按钮()。

所以我用MikhailV的function来点击按钮。

 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(); }