2

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

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

4

4 回答 4

6

我找到了使用直接攻丝模拟的解决方案。这不是一个很好的解决方案,但至少它有效。我在 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;
    }
}
于 2011-03-16T21:18:20.543 回答
5

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

var arrButtons = objActionSheet.buttons();

然后您可以通过名称属性检查您需要哪个属性(再次来自 UIAElement 的方法name())。

头韵,如果您检查您感兴趣的数组中的哪个元素,您可以使用 UIAElement 方法直接调用该按钮(假设您不会更改 ActionSheet)elements()
例如,如果您想点击 ActionSheet 树中的第二个按钮,您只需调用

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

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

于 2011-03-10T13:39:22.253 回答
0

由于我的操作表位于弹出窗口中,因此它返回一个 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);
于 2013-03-08T05:58:51.223 回答
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(); 
}
于 2013-11-03T20:40:12.877 回答