UIAutomation пытается сделать вещи «легкими» для разработчика, но при этом он может сделать вещи очень запутанными. Похоже, вы получаете ссылку на window
, ожидая появления кнопки, затем выполните .tap()
на этой кнопке.
Я вижу, что вы уже считаете, что вы возитесь с target.pushTimeout()
, что связано с вашей проблемой. Система тайм-аута позволяет вам делать что-то невозможное в любой разумной системе: получить ссылку на элемент перед его существованием. Я подозреваю, что за кулисами, UIAutomation неоднократно пытается получить требуемую ссылку - до тех пор, пока это разрешит timeout
.
Итак, в примере, который вы опубликовали, эта функция может повредить вам.
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, забыв о системе тайм-аута в целом и просто вручную переоценивая данную ссылку, пока она фактически ничего не вернет. Мы назвали его 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
В тех случаях, когда есть диалог временного прогресса, этот код будет просто ждать, пока она исчезнет, прежде чем успешно возвращая элемент, который вы хотите.
спасибо за ответ. Я отвечу, попробовав его. –
Вы предсказали, что правильный pushTimeout, похоже, является проблемой в моем случае –