我最近正在研究一个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。
有人对我的演员有任何想法吗?
答案 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)
我注意到这个问题的重点是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();
}
}
希望它有所帮助。