findElement 在 Android 上的 Appium 中不起作用

Posted

技术标签:

【中文标题】findElement 在 Android 上的 Appium 中不起作用【英文标题】:findElement is not working in Appium on Android 【发布时间】:2018-03-07 18:09:43 【问题描述】:

我正在尝试单击“设置”应用中的显示按钮。 但是“findElementBy..”语句不起作用,有时我会收到“空指针异常”或“不存在此类元素”异常,有时测试通过而无需单击显示按钮。

我尝试过使用不同的应用程序,但 findElementBy... 仍然无法在 Win10 中运行。 但是,当我在 Win 7 笔记本电脑上的同一台真实设备上运行同一段代码时,它正在运行。

项目正在使用以下 jar:

    gson-2.2.2.jar

    java-client-4.1.2.jar

    selenium-server-standalone-3.4.0.jar

    适用于 Eclipse 的 android 开发工具(插件)

    适用于 Maven Eclipse 1.4.0 的 Android(插件)

    Appium 服务器(版本:1.4.13.1)

Appium 代码:​​

@Test
public void Script1() throws Exception

    DesiredCapabilities capabilities = new DesiredCapabilities();

    capabilities.setCapability("automationName", "UiAutomator 2");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("platformVersion", "6.0.1");
    capabilities.setCapability("deviceName", "Redmi 3S");
    capabilities.setCapability("appPackage", "com.android.settings");
    capabilities.setCapability("appActivity", "com.android.settings.MainSettings");

    AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

    Thread.sleep(5000); 
driver.findElementByAndroidUIAutomator("UiSelector().text(\"Display\")").click();

我已经尝试过不同类型的定位器(即 ByID、ClassPath、xpath、UISelector 等),但在 win 10 机器上没有任何效果。我不认为存在定位器问题,因为它们正在我的 win7 笔记本电脑上工作。

Appium 日志:

使用命令启动 Appium 服务器:C:\Program Files (x86)\Appium\node.exe lib\server\main.js --address 127.0.0.1 --port 4723 --platform-name Android --platform-版本 23 --automation-name Appium --log-no-color

警告:Appium 对节点

信息:欢迎使用 Appium v​​1.4.13(修订版 c75d8adcb66a75818a542fe1891a34260c21f76a)

信息:Appium REST http 接口监听器开始于 127.0.0.1:4723

info: [debug] 非默认服务器参数: "address":"127.0.0.1","logNoColors":true,"platformName":"Android","platformVersion":"23","automationName" :"Appium"

信息:控制台日志级别:调试

info: --> POST /wd/hub/session "desiredCapabilities":"appPackage":"com.android.settings","appActivity":"com.android.settings.MainSettings","platformVersion" :"6.0.1","automationName":"UiAutomator 2","platformName":"Android","deviceName":"Redmi 3S","requiredCapabilities":,"capabilities":"desiredCapabilities": "appPackage":"com.android.settings","appActivity":"com.android.settings.MainSettings","platformVersion":"6.0.1","automationName":"UiAutomator 2","platformName": "Android","deviceName":"Redmi 3S","requiredCapabilities":,"alwaysMatch":"platformName":"Android","firstMatch":[]

信息:客户端用户代理字符串:Apache-HttpClient/4.5.3 (Java/1.8.0_144)

info: [debug] 没有得到应用但得到了 Android 包,将尝试在设备上启动它

info: [debug] 创建新的 appium 会话 44f52f68-60a6-4469-9575-0c1bfe2d999d

信息:启动 android appium

信息:[调试] 获取 Java 版本

信息:Java 版本为:1.8.0_144

info: [debug] 检查 adb 是否存在

信息:[调试] 使用 C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe 中的 adb

警告:没有应用功能,无法解析包/活动

信息:[调试] 使用快速重置?真的

info: [debug] 正在为会话准备设备

info: [debug] 不检查应用是否存在,因为我们假设它已经在设备上

信息:检索设备

info: [debug] 正在尝试查找已连接的安卓设备

info: [debug] 正在连接设备...

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" 设备

信息:[调试] 1 个设备已连接

信息:找到设备 964aa907d030

info: [debug] 设置设备 id 为 964aa907d030

info: [debug] 等待设备准备就绪并响应 shell 命令(超时 = 5)

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 wait-for-device

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "echo 'ready'"

info: [debug] 启动 logcat 捕获

info: [debug] 获取设备 API 级别

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "getprop ro.build.version.sdk"

信息:[调试] 设备处于 API 级别 23

信息:设备 API 级别为:23

info: [debug] 为语言提取字符串:默认

info: [debug] Apk 本地不存在

info: [debug] 无法获取字符串,但看起来我们有一个旧的字符串文件,所以忽略

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "rm -rf /data/local/tmp/字符串.json"

信息:[调试] 由于服务器未使用 --full-reset 启动,因此未卸载应用程序

信息:[debug] 由于我们使用包而不是应用程序路径启动,因此跳过安装

信息:[调试] 转发系统:4724 到设备:4724

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 forward tcp:4724 tcp:4724

info: [debug] 将 appium 引导推送到设备...

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 push "C:\Program Files (x86)\Appium \node_modules\appium\build\android_bootstrap\AppiumBootstrap.jar" /data/local/tmp/

info: [debug] 将设置 apk 推送到设备...

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 install "C:\Program Files (x86)\Appium \node_modules\appium\build\settings_apk\settings_apk-debug.apk"

info: [debug] 将解锁帮助应用推送到设备...

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 install "C:\Program Files (x86)\Appium \node_modules\appium\build\unlock_apk\unlock_apk-debug.apk"

信息:启动应用程序

info: [debug] 试图杀死所有 'uiautomator' 进程

info: [debug] 使用 'uiautomator' 获取所有进程

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "ps 'uiautomator'"

info: [debug] 没有找到匹配的进程

信息:[调试]运行引导

信息:[调试] 生成:C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe -s 964aa907d030 shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap .Bootstrap -e pkg com.android.settings -e disableAndroidWatchers false

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:numtests=1

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:流=

信息:[调试] [UIAUTOMATOR STDOUT] io.appium.android.bootstrap.Bootstrap:

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:id=UiAutomatorTestRunner

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:test=testRunServer

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:class=io.appium.android.bootstrap.Bootstrap

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:当前=1

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS_CODE:1

info: [debug] [BOOTSTRAP] [debug] 在端口 4724 上打开的套接字

信息:[debug] [BOOTSTRAP] [debug] Appium Socket 服务器就绪

info: [debug] 如果设备不活跃,则唤醒设备

信息:[debug] 将命令推送到 appium 工作队列:["wake",]

信息:[debug] [BOOTSTRAP] [debug] 正在加载 json...

info: [debug] [BOOTSTRAP] [debug] 注册的崩溃观察者。

信息:[debug] [BOOTSTRAP] [debug] 客户端已连接

信息:[debug] [BOOTSTRAP] [debug] 从客户端获取数据:"cmd":"action","action":"wake","params":

info: [debug] [BOOTSTRAP] [debug] 得到了 ACTION 类型的命令

信息:[debug] [BOOTSTRAP] [debug] 得到命令操作:唤醒

信息:[debug] [BOOTSTRAP] [debug] 返回结果:"status":0,"value":true

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "dumpsys window"

信息:[调试] 屏幕已解锁,继续。

信息:[debug] 将命令推送到 appium 工作队列:["getDataDir",]

info: [debug] [BOOTSTRAP] [debug] 从客户端获取数据:"cmd":"action","action":"getDataDir","params":

info: [debug] [BOOTSTRAP] [debug] 得到了 ACTION 类型的命令

info: [debug] [BOOTSTRAP] [debug] 得到命令动作:getDataDir

信息:[debug] [BOOTSTRAP] [debug] 返回结果:"status":0,"value":"/data/local/tmp"

info: [debug] dataDir 设置为:/data/local/tmp

info: [debug] 将命令推送到 appium 工作队列:["compressedLayoutHierarchy","compressLayout":false]

info: [debug] [BOOTSTRAP] [debug] 从客户端获取数据:"cmd":"action","action":"compressedLayoutHierarchy","params":"compressLayout":false

info: [debug] [BOOTSTRAP] [debug] 得到了 ACTION 类型的命令

info: [debug] [BOOTSTRAP] [debug] 得到命令动作:compressedLayoutHierarchy

信息:[debug] [BOOTSTRAP] [debug] 返回结果:"status":0,"value":false

info: [debug] 获取设备 API 级别

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "getprop ro.build.version.sdk"

信息:[调试] 设备处于 API 级别 23

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "am start -S -a android.intent. action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000 -n com.android.settings/com.android.settings.MainSettings"

info: [debug] 等待 pkg "com.android.settings" 和 activity "com.android.settings.MainSettings" 被聚焦

info: [debug] 获取焦点包和活动

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "dumpsys window windows"

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "getprop ro.build.version.release"

info: [debug] 设备版本为 6.0.1

信息:[调试] 设备启动!准备好命令

info: [debug] 将命令超时设置为默认值 60 秒

信息:[调试] Appium 会话以 sessionId 44f52f68-60a6-4469-9575-0c1bfe2d999d 开始

信息:

信息:--> GET /wd/hub/session/44f52f68-60a6-4469-9575-0c1bfe2d999d

info: [debug] 成功响应客户端:"status":0,"value":"platform":"LINUX","browserName":"Android","platformVersion":"6.0.1 ","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":,"desired": "appPackage":"com.android.settings","appActivity":"com.android.settings.MainSettings","platformVersion":"6.0.1","automationName":"UiAutomator 2","platformName":" Android","deviceName":"Redmi 3S","appPackage":"com.android.settings","appActivity":"com.android.settings.MainSettings","automationName":"UiAutomator 2","platformName ":"Android","deviceName":"964aa907d030","sessionId":"44f52f68-60a6-4469-9575-0c1bfe2d999d"

信息:

info: --> POST /wd/hub/session/44f52f68-60a6-4469-9575-0c1bfe2d999d/element "using":"-android uiautomator","value":"UiSelector().text(\ "显示\")"

info: [debug] 等待最多 0ms 的条件

info: [debug] 将命令推送到 appium 工作队列:["find","strategy":"-android uiautomator","selector":"UiSelector().text(\"Display\")", "context":"","multiple":false]

info: [debug] [BOOTSTRAP] [debug] 从客户端获取数据:"cmd":"action","action":"find","params":"strategy":"-android uiautomator" ,"selector":"UiSelector().text(\"Display\")","context":"","multiple":false

info: [debug] [BOOTSTRAP] [debug] 得到了 ACTION 类型的命令

info: [debug] [BOOTSTRAP] [debug] 得到命令动作:find

info: [debug] [BOOTSTRAP] [debug] 使用 ANDROID_UIAUTOMATOR 和 contextId 查找 UiSelector().text("Display"):multiple: false

info: [debug] [BOOTSTRAP] [debug] 解析选择器:UiSelector().text("Display")

info: [debug] [BOOTSTRAP] [debug] UiSelector 强制类型:class java.lang.String arg: "Display"

信息:[debug] [BOOTSTRAP] [debug] 使用:UiSelector[TEXT=Display]

信息:[debug] [BOOTSTRAP] [debug] 返回结果:"status":0,"value":"ELEMENT":"1"

info: [debug] 成功响应客户端:"status":0,"value":"ELEMENT":"1","sessionId":"44f52f68-60a6-4469-9575-0c1bfe2d999d"

info:

info: --> POST /wd/hub/session/44f52f68-60a6-4469-9575-0c1bfe2d999d/element/1/click "id":"1" 信息:[debug] 将命令推送到 appium 工作队列:["element:click","elementId":"1"]

info: [debug] [BOOTSTRAP] [debug] 从客户端获取数据:"cmd":"action","action":"element:click","params":"elementId":"1"

info: [debug] [BOOTSTRAP] [debug] 得到了 ACTION 类型的命令

信息:[debug] [BOOTSTRAP] [debug] 得到命令动作:点击

info: [debug] 成功响应客户端:"status":0,"value":true,"sessionId":"44f52f68-60a6-4469-9575-0c1bfe2d999d"

信息:

信息:[debug] [BOOTSTRAP] [debug] 返回结果:"status":0,"value":true

info: [debug] 在 60 秒内没有收到新命令,正在关闭...

信息:关闭 appium 会话

信息:[调试] 按下 HOME 键

info: [debug] 执行 cmd: "C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" -s 964aa907d030 shell "input keyevent 3"

信息:[调试] 停止 logcat 捕获

info: [debug] Logcat 以代码 null 终止,信号 SIGTERM

info: [debug] [BOOTSTRAP] [debug] 从客户端获取数据:"cmd":"shutdown"

info: [debug] [BOOTSTRAP] [debug] 得到了 SHUTDOWN 类型的命令

info: [debug] [BOOTSTRAP] [debug] 返回结果:"status":0,"value":"OK,正在关闭"

info: [debug] 发送关机命令,等待 UiAutomator 停止...

信息:[debug] [BOOTSTRAP] [debug] 关闭客户端连接

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:numtests=1

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:流=。

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:id=UiAutomatorTestRunner

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:test=testRunServer

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:class=io.appium.android.bootstrap.Bootstrap

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:当前=1

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS_CODE:0

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:流=

info: [debug] [UIAUTOMATOR STDOUT] WatcherResultPrinter=的测试结果。

信息:[调试] [UIAUTOMATOR STDOUT] 时间:67.859

信息:[调试] [UIAUTOMATOR STDOUT] OK(1 次测试)

信息:[调试] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS_CODE:-1

info: [debug] UiAutomator 正常关闭

info: [debug] 清理 android 对象

info: [debug] 清理 appium 会话

info: [debug] 我们关闭了,因为没有新命令进来

【问题讨论】:

刚刚通过使用maven项目添加依赖得到了解决方案。 【参考方案1】:

你试试看:driver.findElement(By.ByName("Display"));

driver.findElement(By.xpath("//android.widget.TextView[@text='Display']"));

【讨论】:

【参考方案2】:

试试

driver.findElementByName("Display").click();

driver.findElementByxpath("//*[@id='android:id/title'][@text='Display']").click();

它应该可以工作

【讨论】:

以上是关于findElement 在 Android 上的 Appium 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

硒问题尝试使用 driver.findElement(By.xpath() 从 div 检索文本

APPIUM Android 定位方式

UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

在 Selenium 中的许多 findElement(s)/By 函数中,您啥时候会使用其中一个?

Appium findElement 在一行中使用了两次不起作用

Java+Selenium——findElements举例