一、元素定位的困难
定位元素时有时无法准确定位到我们想要的元素,存在如下几种情况
1、通过一个条件无法准确定位到元素,需要进行条件组合
2、某元素无法唯一定位到,但是同级的其他元素可以唯一定位
3、某元素的属性无论如何组合都无法唯一定位,但是其所在上层节点下的另外一个节点可以通过元素定位到,而该元素的某些属性在这个上层节点可以唯一定位
如上情况我们用ID、Text等方式都无法定位,此时就需要利用xpath的各种组合来实现了。
二、基础定位
所谓基础定位就是指通过一个元素属性可以准确定位到元素,此时用xpath一个属性即可定位到,如下图我们要定位到招商银行,属性如下
如上图,假如通过text =招商银行、resource-id=com.mymoney:id/title_tv、class =android.widget.TextView都可以定位到,那我们用如下代码可以实现相同的元素定位。
#假如通过text =招商银行、resource-id=com.mymoney:id/title_tv、class =android.widget.TextView都可以定位到
#利用class的属性,并通过xpath定'
element1 = driver.find_element(AppiumBy.XPATH,'//android.widget.TextView')
#利用resource-id定位元素
element2 = driver.find_element(AppiumBy.XPATH,'//[@resource-id="com.mymoney:id/title_tv"]')
#利用text定位元素
element2 = driver.find_element(AppiumBy.XPATH,'//[@text="招商银行"]')
三、组合定位
还是上面的招商银行定位,假如可以通过其中两个元素才能定位到该元素,那我们可以两个条件组合使用(也可以多个条件组合)
#假如通过text =招商银行、resource-id=com.mymoney:id/title_tv、class =android.widget.TextView其中2个条件组合才可以定位到元素
#利用class和resource-id属性,并通过xpath定'
element1 = driver.find_element(AppiumBy.XPATH,'//android.widget.TextView[@resource-id="com.mymoney:id/title_tv"]')
#利用class和text定位元素
element2 = driver.find_element(AppiumBy.XPATH,'//android.widget.TextView[@text="招商银行"]')
#利用resource-id和text定位元素
element3 = driver.find_element(AppiumBy.XPATH,'//*[@resource-id="com.mymoney:id/title_tv" and @text="招商银行"]')
四、层级定位
当无论条件怎么组合都无法定位到元素,但是其上层的某个下层元素可以定位。
如上图,我们要定位招商银行右侧的余额数字,而余额数字通过resource-id、text、class属性不管怎么组合都无法准确定位。但是我们可以通过如下几点定位到
1、定位到招商银行这个元素
2、定位到招商银行上两层的爷爷节点,这个节点是招商银行和余额文本共同的上层节点
3、定位到的该节点下,通过resource-id就可以定位到余额了
定位代码如下
# 通过resource-id和text定位到招商银行的元素
zhaoshangyinhang = driver.find_element(AppiumBy.XPATH,'//*[@resource-id="com.mymoney:id/title_tv" and @text="招商银行"]'
# 定位到上两层节点的元素 (加一个 /.. 表示xpath往上一层)
father_element = driver.find_element(AppiumBy.XPATH,'//*[@resource-id="com.mymoney:id/title_tv" and @text="招商银行"]/../..')
#通过定位到的上层节点定位余额文本,余额文本的resource-id='com.mymoney:id/money_tv'
ye_element = father_element.find_element(AppiumBy.XPATH,'//*[@resource-id="com.mymoney:id/money_tv"]')
#可以通过如下xpath直接实现
xpath = '//*[@resource-id="com.mymoney:id/title_tv" and @text="招商银行"]/../..//*[@resource-id="com.mymoney:id/money_tv"]'