Appium元素定位的方法
常用的元素定位方式
- id定位元素
- class_name定位元素
- content-desc定位元素
name 定位元素 (appium1.5及之后的版本废弃了name属性)- xpath定位元素
- 模糊定位
- 组合定位
- 层级定位
- uiautomator定位元素,Android独有
id定位元素
- 使用方法
find_element('id', "")
driver.find_element_by_id() 已过时 - 元素的resource-id
- 唯一标识该元素的值(id有时候并不唯一)
示例:一般优先使用此方式定位
driver.find_element('id', 'com.lemon.lemonban:id/largeLabel')
driver.find_element(By.ID, 'com.lemon.lemonban:id/largeLabel')
class_name定位
通过ClassName定位元素,对应【class】属性
- 使用方法
find_element(By.CLASS_NAME, "")
- 此方法一般不使用,由于界面元素的class重复度太高,基本上不存在唯一值
- 元素的class属性
self.driver.find_element("class name", "android.widget.FrameLayout")
self.driver.find_element(By.CLASS_NAME, "android.widget.FrameLayout" )
content-desc定位
通过accessibility_id定位元素,对应【content-desc】属性
- 使用方法
find_element(By.ACCESSIBILITY_ID, " ")
- 元素的content-desc属性
content-desc属性是用来描述该元素的作用,一般都是为空
find_element(By.ACCESSIBILITY_ID, "天猫超市")
xpath 定位
单个元素定位
根据id属性定位
表达式://*[@resource-id='id属性']
根据text属性定位
表达式://*[@text='text文本属性']
根据class属性定位
表达式: //*[@class='class属性']
通过content-desc属性定位
表达式: //*[@content-desc='desc的文本']
driver.find_element('xpath', "//*[@resource-id='com.lemon.lemonban:id/largeLabel']")
driver.find_element('xpath', "//*[@text='我的柠檬')]")
driver.find_element('xpath', "//*[@class='android.widget.TextView']")
driver.find_element('xpath', "//*[@content-desc=' ']")
模糊定位
contains是模糊匹配的定位方法,对于一些元素的属性是可变的,但有一部分是固定的,这种就可以模糊匹配
//[contains(@text, '查看')]
//[contains(@content-desc, '')]
//[contains(@resource-id, 'id属性')]
//[contains(@clsss, 'class属性')]
组合定位
当单个元素定位不唯一时,这时候我们就可以采用多个属性组合定位
若看到id 有多个,但是text 唯一,这个时候需要id + text 组合定位,比如定位通讯录示例代码如下
driver.find_element('xpath',"//*[@resource-id='com.tencent.wework:id/e0y'][@text='通讯录']")
driver.find_element('xpath','//*[contains(@resource-id, "com.tencent.wework:id/e0y") and @text="通讯录"]')
组合定位 通过xpath谓语 多条件 组合
层级定位
有时候我们遇见元素属性除了class属性,其他属性都为空,且class属性又不唯一,这时候一般方法就没办法进行定位了
a.父子关系定位
当一个元素父级唯一,子级不唯一,可以用此法, 如企业微信APP底部按钮的通讯录
driver.find_element('xpath','//*[@resource-id="com.tencent.wework:id/gwt"]//*[@text="通讯录"]')
如果一个元素它的子级时唯一的,父级不唯一,相反,可以用子定父
b.兄弟关系定位
通过子元素,先找到父元素,,在找父元素,再找父元素下的子元素,同样可以进行兄弟元素定位,
用到xpath 轴的知识
以企业微信app 的通讯录为例,经通过观察 xpath 可以由【消息】定位到【通讯录】
driver.find_element('xpath','//*[@text="消息"]/../../following-sibling::android.widget.RelativeLayout//*//*[@text="通讯录"]')
实际需要灵活运用
c.爷孙关系定位
如果一个元素的父级不唯一,但是父级的父级是唯一的,可以用这个来定位
self.driver.find_element('xpath','//*[@resource-id="com.tencent.wework:id/gwt"]/android.widget.RelativeLayout/android.widget.RelativeLayout//*[@text="通讯录"]')
一个元素往上找父级,找到唯一的一个父级后,在往下进行定位,根据实际情况来灵活使用
uiautomator定位元素
待续》》》
评论