我的问题与XCode的工具工具中的UI自动化模板有关。 UI Automation如何支持UIActionSheet测试?我知道有一个UIAActionSheet元素,我能够在我的应用程序中获取它。但我不知道如何使用操作表中的按钮进行操作。 UI Automation不为这些按钮提供任何元素。 UI自动化文档也没有关于此事的任何信息。请参阅以下链接。看起来这个控件不使用UIButton类用于按钮并以某种特定方式呈现它们。你能告诉我一些如何从UIAActionSheet到达按钮的线索吗?谢谢。
答案 0 :(得分:6)
我找到了使用直接攻丝模拟解决问题的方法。它不是一个很好的解决方案,但至少它是有效的。我在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;
}
}
答案 1 :(得分:5)
正如您所看到的,有一种方法可以为每个操作表返回默认按钮,即“取消”按钮。由于行动表没有其他“默认”按钮,您需要自己实施这些按钮 需要注意的一点是,它可以跳过从父级继承的给定类的方法。 UIAActionSheet(与大多数UIA元素一样)继承了UIAElement类的所有方法。检查this reference。您应该能够通过调用
从操作表中获取所有按钮的数组var arrButtons = objActionSheet.buttons();
然后你可以通过name属性检查你需要哪一个(来自UIAElement name()
的方法)。
Alliteratively,如果您检查您感兴趣的数组中的哪个元素,您可以使用UIAElement方法elements()
直接调用该按钮(假设您不会更改ActionSheet)。
例如,如果要在ActionSheet树中点击第二个按钮,则只需调用
UIATarget.localTarget().frontMostApp().actionSheet().elements()[1].tap();
也许你可以跳过localTarget(),不确定,但上面的代码应该可以工作。
答案 2 :(得分:0)
由于我的操作表在弹出框中,因此返回一个nil元素:
UIATarget.localTarget().frontMostApp().actionSheet();
这确实会返回操作表:
UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet();
但它有nil个元素()和按钮()。
所以我用MikhailV的功能来点击按钮。
var target = UIATarget.localTarget();
var actionSheet = UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet();
var buttonIndex = 1;
tapActionSheetButton(target, actionSheet, buttonIndex);
答案 3 :(得分:0)
如果你喜欢像我这样组织起来:
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();
}