【发布时间】:2018-02-20 15:24:21
【问题描述】:
我有一个应用程序,它使用两个进程来显示 UI 组件 - 一个用于主应用程序,它使用常规活动,另一个是 UI 由使用添加到 WindowManager 的叠加层(位于服务中)组成ViewManager API。我想使用 UiAutomator 测试叠加层和应用程序之间的交互。
覆盖视图/窗口,如in this question 所述,很难直接访问。如果我将叠加层移动到主进程,我可以通过使用反射调用 WindowManagerGlobal 上的方法来访问视图,就像 Appium 所做的here 一样,但如果它们在叠加层进程中运行,则对 WindowManagerGlobal 的调用不会返回视图。在任何情况下,测试都无法与视图交互,因为只有创建视图的线程才能访问它们,除非通过 UiAutomator 使用的 Accessibility 框架访问它们。
有什么方法可以通过 Accessibility 框架公开覆盖视图,以便 UiAutomator 可以找到它们,即使它们在不同的进程中运行?
我查看了multiprocess Espresso,这听起来很有希望,因为它可能会弥合两个进程之间的差距,但 Espresso 找不到覆盖视图。是否有可能改变叠加层的添加方式,或许可以通过为该进程提供某种根窗口,让 UiAutomator 甚至可能是 Espresso 找到叠加层视图?
如果我使用UiDevice 转储视图层次结构,我确实会看到与应用程序视图处于同一级别的系统装饰视图。我查看了将视图添加到 WindowManager 的 SystemUI 代码,它与应用程序添加其覆盖的方式非常相似。与我看到的唯一区别是图层类型。想知道系统 UI 组件是如何被注入到该层次结构中的,以及是否可以对应用程序创建的叠加层进行同样的操作。
【问题讨论】:
-
您找到解决方案了吗?
-
@dazza5000 抱歉,我从来没有找到解决方案。
标签: android android-uiautomator android-windowmanager android-accessibility