技术分享 | app自动化测试(Android)--高级定位技巧( 三 )


driver.find_element_by_android_uiautomator(
'newUiSelector().description("搜索")').click()Java版本
driver.findElementByAndroidUIAutomator("new
UiSelector().description("搜索")").click();
组合定位方式
Uiautomator也支持组合元素查找功能 , 示例代码:Python版本
driver.find_element_by_android_uiautomator(
'newUiSelector().resourceId(
"com.xueqiu.android:id/tv_login_phone").text("手机号")').click()Java版本
driver.findElementByAndroidUIAutomator("newUiSelector().resourceId(
"com.xueqiu.android:id/tv_login_phone").text("手机号")").click();
滚动查找元素
Uiautomator使用UiScrollable()实现了滚动查找元素的功能 , 可以指定滑动到某个元素 , 示例代码:Python版本
driver.find_element_by_android_uiautomator(
'newUiScrollable(newUiSelector().scrollable(true)
.instance(0)).scrollIntoView(newUiSelector()
.text("我的").instance(0));').click()Java版本
driver.findElementByAndroidUIAutomator(
"newUiScrollable(newUiSelector().scrollable(true)
.instance(0)).scrollIntoView(newUiSelector().
text("我的").instance(0));").click();
上面的代码 , 在当前的页面滚动的查找text文本是“我的”这个元素 , 找到之后执行点击操作 。
cssselector元素定位
AppiumServer从1.19.0这个版本开始 , 元素定位增加了cssselector的支持 。 appium-uiautomator2-driver会将cssselector定位器转化成androiduiautomator定位方式 。
注意:appiuminspector暂时没有添加这种定位方式 。
由于UiSelector()的表达式是Java的语法格式 , 编写定位元素的表达式很复杂 , 代码编写工具(比如Pycharm , VSCode , IntelliJIDEA等)也不会有任何提示错误信息 。 只能是运行时才能发现表达式的错误 。 官方提供了cssselector的语法 , 会自动转成androiduiautomator的语法结构 , 这种原生的定位元素的方式 , 定位速度要更快一些 。
详情参考官方:https://github.com/appium/appium-uiautomator2-driver/pull/410
源码地址:https://github.com/appium/appium-uiautomator2-driver/blob/master/lib/css-converter.js
id定位
可以使用cssselector语法定位 。 如下代码 , #igk表示cssselector定位符Python版本
driver.find_element_by_css_selector('#igk')
对应ID定位器代码如下:
driver.find_element_by_id('android:id/igk')Java版本
driver.findElementByCssSelector("#igk").click();
对应ID定位器代码如下:
driver.findElementById("android:id/igk").click();
classname定位
如下代码 , 表示cssselector定位符为.android.widget.ImageView的元素Python版本
driver.find_element_by_css_selector('.android.widget.ImageView')
对应classname定位器代码如下:
driver.find_element_by_class_name("android.widget.ImageView")Java版本
driver.findElementByCssSelector(".android.widget.ImageView");
对应classname定位器代码如下:
driver.findElementByClassName("android.widget.ImageView");
text定位
如下代码 , 表示cssselector定位符为*[text='工作台']"的元素:Python版本
driver.find_element_by_css_selector("*[text='工作台']")
对应xpath定位器代码如下:
driver.find_element_by_xpath("//*[@text='工作台']")Java版本
driver.findElementByCssSelector("*[text="工作台"]");
对应xpath定位器代码如下:
driver.findElementByXPath("//*[@text="工作台"]");
description定位
如下代码 , 表示cssselector定位符为*[description="ContentDescription"]的元素:Python版本
driver.find_element_by_css_selector('*[description="ContentDescription"]')
对应accessibilityid定位器代码如下:
driver.find_element_by_accessibility_id("ContentDescription")Java版本
driver.findElementByCssSelector("*[description="ContentDescription"]");