Espresso 测试被后台线程阻止。应用程序不空闲异常:“AppNotIdleException。”

2023-12-02

我的 android espresso 单元测试由于某些后台线程不空闲而被阻止。我如何找出哪个线程正在阻止我的应用程序执行?

        android.support.test.espresso.AppNotIdleException: Looped for 246 iterations over 60 SECONDS. The following Idle Conditions failed ASYNC_TASKS_HAVE_IDLED.
        at dalvik.system.VMStack.getThreadStackTrace(Native Method)
        at java.lang.Thread.getStackTrace(Thread.java:580)
        at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:92)
        at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
        at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
        at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
        at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
        at android.support.test.espresso.Espresso.closeSoftKeyboard(Espresso.java:159)

作为一个开始:

Espresso for Android 是完美且快速的测试自动化框架, 但它有一个重要的限制——你只能操作 在测试上下文下的应用程序内。

From: http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html

代表着Espresso要执行任何操作都需要在应用程序的主线程上操作。它检查 UI 线程何时idle()如果没有,它会等待,直到 UI 线程再次空闲。

如果 UI 线程没有空闲太久,它会产生Espressso IdlingResources错误如AppNotIdleException, 意思是:

异常,表明应用程序在指定的持续时间后仍未空闲。

为了解决这个问题,你需要创建自己的IdlingResource方法说Espresso当 UI 线程是idle()为了它。

让我们更深入地研究一下问题:

浓缩咖啡引入了这个概念IdlingResource,这是一个简单的 接口:

代表被测应用程序的资源 这可能会导致测试期间发生异步后台工作 执行

接口定义three方法:

  • getName():必须返回一个非空字符串,用于标识空闲资源。
  • isIdleNow():返回空闲资源当前的空闲状态。如果返回 true,则 onTransitionToIdle() 方法
    注册的 ResourceCallback 必须先前已被调用。
  • registerIdleTransitionCallback(IdlingResource.ResourceCallback回调):通常该方法用于存储对
    回调以通知其空闲状态发生变化。

例如,等待空闲资源的实现 在 WebView 中完全加载的页面将如下所示:

public class WebViewIdlingResource extends WebChromeClient implements IdlingResource {

    private static final int FINISHED = 100;

    private WebView webView;
    private ResourceCallback callback;

    private WebViewIdlingResource(WebView webView) {
        this.webView = checkNotNull(webView,
                String.format("Trying to instantiate a \'%s\' with a null WebView", getName())));
        // Shall we save the original client? Atm it's not used though.
        this.webView.setWebChromeClient(this);
    }

    @Override public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == FINISHED && view.getTitle() != null && callback != null) {
            callback.onTransitionToIdle();
        }
    }

    @Override public void onReceivedTitle(WebView view, String title) {
        if (webView.getProgress() == FINISHED && callback != null) {
            callback.onTransitionToIdle();
        }
    }

    @Override public String getName() {
        return "WebView idling resource";
    }

    @Override public boolean isIdleNow() {
        // The webView hasn't been injected yet, so we're idling
        if (webView == null) return true;
        return webView.getProgress() == FINISHED && webView.getTitle() != null;
    }

    @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
        this.callback = resourceCallback;
    }
}

创建您自己的自定义空闲资源后,需要将其 通过致电注册 EspressoEspresso.registerIdlingResource(webViewIdlingResource).

From:http://dev.jimdo.com/2014/05/09/wait-for-it-a-deep-dive-into-espresso-s-idling-resources/

如果它不起作用尝试与Espresso另一个 Google 测试框架称为 [uiatomator,这可能会帮助您解决这个问题。

希望它会有所帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Espresso 测试被后台线程阻止。应用程序不空闲异常:“AppNotIdleException。” 的相关文章

  • Android - 启用和禁用蓝牙 - SDK 3 (OS 1.5) - 以编程方式?

    我编写了代码来以编程方式启用和禁用各种功能 例如 Wifi 振铃模式 飞行模式 您将在电源切换小部件中看到的所有内容 我还没有找到如何做的一个是蓝牙 看来在 SDK level 3 OS 1 5 中没有漂亮的蓝牙管理器类 有没有人指出关于启
  • XAMARIN - 添加来自 youtube 的视频

    我搜索如何从 youtube 添加视频的信息 例如 我想从一些 YouTube 链接添加视频 我认为它应该在网络视图中 但我需要一些详细信息 因为我找不到有关我的问题的任何信息 您可以使用 webview 播放 youtube 视频 str
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • Android 和 iOS 中的应用程序文件大小差异

    通过使用两个应用程序分发服务 Android 市场和 Apple 应用程序商店 我发现了一个谜团 Apple 应用程序的文件大小通常大于 Android 应用程序 我似乎找不到任何对这些差异的解释 而且这似乎是一个未触及的主题 我尝试过分配
  • Android:NotificationCompat.MediaStyle 操作按钮不执行任何操作

    我有一个简单的 Android 应用程序 其中包含一个Activity and a Service源自于MediaBrowserServiceCompat 我已成功将其设置为通过使用播放我的主要活动中的音频MediaBrowserCompa
  • 分配内存时线程争用

    在 C 中 我运行了一个创建许多小对象的玩具代码 我知道最好应该避免这种情况 我只是想研究这个问题 对于创建的对象总量相同 一个线程的运行速度比每个处理器一个线程 Parallel For 的运行速度快 原子操作包括创建一个包含 20k 个
  • 通过 Intent 从文件管理器中选择文件

    我想做的 我想获取文件字符串形式的路径 我通过 Android 文件管理器选择该路径 我拥有的 Intent intent new Intent Intent ACTION GET CONTENT intent setType startA
  • 获取包含位图支持的画布的 Android 视图上的点的像素颜色值

    我正在尝试找出获取给定点上像素颜色值的最佳方法View http developer android com reference android view View html 我可以通过三种方式写入视图 我设置了背景图像View setBa
  • 如何编写 adb jdwp + adbforward 脚本?

    我正在尝试使用命令行和脚本工具调试 Android 应用程序 我已经受够了 Android Studio 占用我的 CPU 要连接到我的应用程序 我需要adb jdwp获取 pid 然后adb forward tcp 8700 jdwp
  • 在应用程序之间共享自定义帐户验证器

    我有一个为使用自定义 AccountAuthenticator 的客户端构建的应用程序 它工作得非常好 并且满足了客户的需求 但是 这只是将使用相同身份验证管理器的应用程序集合中的第一个应用程序 这就是我不确定如何继续的地方 我无法知道任何
  • 通过覆盖滑动调整图像大小不会调整图像大小

    我在用着Glide下载并显示图像 但是 当我尝试调整图像大小时 它不会这样做 我得到随机大小 或者可能是图像的实际大小 这是我用于通过 Glide 加载的代码 Glide with context load file getUrl asBi
  • 拥有可重用对话框的最佳方法是什么?

    在 Android 中创建可重用对话框的最佳方法是什么 阅读通过对话框开发指南 http developer android com guide topics ui dialogs html 我知道我可以使用AlertDialog Buil
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • 安卓独立包

    我有一个很大的 UI 大约 20 25 个屏幕 我应该如何组织我的代码 我应该按功能分成不同的包吗 我是否应该为所有 UI 类创建一个包 然后创建子包进行组织 或者我不应该创建单独的包并组织到文件夹中 任何帮助将不胜感激 当您创建文件夹时
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • 当应用程序从最近的应用程序中滑动时,前台服务会被终止,通知也会被删除

    我有一个foreground service有通知 当应用程序从最近的应用程序托盘中滑出时 服务将被终止 通知也会被删除 这是我的服务的代码VoiceService class Override public IBinder onBind
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • 找不到与给定名称“@style/Theme.AppCompat.Light”匹配的资源

    我已经研究这个问题几个小时了 从 github 下载存储库后 任何 xml 文件中的唯一错误是 No resource found that matches the given name style Theme AppCompat Ligh
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下

随机推荐

  • jsf 2.0 Primefaces 多个 Fileupload 不记得上传的文件

    我已经在这篇文章中修复了一些其他问题 fileuploadhandler 现在正在工作 我的代码如下 Bean ManagedBean ViewScoped public class TempBean implements Serializ
  • Laravel 5.6 Passport 驱动程序无法在 socket.io 中工作并给出未经授权的异常

    当驱动程序是 api 时 下面的代码可以完美运行 然后我创建了一个新项目并将驱动程序更改为护照 现在 我总是收到错误 未经授权 我可以确认请求标头在浏览器中具有授权令牌代码 请单击下面的图像进行检查 然后单击缩放以查看质量更好的图像 我在下
  • 规则集中的字体和行高顺序

    我认为规则集中 CSS 的顺序并不重要 只要不存在隐式重复的规则 例如border and border top 事实上 许多 CSS 样式指南建议采用任意顺序 例如 按组 或 按字母顺序 然而 顺序font and line height
  • NSURLConnection 在 GET 上提前关闭

    我正在研究一种集中 URL 连接的方法 用于从服务器发送和接收 JSON 数据 它适用于 POST 但不适用于 GET 我正在使用 Google App Engine 服务器 在我的计算机上它将处理 POST 请求并返回正确的结果 并正确记
  • Jetty:Servlet 无法转发到 JSP

    我遇到以下问题 我尝试将请求从 servlet 转发到 jsp 页面 但收到 404 当我直接访问 sites home jsp 时 它会加载 jsp WebAppContext sites new WebAppContext src co
  • java可执行jar创建

    如何从 java 文件创建可执行 jar 文件 只有一个使用awt和applet创建的java文件dm java 我需要创建带有图标或图像的可执行 jar 单击该 jar 它将作为应用程序打开 这是可能的 请帮我 Using Eclipse
  • 从字符串中提取 URL

    我正在尝试找到一个可靠的解决方案来从字符串中提取网址 我有一个网站 用户可以在其中回答问题 并在来源框中输入信息来源 我允许他们输入网址 我想提取该网址并将其设为超链接 类似于雅虎问答的做法 有谁知道可以做到这一点的可靠解决方案 我发现的所
  • 预编译头在使用 Qt Creator / qmake / MinGw 的调试构建中不起作用

    在 Qt Creator 中 我有一个使用预编译标头的 pro 文件 当我在发布模式下构建时 构建工作非常完美 但是在调试模式下构建会出现错误 生成目标文件失败 例子 17 12 40 Running steps for project E
  • 在 AngularJS 中,HTML 模板中包含的任何内联 javascript 代码都不起作用

    在 AngularJS 中 HTML 模板中包含的任何内联 JavaScript 代码都不起作用 例如 main html 文件 div div 和 script html 文件 当我打开主页时 我期待一条警告消息说 是 但什么也没有发生
  • 在远程计算机上安装软件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 这看起来像是一个垃圾问题 但我对 VbScript 的完全无知让我没有机会尝试解
  • Python sqlite3 和并发

    我有一个使用 线程 模块的Python 程序 每秒 我的程序都会启动一个新线程 从网络上获取一些数据 并将这些数据存储到我的硬盘上 我想使用 sqlite3 来存储这些结果 但我无法让它工作 问题似乎与以下行有关 conn sqlite3
  • jQuery MultiSelect dropdownlist 如何访问结果?

    如何从按 mvc3 razor 调用的 JQUery 多选下拉列表中获取结果 http abeautifulsite net blog 2008 04 jquery multiselect 多选插件使用 符号将选定的值发送到服务器 一如既往
  • 如何在 C# 中加载程序图标

    我有某个程序的路径 例如explorer 如何获取程序图标 将其转换为png jpeg 然后显示在PictureBox中 我有这样的事情 string filePath C myfile exe Icon TheIcon IconFromF
  • SQL转置数据

    我有一个名为 Forecast 的表 如下所示 Product BK 有大约 80 000 条记录 而 Month 有 12 条记录 States 保持不变 为 5 条 如何编写查询将数据转置为如下所示 这是在 SQL 服务器上 并且不喜欢
  • 数组除法 - 将数组中存储的两个数字相除的最佳方法是什么?

    我有两个数组 被除数 除数 dividend 1 2 0 9 8 7 5 6 6 divisor 9 8 我需要的结果 股息 除数 为 quotient 1 2 3 4 5 6 7 我使用数组减法做到了这一点 从被除数中减去除数 直到被除数
  • C# WebClient - DownloadString 编码错误

    我正在尝试从 Amazon 下载 html 文档 但由于某种原因 我得到了一个错误的编码字符串 例如 K g g e 这是我尝试过的代码 using var webClient new System Net WebClient var ur
  • 如何重塑和交错矩阵元素?

    有了时间序列的值 我想将其重塑为 nx4 矩阵 X y 以便使用这些值作为机器学习算法的输入和输出值 X i 是 1x3 输入向量 y 是输出标量值 该算法将每个第二个序列值 3 个值 作为输入 以便预测第四个值 举一个实际的例子 假设我们
  • 如何在 vscode 中查看全角代码

    我想在 VS Code 中编码时使用完整视口 但是当我展开 VS Code 窗口时 这些行并没有扩展 有修复吗 使用的正确配置 为了配置 V S 代码使得代码行在 你的编辑器只会在视口的末尾换行 并且 以前从未如此 您需要将正确的值分配给
  • 如何在使用 playwright-python 运行代码结束时保持浏览器打开?

    我想使用 playwright python 自动填写一些表格 然后在提交之前仔细检查填写内容 但它总是在代码运行结束时关闭浏览器 即使我使用了handleSIGHUP False handleSIGINT False handleSIGT
  • Espresso 测试被后台线程阻止。应用程序不空闲异常:“AppNotIdleException。”

    我的 android espresso 单元测试由于某些后台线程不空闲而被阻止 我如何找出哪个线程正在阻止我的应用程序执行 android support test espresso AppNotIdleException Looped f