UiAutomator的同步

时间:2015-07-13 07:46:47

标签: android uiautomator android-uiautomator

我正在编写uiautomator测试用例,用于在模拟器中运行Android应用程序。这就出现了问题,假设我在不同的仿真器机器上运行Ui测试用例。如何确保录音机和播放机以相同的速度作出反应。例如,回放机器可能比记录机器反应慢。因此,当测试用例触发按钮中的点击动作时,回放机器可能没有在布局中加载该按钮。 uiautomator中是否有任何机制可以始终同步测试用例的播放和机器反应?我担心如果播放机器太慢,那么可能会抛出一些未解决的异常。

2 个答案:

答案 0 :(得分:4)

通常,您可以使用UiDevice.wait(..)等函数暂停,直到您的测试继续进行。

例如,如果您有一个按钮可以打开包含您要与之交互的元素的屏幕,则在尝试与这些元素进行交互之前,您需要等待新内容出现。

这看起来像是:

detailsButton.click();

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

// Do something on the details pane

答案 1 :(得分:1)

如果您知道点击后会发生什么,那么Allen Hair的答案就可以了。如果你不这样做(就像我的情况那样),你可以:

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。