将应用设置为与 UI 自动化器的默认按钮交互

Set app as default button interaction with UI automator

我有一个测试用例,其中在应用程序中打开 "Set as default" 提示。我想用 UI automator 测试它,我成功地测试了那个案例,但不是 100% 可靠。不幸的是,有些设备有 "Set as default" 大写的提示按钮,而有些则没有,所以我无法为这个测试用例创建 100% 可靠的测试。我在下面编写了这段代码,但是当通过文本获取 "Set as default" 按钮时,字母大小写不起作用,但是当我想与该按钮交互时,文本大小写很重要。在这种情况下,切换 IF-ELSE 案例并不能解决问题。不知何故,当我想按下这些按钮时,none 对话框按钮 ids(按钮 1、按钮 2..)起作用。

if (roleManager.isRoleAvailable(android.app.role.ASSISTANT)) {
    if (!roleManager.isRoleHeld(android.app.role.ASSISTANT)) {
        val myApp = device.findObject(UiSelector().textMatches(InstrumentationRegistry.getInstrumentation().targetContext.getString(R.string.app_name)))
        myApp.click()
        sleepLong()
        var setAsDefaultButton: UiObject? = null
        if (device.findObject(UiSelector().text("Set as default")) != null) {
            setAsDefaultButton = device.findObject(UiSelector().text("Set as default"))
            setAsDefaultButton?.click()
        } else if (device.findObject(UiSelector().text("SET AS DEFAULT")) != null) {
            setAsDefaultButton = device.findObject(UiSelector().text("SET AS DEFAULT"))
            setAsDefaultButton?.click()
        } else {
            clickDialogPositiveButton()
        }
    }
}

您可以使用 Pattern 对象而不是字符串。

您可以在您的代码中使用:

val pattern = Pattern.compile("Set as default", Pattern.CASE_INSENSITIVE)
val setDefaultText = device.findObject(UiSelector().text(pattern))
if(setDefaultText != null)) {
    setDefaultText.click()
} else {
   clickDialogPositiveButton()
}

根据 Jordan's 示例和提示,解决此问题的方法是找到具有模式的对象。使用 pattern,您可以使用 By.text(pattern) 搜索 UIObject。请注意,使用模式找到的对象需要是 UIObject2 而不是 UIObject.

val pattern = Pattern.compile("Set as the default", Pattern.CASE_INSENSITIVE)
if(device.findObject(UiSelector().text(pattern.toString())) != null) {
    device.findObject(By.text(pattern)).click()
}