如何在uiautomator项目下使用Instrumentation?

时间:2015-06-14 07:26:14

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

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

我发现uiautomator正在使用Instrumentation获取UI元素的内容,如:

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

我只想获得一个与uiautomator一样的AccessibilityNodeInfo节点,但uiautomator没有暴露这个。

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

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

我已下载Android支持存储库并将testing-support-lib-0.1-source.jar导入到我的项目中,但我仍然看不到InstrumentationRegistry。

有人对我的演员有任何想法吗?

3 个答案:

答案 0 :(得分: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)

希望它有所帮助。

答案 1 :(得分:0)

好吧,这个问题已经通过

解决了
  

unpack testing-support-lib-0.1.aar并获取classes.jar而不是   测试支持-LIB-0.1-source.jar

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

  

通过编辑build.xml

将此lib添加到Ant的javac类路径中

否则你将尝试使用ant build时找不到lib。 但现在新的问题已经结束了

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

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

答案 2 :(得分:0)

Frist尝试过:

我注意到这个问题的重点是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;
    }

关键是它上面没有修饰符,所以我所做的就是修改它的公共修饰符,修改

的字节码
  

/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();
    }
}

希望它有所帮助。