Appium appium 关于 findElementByAndroidUIAutomator 元素定位的问题

蓝寅 · 2016年01月27日 · 最后由 张心 回复于 2017年10月18日 · 2869 次阅读

今天在学习使用 findElementByAndroidUIAutomator 定位元素的时候,遇到这样的一个问题,描述如下:

driver.findElementByAndroidUIAutomator("new UiSelector().className(\"android.widget.LinearLayout\").childSelector(new UiSelecotr().className(\"android.widget.Button\").text(\"8\")").click();

我使用上面的代码定位如下图的元素:

定位过程中,出现报错,试了修正了几次,还是报错,报错如下:

Exception in thread "main" org.openqa.selenium.UnsupportedCommandException: The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 43 milliseconds
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:59:12'
System info: host: 'WIN-AN7GGQLOUGK', ip: '192.168.61.2', os.name: 'Windows Server 2008 R2', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_05'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities [{appPackage=com.android.calculator2, networkConnectionEnabled=true, warnings={}, databaseEnabled=false, deviceName=192.168.61.101:5555, platform=LINUX, appActivity=.Calculator, desired={appPackage=com.android.calculator2, appActivity=.Calculator, platformVersion=4.4, browserName=, unicodeKeyboard=true, platformName=Android, deviceName=S5, resetKeyboard=true}, platformVersion=4.4.4, webStorageEnabled=false, locationContextEnabled=false, browserName=, takesScreenshot=true, javascriptEnabled=true, unicodeKeyboard=true, platformName=Android, resetKeyboard=true}]
Session ID: a1f9e64b-97d4-4807-a1c9-ecc2e2c91a73
*** Element info: {Using=-android uiautomator, value=new UiSelector().className("android.widget.LinearLayout").childSelector(new UiSelecotr().className("android.widget.Button").text("8")}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:353)
at io.appium.java_client.android.AndroidDriver.findElementByAndroidUIAutomator(AndroidDriver.java:394)
at com.app.cn.startapp.main(startapp.java:36)

有朋友说 appium 不支持 childSelector 和 fromParent 方法,是么?

共收到 9 条回复 时间 点赞

用 findElementByXPath 就可以了. 这个支持子元素查找. 用正则来搞定一切.
还有一个办法是先获得某个父元素. 然后使用元素的 element.findElmentXXX 来查找他的子元素. 我没试过这个方法.

markdown

有朋友说 appium 不支持 childSelector 和 fromParent 方法,是么?

这两个方法是 uiautomator 的,appium 你也知道是封装了 uiautomator,所以理论是支持的,但我自己没有试过,有时间搞出结果再来回答吧

#3 楼 @darker50 嗯嗯,感谢大神。有空试试哈。我最近忙都没时间去试试

#4 楼 @qq329999897
正好学习下,自己试下,是可以的,下面是 appium 输出的 Log

info: [debug] [BOOTSTRAP] [debug] Got command of type ACTION
info: [debug] [BOOTSTRAP] [debug] Got command action: find
info: [debug] [BOOTSTRAP] [debug] Finding new UiSelector().className("android.widget.LinearLayout").childSelector(new UiSelector().className("android.widget.LinearLayout").index(3)) using ANDROID_UIAUTOMATOR with the contextId:  multiple: false
info: [debug] [BOOTSTRAP] [debug] Parsing selector: new UiSelector().className("android.widget.LinearLayout").childSelector(new UiSelector().className("android.
widget.LinearLayout").index(3))
info: [debug] [BOOTSTRAP] [debug] UiSelector coerce type: java.lang.Class<T> arg: "android.widget.LinearLayout"
info: [debug] [BOOTSTRAP] [debug] UiSelector coerce type: class java.lang.String arg: "android.widget.LinearLayout"
info: [debug] [BOOTSTRAP] [debug] UiSelector coerce type: class com.android.uiautomator.core.UiSelector arg: new UiSelector().className("android.widget.LinearLa
yout").index(3)
info: [debug] [BOOTSTRAP] [debug] UiSelector coerce type: java.lang.Class<T> arg: "android.widget.LinearLayout"
info: [debug] [BOOTSTRAP] [debug] UiSelector coerce type: class java.lang.String arg: "android.widget.LinearLayout"
info: [debug] [BOOTSTRAP] [debug] UiSelector coerce type: int arg: 3
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[CLASS=android.widget.LinearLayout, CHILD=UiSelector[CLASS=android.widget.LinearLayout, INDEX=3]]

其中这行

info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[CLASS=android.widget.LinearLayout, CHILD=UiSelector[CLASS=android.widget.LinearLayout, INDEX=3]

是把写的 java 转化成功了,就可以定位到控件了
下面我这里的写对应的 java 代码

WebElement mine = driver.findElementByAndroidUIAutomator("new UiSelector().className(\"android.widget.LinearLayout\").childSelector(new UiSelector().className(\"android.widget.LinearLayout\").index(3))");
mine.click();

Android:4.3
appium:1.4.0

#5 楼 @darker50 感谢,我也去试试看

#5 楼 @darker50 插个眼,感谢。

我也用到了这个方法,想用它在 Android 界面下来滑动查找元素后定位元素,但是参数写为 UiScrollable 类之后总是报错:WebDriverException: Message: The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.;(UiSelector 类可以正常指定元素)请问下 python 版的 self._driver.find_element_by_android_uiautomator() 可以调用 UiScrollable() 类的方法吗?还是会有其他 scroll 查找控件的处理方法?

你解决了吗????

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册