Mik*_*ilV 2 instruments ui-automation ios ios-ui-automation
我的问题与XCode的Instruments工具中的UI Automation模板有关.UI Automation如何支持UIActionSheet测试?我知道有一个UIAActionSheet元素,我能够在我的应用程序中获取它.但我不知道如何使用操作表中的按钮进行操作.UI Automation不为这些按钮提供任何元素.UI自动化文档也没有关于此事的任何信息.请参阅以下链接.看起来这个控件不使用UIButton类用于按钮并以某种特定方式呈现它们.你能告诉我一些如何从UIAActionSheet到达按钮的线索吗?谢谢.
我已经找到了使用直接攻丝模拟的问题的解决方案.它不是一个很好的解决方案,但至少它是有效的.我在Apple开发者论坛上问了同样的问题,但没有得到任何回复.
所以,下面的功能是我的解决方案.我测试了它,它表现很好.我仍将继续寻找更好的方法.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,有一种方法可以为每个操作表返回默认按钮,即"取消"按钮.由于操作表没有其他"默认"按钮,您需要自己实现这些按钮.
需要注意的一点是,它可以跳过从父级继承的给定类的方法.UIAActionSheet(与大多数UIA元素一样)继承了UIAElement类的所有方法.检查此参考.您应该能够通过调用从操作表中获取所有按钮的数组
var arrButtons = objActionSheet.buttons();
Run Code Online (Sandbox Code Playgroud)
然后你可以通过name属性检查你需要哪一个(来自UIAElement的方法name()).
另外,如果你检查你感兴趣的数组中的哪个元素,你可以直接调用该按钮(假设你不会改变ActionSheet),使用UIAElement方法elements().
例如,如果要在ActionSheet树中点击第二个按钮,则只需调用即可
UIATarget.localTarget().frontMostApp().actionSheet().elements()[1].tap();
Run Code Online (Sandbox Code Playgroud)
也许你可以跳过localTarget(),不确定,但上面的代码应该可行.