2015-08-31 5 views
1

Это первый раз, когда я получаю ключи от инструментов автоматизации в 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 вместо перехода к следующему контроллеру после успеха

Я знаю Там должно быть, очень простая точка, которую мне не хватает. Так помогите мне

ответ

0

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 

В тех случаях, когда есть диалог временного прогресса, этот код будет просто ждать, пока она исчезнет, ​​прежде чем успешно возвращая элемент, который вы хотите.

+0

спасибо за ответ. Я отвечу, попробовав его. –

+0

Вы предсказали, что правильный pushTimeout, похоже, является проблемой в моем случае –