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

Mik*_*ilV 2 instruments ui-automation ios ios-ui-automation

我的问题与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

Mik*_*ilV 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


yoo*_*iba 5

如您所见,有一种方法可以为每个操作表返回默认按钮,即"取消"按钮.由于操作表没有其他"默认"按钮,您需要自己实现这些按钮.
需要注意的一点是,它可以跳过从父级继承的给定类的方法.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(),不确定,但上面的代码应该可行.