【问题标题】:how to use Instrumentation under the uiautomator project?uiautomator项目下如何使用Instrumentation?
【发布时间】:2015-08-29 20:57:43
【问题描述】:

我最近在做一个 uiautomator 项目,然后 UiObject.getFromParent 对我来说是一个错误的元素,我查看了 uiautomator 的源代码,发现答案是因为我使用的 UiSelector。

我发现 uiautomator 正在使用 Instrumentation 来获取 UI 元素的东西,就像:

getInstrumentation().getUiAutomation().getRootInActiveWindow();

我只想获得一个 AccessibilityNodeInfo 节点,就像 uiautomator 所做的那样,但 uiautomator 并没有公开这一点。

我正在尝试通过一个新类扩展 InstrumentationTestCase,getInstrumentation() 总是向我返回 null。

我找到了答案 android instrumentation test case - getinstrumentation() returning null 那需要injectInstrumentation(InstrumentationRegistry.getInstrumentation()); 并告诉 InstrumentationRegistry 来自官方的 Android testing-support-lib:0.1

我已经下载了 Android Support Repository 并将 testing-support-lib-0.1-source.jar 导入到我的项目中,但我仍然看不到 InstrumentationRegistry。

有人知道我的演员阵容吗?

【问题讨论】:

    标签: android ui-automation android-uiautomator android-instrumentation


    【解决方案1】:

    我正在使用 InstrumentationTestCase 的扩展,它可以像这样正常工作:

    @Override
    public void setUp() throws Exception{
        super.setUp();
        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
        AccessibilityNodeInfo root = instrumentation.getUiAutomation().getRootInActiveWindow();
    }
    

    我导入了

    import android.test.InstrumentationTestCase;
    import android.support.test.InstrumentationRegistry;
    import android.view.accessibility.AccessibilityNodeInfo;
    

    并安装

    Android Support Repository (15)
    Android Support Library (22.2)
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,是的,它有帮助,我非常感谢,但是我的项目正在使用 UiAutomatorTestCase 的扩展,并且我已经基于它编写了很多代码库,所以我没有想要改变它。最后我以一种有点不正常的方式解决了这个问题,我标记为接受答案。抱歉回复晚了。
    【解决方案2】:

    这个问题已经解决了

    解压 testing-support-lib-0.1.aar 并获取 classes.jar 而不是 testing-support-lib-0.1-source.jar

    .现在日食不会说不能解决了。顺便说一句,你必须

    通过编辑 build.xml 将此库添加到 Ant 的 javac 类路径中

    否则,当你尝试 ant build 时,你会得到一个找不到的库。 但现在新问题出现了

    INSTRUMENTATION_STATUS: stack=java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/test/InstrumentationRegistry;

    也许这是另一个问题,所以我将通过谷歌找出答案,如果解决了我会更新这个问题,或者我会发布一个新问题。

    【讨论】:

    • 您不应该使用 Eclipse,而应该使用 AndroidStudio。当我尝试使用 Eclipse 时遇到了很多问题,在弄清楚 Android Studio 之后它就像一个魅力:)
    【解决方案3】:

    第一次尝试:

    我注意到这个问题的重点是 uiautomator 没有公开我想要的 api,当我查看源代码并找到具有这些代码的 UiDevice.dumpWindowHierarchy 时:

    AccessibilityNodeInfo root =getAutomatorBridge().getQueryController().getAccessibilityRootNode();
     the getAutomatorBridge was implemented by UiDevice:
       UiAutomatorBridge getAutomatorBridge() {
            if (mUiAutomationBridge == null) {
                throw new RuntimeException("UiDevice not initialized");
            }
            return mUiAutomationBridge;
        }
    

    关键是它上面没有修饰符,所以我所做的就是将它的修饰符修改为public,修改了字节码

    /system/framework/uiautomator.jar

    sdk 中的另一个(对不起,我没有,它有效!我可以这样使用它。

    AccessibilityNodeInfo root =getUidevice().getAutomatorBridge().getQueryController().getAccessibilityRootNode();
    

    但存在兼容性问题不是吗?

    第二次尝试:

    让我们想想java的默认修饰符,我们可以在同一个包下访问它,所以我们为什么不直接实现一个具有相同包名的类呢?那么我们可以调用它而不需要任何异常补丁。 这就是我所做的,而且效果很好:

    package com.android.uiautomator.core;
    
    import android.view.Display;
    import android.view.accessibility.AccessibilityNodeInfo;
    
    public class AutomationUltilites
    {
        public AutomationUltilites()
        {
        }
        public static AccessibilityNodeInfo  getRootNode()
        {
            return UiDevice.getInstance().getAutomatorBridge().getRootInActiveWindow();
        }
        public static Display getDisplay()
        {
            return UiDevice.getInstance().getAutomatorBridge().getDefaultDisplay();
        }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多