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 v1.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 检索文本
UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)
在 Selenium 中的许多 findElement(s)/By 函数中,您啥时候会使用其中一个?