安卓端定位元素
根据ID
在Selenium Web自动化教程里,我们说过,如果能根据ID选择定位元素,最好根据ID,因为通常来说ID是唯一的,所以根据ID选择 效率高。
在安卓应用自动化的时候,同样可以根据ID查找。
但是这个ID ,是安卓应用元素的 resource-id
属性
使用如下代码
driver.find_element_by_id('expand_search')
根据CLASS NAME
安卓界面元素的 class属性 其实就是根据元素的类型,类似web里面的tagname, 所以通常不是唯一的。
通常,我们根据class 属性来选择元素, 是要选择多个而不是一个。
当然如果你确定 要查找的 界面元素的类型 在当前界面中只有一个,就可以根据class 来唯一选择。
使用如下代码
driver.find_elements_by_class_name('android.widget.TextView')
根据ACCESSIBILITY ID
元素的 content-desc 属性是用来描述该元素的作用的。
如果要查询的界面元素有 content-desc属性,我们可以通过它来定位选择元素。
使用如下代码
driver.find_element_by_accessibility_id('找人')
Xpath
Appium 也支持通过 Xpath选择元素。
但是其可靠性和性能不如 Selenium Web自动化。因为Web自动化对Xpath的支持是由浏览器实现的,而Appium Xpath的支持是 Appium Server实现的。
毕竟,浏览器产品的成熟度比Appium要高很多。
当然,Xpath是标准语法,所以这里表达式的语法规则和 以前学习的Selenium里面Xpath的语法是一样的,比如
driver.find_element_by_xpath('//ele1/ele2[@attr="value"]')
安卓 UIAutomator
就是通过 text 属性 和 className的属性 两个条件 来定位元素
code = 'new UiSelector().text("热门").className("android.widget.TextView")'
ele = driver.find_element_by_android_uiautomator(code)
ele.click()
父子关系childSelector
UiSelector 的 childSelector
可以选择后代元素,比如
code = 'new UiSelector().resourceId("tv.danmaku.bili:id/recycler_view").childSelector(new UiSelector().className("android.widget.TextView"))'
ele = driver.find_element_by_android_uiautomator(code)
注意: childSelector后面的引号要框住整个 子 uiSelector 的表达式
目前有个bug:只能找到符合条件的第一个元素,参考appium 在github上的 issues:
https://github.com/appium/java-client/issues/150
# son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小说"))'
# driver.find_element_by_android_uiautomator(son).click()