如何使用UiAutomator访问叠加窗口?

时间:2018-02-20 15:24:21

标签: android uiautomator android-windowmanager android-accessibility

我有一个应用程序,它使用两个进程来显示UI组件 - 一个用于主应用程序,它使用常规活动,另一个用于UI包含覆盖(存在于服务中),使用ViewManager API。我想使用UiAutomator测试叠加层与应用之间的交互。

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

有没有办法可以通过Accessibility框架公开叠加视图,以便UiAutomator可以找到它们,即使它们在不同的进程中运行?

我看了一下multiprocess Espresso,这听起来很有希望,因为它可能弥合两个进程之间的差距,但Espresso无法找到叠加视图。是否有可能改变叠加层的添加方式,可能是通过为UiAutomator提供某种根窗口,甚至可以让Espresso找到叠加层视图?

如果我使用UiDevice转储视图层次结构,我会看到系统装饰视图与应用程序视图处于同一级别。我看了一下SystemUI代码,其中视图被添加到WindowManager中,它与应用程序添加其叠加层的方式非常相似。与我所看到的唯一区别是图层类型。知道如何将系统UI组件注入到该层次结构中,并且如果可以对应用程序创建的叠加层执行相同的操作,那将是有趣的。

1 个答案:

答案 0 :(得分:0)

尝试使用BySelector代替UiSelector。

示例:

mDevice.findObject(new UiSelector().description("some desc"))

并非如此,但这确实做到了:

mDevice.findObject(By.desc("some desc"))

UiSelector

“指定布局层次结构中的元素”

BySelector不限于此。