-1

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

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

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

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

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

我在android 仪器测试用例上找到了答案 - getinstrumentation() 返回 需要的 nullinjectInstrumentation(InstrumentationRegistry.getInstrumentation()); 并告诉 InstrumentationRegistry 来自官方的 Android testing-support-lib:0.1

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

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

4

3 回答 3

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)

希望能帮助到你。

于 2015-06-20T19:42:00.933 回答
0

好吧,这个问题已经解决了

解压 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;

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

于 2015-06-14T13:50:35.007 回答
0

第一次尝试:

我注意到这个问题的重点是 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-07-13T16:13:27.283 回答