【问题标题】:Espresso: Ignore AppNotIdleException浓缩咖啡:忽略 AppNotIdleException
【发布时间】:2018-01-17 19:31:22
【问题描述】:
我使用 Espresso 编写了一个 UI 测试框架来读取 CSV 文件并运行某些 UI 命令。我希望它能够整天整夜运行测试 UI 并调用 API 并试图破坏它。
我正在使用 wait(),虽然我知道它被积极劝阻,因为系统会创建并打印纸质票据,这意味着 espresso 往往会移动得太快,而且因为它需要运行很长时间而我们不需要想要创建数百万张票。在抛出 AppNotIdleException 之前尝试保持在 espresso 给您的 60 秒内并不是很有效,所以我想知道是否有办法停用它或扩展它或捕获异常并以另一种方式处理它
【问题讨论】:
标签:
java
android
android-espresso
【解决方案1】:
不要认为Thread.wait() 是个好主意。你应该看看IdlingResource 组件。阅读docs 并查看samples。
【解决方案2】:
它非常 hacky,与 Espresso 文档中提到的所有内容都背道而驰(但概念本身也是如此),但我找到了解决 AppNotIdleException 的方法。
public void delayTestsbyMillis(int millis) {
try {
if(millis < 59000)
Thread.sleep(millis);
else {
int numLoop = millis/50000;
for(int i = 0; i < numLoop; i++){
Thread.sleep(50000);
onView(withId(R.id.rolling_news)).perform(click());
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
由于 Java 不会让我们忽略异常,并且因为这个异常总是在 60 秒没有交互后抛出,所以我只是添加了一个 for 循环以防指定的延迟超过 59 秒。该循环只是将指定的延迟划分为 50 秒的块,然后单击一个静态且没有 onClickListener 的视图,在本例中为“rolling_news”。即使这是非常糟糕的做法,这也会产生我想要的最终效果