android - 如何使用 UiAutomator 访问覆盖窗口?

标签 android android-uiautomator android-windowmanager accessibility

我有一个应用程序,它使用两个进程来显示 UI 组件 - 一个用于主应用程序,它使用常规 Activity ,另一个 UI 由使用 ViewManager API 添加到 WindowManager 的叠加层(位于服务中)组成。 .我想使用 UiAutomator 测试叠加层和应用程序之间的交互。

覆盖 View /窗口,如 in this question 所述, 很难直接访问。如果我将覆盖层移动到主进程,我可以通过使用反射调用 WindowManagerGlobal 上的方法来访问 View ,就像 Appium 所做的 here ,但如果它们在覆盖进程中运行,则对 WindowManagerGlobal 的调用不会返回 View 。在任何情况下,测试都不能与 View 交互,因为只有创建 View 的线程才能访问它们,除非它们是通过 UiAutomator 使用的 Accessibility 框架访问的。

有什么方法可以通过辅助功能框架公开覆盖 View ,以便 UiAutomator 可以找到它们,即使它们在不同的进程中运行?

我看过multiprocess Espresso ,这听起来很有希望,因为它可能会弥合两个进程之间的差距,但 Espresso 找不到覆盖 View 。是否可以通过为该过程提供某种根窗口来更改添加叠加层的方式,以使 UiAutomator 甚至可能是 Espresso 找到叠加层 View ?

如果我使用 UiDevice 转储 View 层次结构,我确实看到与应用程序 View 处于同一级别的系统装饰 View 。我查看了将 View 添加到 WindowManager 的 SystemUI 代码,它与应用程序添加其覆盖的方式非常相似。与我看到的唯一区别是图层类型。了解系统 UI 组件是如何被注入(inject)到该层次结构中的,以及是否可以对应用程序创建的叠加层进行同样的操作,这将是一件很有趣的事情。

最佳答案

尝试使用 BySelector 而不是 UiSelector。
例子:

mDevice.findObject(new UiSelector().description("some desc"))
不适用于be,但这确实:
mDevice.findObject(By.desc("some desc"))
UiSelector

"Specifies the elements in the layout hierarchy"


BySelector不限于此。

关于android - 如何使用 UiAutomator 访问覆盖窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48888625/

相关文章:

Android uiautomator : how to get EditText field by index?

java - WebView 滚动在 WindowManager 中不起作用

java - API 级别 < 19 的 isAttachedToWindow() 替代方案

java - 从 CSV 文件中读取 NULL 值

android - 从后台强制前台应用程序

android - 带有 Firebase 性能监控库的 DexArchiveBuilderException,R8 无法脱糖?

android - ARM 上 Android 的运行时 CPU 类型检测

android - UIObject2 中 exists() 的替代方法

android - 如何在 uiautomator 中使用 getApplicationContext()?

android - WindowManager.LayoutParams x/y 位置是基于 1 还是基于 0?