2015-07-13 2 views
1

Я пишу тестовый пример uiautomator для запуска программы приложений для Android в эмуляторе. Здесь возникает проблема, предположим, что я запускаю тестовый пример Ui в другой машине эмулятора. Как я могу обеспечить, чтобы записывающая машина и проигрыватель реагировали с одинаковой скоростью. Например, проигрыватель может реагировать медленнее, чем машина записи. Поэтому, когда тестовый пример запускает действие щелчка кнопкой, проигрыватель может не загрузить эту кнопку в макете. Есть ли какой-либо механизм в uiautomator, который всегда мог бы синхронизировать игру тестовых случаев и реакцию машины? Я боюсь, если проигрыватель слишком медленный, тогда может быть выброшено какое-то необоснованное исключение.Синхронизация UiAutomator

ответ

3

Как правило, вы используете функции, такие как UiDevice.wait(..), чтобы сделать паузу до завершения теста.

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

Это будет выглядеть примерно так:

detailsButton.click(); 

device.wait(Until.hasObject(By.desc("Details Pane")), TIMEOUT); 

// Do something on the details pane 
+0

Удивительная благодарность. это помогло мне с попыткой вызвать виртуальный метод void android.support.test.uiautomator.UiObject2. ' по ошибке ссылки на нулевой объект! Потому что Uiautomator ушел, прежде чем загрузился следующий экран. – gorbysbm

+0

Даже после того, как его ждет, он дает мне NPE. По некоторым причинам в «AccessibilityNodeInfo» есть только нулевые дети, поэтому он не может найти мою кнопку. Похож на какую-то ошибку. – WindRider

0

ответ Аллен волосы прекрасно работает, если вы знаете, что ожидать после щелчка. Если вы этого не сделаете (как в моем случае) вы можете:

UiAutomation uiAuto = InstrumentationRegistry.getIntrumentation().getUiAutomation(); //gets the UiAutomation for this execution 
AccessibilityNodeInfo rootNode = uiAuto.getRootInActiveWindow(); //gets the root node of the currently visible screen 
//makes sure there is a rootNode and that is has children, i.e., there is a drawn screen 
while(rootNode == null || rootNode.getChildCount() == 0){ 
    rootNode = uiAuto.getRootInActiveWindow(); 
} 
//getting here you are sure that the new screen is drawn. 

Я делаю это на вершине

device.waitForWindowUpdate(packageName, timeOut) 

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