【问题标题】:ADB shell get Toast messagesADB shell 获取 Toast 消息
【发布时间】:2016-06-03 13:28:34
【问题描述】:

我一直在研究 Java 测试框架,最终测试了一个执行大量 toast 消息的 android 应用程序。

问题是框架不使用 ADB 以外的任何东西,我不能使用任何额外的库。

所以有什么方法可以通过 adb 从应用程序获取烤消息? 我不介意为此单独写数百行..

【问题讨论】:

    标签: java android shell


    【解决方案1】:

    您可以在命令行中使用 adb shell uiautomator events 通过事件检查 toast 消息。但是,在您的 java 测试框架中,您可以创建一个代码重用方法,该方法运行此命令并将其解析为您想要将其与 try 块进行比较的任何字符串:

    try {
            Process process = Runtime.getRuntime().exec("uiautomator events");
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
    
            StringBuilder log=new StringBuilder();
            String toastMessage;
            while ((toastMessage = bufferedReader.readLine()) != null) {
                log.append(toastMessage).append("\n");
    
            if (toastMessage.contains(myToastStringVar)) {
                  Log.i("ToastMessageMatcher", "" // <-- your info message);
                } else {
                  Log.e("ToastMessageMatcher", "" // <-- your error message);
                }
            }
            bufferedReader.close();
            process.waitFor();
            System.out.println(log.toString());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    

    这也可以直接在您的衍生产品中。

    【讨论】:

    • 我之前尝试过,发现它没有显示在 toast 中显示的消息,我让我的框架使用 Tesseract OCR 来验证捕获的屏幕截图,现在它可以正常工作大约 97% 的时间。我还发现调用 UIautomator 会使使用辅助功能设置的应用程序崩溃,因此我创建一个从那里读取 toast 消息的应用程序的计划也失败了。感谢您的回答,它可能对其他人有所帮助
    【解决方案2】:

    使用AndroidViewClient/culebra,您可以等待并检索 Toast 中的文本

    #! /usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from com.dtmilano.android.viewclient import ViewClient
    
    vc = ViewClient(*ViewClient.connectToDeviceOrExit(), useuiautomatorhelper=True)
    
    print(vc.uiAutomatorHelper.device.wait_for_new_toast(timeout=10000))
    

    但是在这种情况下,不使用 adb 作为后端(这是 AndroidViewClient/culebra 的默认设置),而是使用 CulebraTester2-public,一个具有更多功能的备用后端(确切地说,这是其中之一那些)。您在创建ViewClient 对象时使用useuiautomatorhelper=True 获得此后端。

    你可以看看完整的APIhere,所以如果你想使用java你就可以了。

    【讨论】:

    • 虽然这会对很多人有所帮助,但这仍然与 adb 命令存在相同的问题。我正在测试的应用程序使用了辅助功能(由于某种原因它依赖于 uiautomator),并且由于 uiautomator 对象是单例的,它会导致应用程序崩溃或无法正常工作。仅依靠 Tesseract OCR 就解决了我的问题。我忘了在问题中提到这一点。
    • 准确地说,上面的脚本没有使用adb你只需要adb来启动服务)。然而,UiAutomation 确实依赖于平台可访问性 API,这在许多像您这样的情况下是一个巨大的缺点。即使您的最后一个资源是依赖图像比较和 OCR,AndroidViewClient/culebra 也会有很大帮助。 take-screenshotadb 快得多。
    • AVC/culebra也可以take screenshots of a single View而不是整个屏幕。
    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2015-02-12
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多