自动化脚本不起作用?
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();
上面的脚本会在成功后显示 UIActivityIndicator 而不是移动到下一个控制器
我知道我一定漏掉了一个非常简单的观点。所以帮帮我
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
对于有临时进度对话框的情况,此代码将简单地等待它消失,然后再成功返回您想要的元素。
这是我第一次接触自动化工具 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();
上面的脚本会在成功后显示 UIActivityIndicator 而不是移动到下一个控制器
我知道我一定漏掉了一个非常简单的观点。所以帮帮我
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
对于有临时进度对话框的情况,此代码将简单地等待它消失,然后再成功返回您想要的元素。