自动化脚本不起作用?

Automation script is not working?

这是我第一次接触自动化工具 xcode 该脚本适用于所有按钮点击,但建立服务器连接的按钮除外。我不知道原因

这是我目前试过的脚本

var target = UIATarget.localTarget();
target.pushTimeout(4);
target.popTimeout();

var window=target.frontMostApp().mainWindow()
var appScroll=window.scrollViews()[0];
appScroll.logElementTree();
UIATarget.localTarget().delay(2);
appScroll.buttons()[1].tap();

上面的脚本会在成功后显示 UIActivityIndi​​cator 而不是移动到下一个控制器

我知道我一定漏掉了一个非常简单的观点。所以帮帮我

UIAutomation 试图为开发人员做事 "easy",但这样做会使事情变得非常混乱。听起来您正在获取对 window 的引用,等待按钮出现,然后在该按钮上执行 .tap()

我看到你已经考虑过 target.pushTimeout(),这与你的问题有关。超时系统可以让你做一些在任何健全的系统中都不可能做到的事情:在元素 存在 之前获取对元素的引用。我怀疑在幕后,UIAutomation 反复尝试获取您想要的引用——只要 timeout 允许。

因此,在您发布的示例中,这个 "feature" 可能真的伤害了您。

var window=target.frontMostApp().mainWindow()
var appScroll=window.scrollViews()[0];
UIATarget.localTarget().delay(2);
appScroll.buttons()[1].tap();

如果在 2 秒延迟期间视图发生变化怎么办?您对 target.frontMostApp().mainWindow.scrollViews()[0] 的引用可能无效,或者它可能未指向您认为自己指向的对象。

我们在 Illuminator framework by forgetting about the timeout system altogether, and just manually re-evaluating a given reference until it actually returns something. We called it waitForChildExistence 中解决了这个问题,但功能基本上如下:

var myTimeout = 3;  // how long we want to wait

// this function selects an element 
// relative to a parent element (target) that we will pass in
var selectorFn = function (myTarget) {
    var ret = myTarget.frontMostApp().mainWindow.scrollViews()[0];
    // assert that ret exists, is visible, etc
    return ret;
}

// re-evaluate our selector until we get something
var element = null;
var later = get_current_time() + myTimeout;
while (element === null && get_current_time() < later) {
    try {
        element = selectorFn(target);
    } catch (e) {
        // must not have worked
    }
}

// check whether element is still null

// do something with element

对于有临时进度对话框的情况,此代码将简单地等待它消失,然后再成功返回您想要的元素。