Java 访问Android UI Automator测试的资源

Java 访问Android UI Automator测试的资源,java,android,localization,android-uiautomator,Java,Android,Localization,Android Uiautomator,我正在Android上使用UI Automator进行一系列测试。我有它的工作,但我目前的测试是用大量的字符串文字 当我刚开始尝试让事情正常工作时,字符串文本是很好的,但它们将是不好的。如果应用程序已更改,则需要更改字符串文字以匹配。而且,我的测试必须完全重做才能测试其他语言的本地化版本,这是愚蠢的 应用程序本身的所有字符串都存储在资源中。每个字符串都有一个不变的标识符。。。下面是一个例子: <string name="more_options">More options</s

我正在Android上使用UI Automator进行一系列测试。我有它的工作,但我目前的测试是用大量的字符串文字

当我刚开始尝试让事情正常工作时,字符串文本是很好的,但它们将是不好的。如果应用程序已更改,则需要更改字符串文字以匹配。而且,我的测试必须完全重做才能测试其他语言的本地化版本,这是愚蠢的

应用程序本身的所有字符串都存储在资源中。每个字符串都有一个不变的标识符。。。下面是一个例子:

<string name="more_options">More options</string>
更多选项
应用程序代码将始终使用名称
more\u options
查找字符串资源,而不是在代码中硬编码
“more options”

所以我想要的是导入所有字符串资源,将它们存储在某种映射对象中,然后在我的UI自动机测试代码中使用类似于
m.get(“more\u options”)
的东西,而不是像我现在这样使用文字字符串
“more options”

无论我做什么,我都希望它只是构建并推送到设备上运行测试的JAR文件的一部分。例如,我不想将XML字符串资源文件推送到设备上,并尝试在测试运行时读取它们。我希望在构建JAR文件时内置数据

我查看了构建应用程序生成的文件,像
more\u options
这样的名称只是设置为整数。这些必须是指向资源存储的索引或指针,但我不确定如何将该存储复制到我的UI Automator项目中并将其连接起来;在Android应用程序中,您使用
上下文
对象访问资源,而UI自动机JAR文件没有
上下文

这一定是一个常见的问题,人们一定已经解决了,但我的谷歌搜索还没有找到任何关于人们如何解决这个问题的讨论


如果我没有得到任何建议,我将编写一个Python脚本,导入XML文件,并编写一个Java文件,该文件具有构建所需映射的函数,然后从UI自动机测试程序调用该函数。(我有一个Python脚本,它运行一系列命令行工具来启动UI自动机测试……我不介意让它做更多的工作。)但我认为应该有一个纯Java解决方案来解决这个问题,可能需要从应用程序的源目录中获取已编译的文件。

我通常通过资源ID将UI元素作为目标。这些都是非常静态的。我遗漏了什么吗?

我也遇到了类似的问题。 最后,我用Java为所有字符串文本创建了一个静态哈希映射。 所以我有不同语言的文件,具有相同的键和它们的本地化值

然后编写一个模块,在运行时操作设备语言,并返回键的相应本地化值。

您可以获得上下文:

val context = InstrumentationRegistry.getTargetContext()
然后在你的测试中:

context.getString(R.string.more_options)

在使用apk工具反编译应用程序时,字符串由其名称而不是资源id表示。也许可以查看对我有用的字符串:
String value=this.getApp().getApplicationContext().getResources().getText(id.toString())
您能否解释一下
UiAutomator
程序如何使用另一个APK中的资源ID来访问该另一个APK中的字符串?我说的不是针对给定APK编译的单元测试(“白盒测试”),我说的是一个完全独立的程序,它使用
UiAutomator
进行测试(“黑盒测试”)。如果可能的话,这将是对我问题的一个很好的回答。@steveha-我今天考虑过这个问题,我注意到“resourceId”API直到4.3(API 18)才被添加。基本上,所有按钮、文本视图等都应该通过包/id标识符进行识别。查看
UiSelector
类和
resourceId(stringresourceid)
方法[在Android文档中](.使用
uiautomatorviewer
查看这些资源ID。现在,这非常有趣。我们还没有使用API 18,所以我还不能使用它,但值得注意。这也是我所做的。我编写了一个Python程序,使用Python XML库读取所有字符串资源,然后它编写了e字符串资源。我认为没有人会给我比这个更好的答案,所以我接受它。谢谢。