14

我正在尝试使用 UIAutomation 测试 UIAlertView 的存在,但我的处理程序从未被调用。

在我的 javascript 开头我写:

UIATarget.onAlert = function onAlert(alert) {
    UIALogger.logMessage("alertShown");
    return false;
}

据我了解,一旦我指定了我的 onAlert 函数,它就会在我的测试期间出现 alertView 时被调用。所以我运行了一个显示警报视图的测试,这是显示警报的代码:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:message message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
alertView.accessibilityLabel = @"alerte d'avertissement";
[alertView show];

我在仪器中运行我的测试,警报出现但我的处理程序从未被调用。有没有人能够使用 UIAutomation 的事件处理程序?

谢谢,文森特。

4

7 回答 7

19

文档似乎是错误的。事实证明,警报是在您的脚本尝试运行的同一线程上处理的。因此,如果您希望调用警报处理程序,则需要休眠,例如,

UIATarget.onAlert = { ... }
window.buttons().triggerAlertButton.tap();
UIATarget.localTarget().delay(4);

此外,警报的名称和值似乎始终设置为空。但是,我能够访问包含警报标题的第一个静态文本。

于 2010-12-23T18:48:04.127 回答
6

确保显示时 UI 自动化脚本仍在运行UIAlertView

例如,将以下行添加到脚本的末尾将使其一直运行,直到可以访问警报或对象解析的宽限期到期。

// Wait for UIAlert to appear so that UIATarget.onAlert gets called.
target.frontMostApp().alert();

我通过彻底阅读和理解Instruments 用户指南:自动化 UI 测试来弄清楚这一点,我强烈建议将其作为 UI 自动化的介绍。

查看UIATarget 类参考也可能会有所帮助,特别是方法popTimeoutpushTimeoutsetTimeouttimeoutdelay

于 2012-10-04T12:04:38.927 回答
4

下面的代码对我有用。该功能正在处理警报,并且“警报显示”打印在日志上。

var target = UIATarget.localTarget();
var application = target.frontMostApp();
var window = application.mainWindow();

UIATarget.onAlert = function onAlert(alert){
    UIALogger.logMessage("alert Shown");    
}

target.frontMostApp().mainWindow().tableViews()[0]
    .cells()["Fhgui"].buttons()["Images"].tap();
// Alert detected. Expressions for handling alerts 
// should be moved into the UIATarget.onAlert function definition.
target.frontMostApp().alert().defaultButton().tap();
于 2012-09-11T12:01:07.913 回答
3

@vdaubry 解决方案很简单。

根据 Apple 文档,如果您想手动处理警报,那么您应该返回而true不是falseonAlert(alert)

 UIATarget.onAlert = function onAlert(alert) {
    UIALogger.logMessage("alertShown");
    return true;
}

@Drew Crawford 延迟将不起作用,因为默认情况下 UI 自动化会单击 can 按钮。文档没有错,但没有清楚地解释。

于 2015-03-20T08:48:24.383 回答
0

我也有“从未调用过警报处理程序”的问题。只需重新启动苹果的仪器就为我解决了:-)。

于 2011-03-15T12:04:32.350 回答
0

例如 - 不调用 onAlert

var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap()
UIAtarget.onAlert = function onAlert(alert)
{...}

-

例如 - onAlert 被称为

var target = UIATarget.localTarget(); 
UIAtarget.onAlert = function onAlert(alert)
{......}
target.buttons()["ShowAlert"].tap()

或者

#import "onAlert.js"
var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap()

试试看。

于 2013-07-26T05:11:18.960 回答
0

以下片段适用于 XCode 6.3.1 & Instruments(6.3.1 (6D1002)) :

    var target = UIATarget.localTarget();

    // Following line shows an internal alert with 'Cancel' & 'Continue' buttons
    target.frontMostApp().mainWindow().buttons()["ShowAlert"].tap();

    // Handle an internal alert
    UIATarget.onAlert = function onAlert(alert) {
            return true;
     }

    // Perform Tap on alert.
    target.frontMostApp().alert().buttons()["Continue"].tap();
于 2015-05-28T11:03:49.773 回答