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

时间:2011-03-09 18:08:14

标签: ios instruments ui-automation ios-ui-automation

我的问题与XCode的工具工具中的UI自动化模板有关。 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

4 个答案:

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