【发布时间】:2016-06-03 13:28:34
【问题描述】:
我一直在研究 Java 测试框架,最终测试了一个执行大量 toast 消息的 android 应用程序。
问题是框架不使用 ADB 以外的任何东西,我不能使用任何额外的库。
所以有什么方法可以通过 adb 从应用程序获取烤消息? 我不介意为此单独写数百行..
【问题讨论】:
我一直在研究 Java 测试框架,最终测试了一个执行大量 toast 消息的 android 应用程序。
问题是框架不使用 ADB 以外的任何东西,我不能使用任何额外的库。
所以有什么方法可以通过 adb 从应用程序获取烤消息? 我不介意为此单独写数百行..
【问题讨论】:
您可以在命令行中使用 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();
}
这也可以直接在您的衍生产品中。
【讨论】:
使用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(你只需要adb来启动服务)。然而,UiAutomation 确实依赖于平台可访问性 API,这在许多像您这样的情况下是一个巨大的缺点。即使您的最后一个资源是依赖图像比较和 OCR,AndroidViewClient/culebra 也会有很大帮助。 take-screenshot 比 adb 快得多。