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

iOS/UI自动化:UIAAActionSheet无法使用按钮进行操作,ios,instruments,ui-automation,ios-ui-automation,Ios,Instruments,Ui Automation,Ios Ui Automation,我的问题与XCode的Instruments工具中的UI自动化模板有关。UI自动化如何支持UIActionSheet测试?我知道有一个UIAAActionSheet元素,我能够在我的应用程序中获得它。但我不知道如何从动作表中获取和操作按钮。UI自动化不为这些按钮提供任何元素。UI自动化文档也没有关于这一问题的任何信息。请参阅下面的链接。看起来这个控件没有为按钮使用UIButton类,而是以某种特定的方式呈现它们。你能给我一些如何从UIA操作表中找到按钮的线索吗?多谢各位 正如您所见,有一种方法可

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


正如您所见,有一种方法可以为每个操作表返回默认按钮,即“取消”按钮。由于操作表中没有其他“默认”按钮,因此您需要自己实现这些按钮。
需要注意的一点是,WoorthApple引用跳过了从父类继承的给定类的方法。UIAAActionSheet(与大多数UIA元素一样)继承UIAEElement类中的所有方法。检查。您应该能够通过调用

var arrButtons = objActionSheet.buttons();
然后,您可以按名称检查所需的属性(同样是UIAElement
name()
中的方法)

头韵地说,如果您检查数组中您感兴趣的元素,您可以使用UIAEElement方法
elements()

例如,如果您想点击ActionSheet树中的第二个按钮,只需调用

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

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

我已经找到了使用直接点击模拟解决问题的方法。这不是一个很好的解决方案,但至少是可行的。我在苹果开发者论坛上问过同样的问题,但没有得到任何回应

下面的函数就是我的解决方案。我已经测试过了,它的性能很好。我仍将继续寻求更好的方法

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;
    }
}
功能点击actionSheet按钮(目标、操作表、按钮索引)
{
var headerHeight=28;
var buttonHeight=50;
如果(按钮索引>=0)
{
var actionSheetRect=actionSheet.rect();
logMessage(“actionSheet:{rect:{origin:{x:+actionSheetRect.origin.x.toString()
+,y:“+actionSheetRect.origin.y.toString()
+},大小:{width:+actionSheetRect.size.width.toString()
+,高度:“+actionSheetRect.size.height.toString()
+ "}}}");
var xOffset=actionSheetRect.size.width/2;
var yOffset=人头高度+钮扣指数*钮扣高度+钮扣高度/2;
if(yOffset
由于我的操作表在popover中,因此返回一个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);

如果你想让它像我一样井然有序:

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

谢谢你的回复。对我确实理解UI自动化的想法。问题是我在UIActionSheet实例中声明了几个按钮。我还试图获取actionSheet.buttons(),但它返回一个空数组。设置isAccessibilityElement也没有帮助_myActionSheet.isAccessibilityElement=是_myActionSheet.accessibilityLabel=@“myActionSheet”,尽管脚本显示了actionSheet actionSheet.name()的正确名称==“myActionSheet”Hmm。。。若数组是空的,那个就奇怪了。elements()方法返回的也是空数组吗?当应用程序调用AvionSheet时,您是否实际看到它上的按钮?elements()方法还返回一个空数组。我认为这是UIActionSheet类的一个具体实现。它不在内部使用UIButton实例,而是直接绘制按钮。我尝试创建自己的UIActudieSeTeXT类来支持UIAcActudio,但它不能从UIAcWorkPoice中获得。现在,您可以)做苹果批准的事情,否则不支持:P考虑使用标准的实现控件的方式,或者使用其他方法来实现自动化。