Я пишу тестовый пример uiautomator для запуска программы приложений для Android в эмуляторе. Здесь возникает проблема, предположим, что я запускаю тестовый пример Ui в другой машине эмулятора. Как я могу обеспечить, чтобы записывающая машина и проигрыватель реагировали с одинаковой скоростью. Например, проигрыватель может реагировать медленнее, чем машина записи. Поэтому, когда тестовый пример запускает действие щелчка кнопкой, проигрыватель может не загрузить эту кнопку в макете. Есть ли какой-либо механизм в uiautomator, который всегда мог бы синхронизировать игру тестовых случаев и реакцию машины? Я боюсь, если проигрыватель слишком медленный, тогда может быть выброшено какое-то необоснованное исключение.Синхронизация UiAutomator
1
A
ответ
3
Как правило, вы используете функции, такие как UiDevice.wait(..), чтобы сделать паузу до завершения теста.
Например, если у вас есть кнопка, которая открывает экран, содержащий некоторые элементы, с которыми вы хотите взаимодействовать, вам нужно будет дождаться появления нового содержимого, прежде чем пытаться взаимодействовать с этими элементами.
Это будет выглядеть примерно так:
detailsButton.click();
device.wait(Until.hasObject(By.desc("Details Pane")), TIMEOUT);
// Do something on the details pane
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.
Удивительная благодарность. это помогло мне с попыткой вызвать виртуальный метод void android.support.test.uiautomator.UiObject2. ' по ошибке ссылки на нулевой объект! Потому что Uiautomator ушел, прежде чем загрузился следующий экран. – gorbysbm
Даже после того, как его ждет, он дает мне NPE. По некоторым причинам в «AccessibilityNodeInfo» есть только нулевые дети, поэтому он не может найти мою кнопку. Похож на какую-то ошибку. – WindRider