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" )

image-1657001984239

content-desc定位

通过accessibility_id定位元素,对应【content-desc】属性

  • 使用方法 find_element(By.ACCESSIBILITY_ID, " ")

  • 元素的content-desc属性
    content-desc属性是用来描述该元素的作用,一般都是为空

find_element(By.ACCESSIBILITY_ID, "天猫超市")

image-1657001838416

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谓语 多条件 组合
image

层级定位

参考

有时候我们遇见元素属性除了class属性,其他属性都为空,且class属性又不唯一,这时候一般方法就没办法进行定位了

a.父子关系定位

当一个元素父级唯一,子级不唯一,可以用此法, 如企业微信APP底部按钮的通讯录
image

image

driver.find_element('xpath','//*[@resource-id="com.tencent.wework:id/gwt"]//*[@text="通讯录"]')

如果一个元素它的子级时唯一的,父级不唯一,相反,可以用子定父

b.兄弟关系定位

通过子元素,先找到父元素,再找父元素,再找父元素下的子元素,同样可以进行兄弟元素定位,
用到xpath 轴的知识
image

以企业微信app 的通讯录为例,经通过观察 xpath 可以由【消息】定位到【通讯录】

image

driver.find_element('xpath','//*[@text="消息"]/../../following-sibling::android.widget.RelativeLayout//*//*[@text="通讯录"]')

该定位语句的作用是在一个 Android 应用程序中查找一个名为“通讯录”的元素,其父级元素为一个名为“消息”的文本元素所在的 RelativeLayout 元素的兄弟元素中的所有子元素中。

实际需要灵活运用

c.爷孙关系定位

如果一个元素的父级不唯一,但是父级的父级是唯一的,可以用这个来定位

image

self.driver.find_element('xpath','//*[@resource-id="com.tencent.wework:id/gwt"]/android.widget.RelativeLayout/android.widget.RelativeLayout//*[@text="通讯录"]')

一个元素往上找父级,找到唯一的一个父级后,在往下进行定位,根据实际情况来灵活使用

uiautomator定位元素

待续》》》