1
使用 find_element_by_xxx(value)形式定位元素
1.使用 find_element_by_id(id)方法定位元素
格式:_element_by_id('resource-id')。
用法:通过元素 id 来查找元素。
示例代码如下。
_element_by_id(':id/digit8')
_element_by_id(':id/op_clr')
这里元素 id 和 UIAutomatorView 中该元素的 resource id 是一致的。
2.使用 find_element_by_accessibility_id(id)方法定位元素
格式:_element_by_accessibility_id("accessibility_id")。
用法:UIAutomator Viewer 界面上并没有这个字段,这个对应的字段是 content-desc,
根据唯一 id 定位,即 contend-desc 的值。如果要查询的界面元素的 content-desc 在当前界
面唯一,则可以使用此方法。
示例代码如下。
_element_by_accessibility_id("delete")
这里的 accessibility id 跟 UIAutomatorView 中该元素的 content-desc 是一致的。
3.使用 find_element_by_name(name)方法定位元素
格式:_element_by_name(name)。
用法:通过元素 name 来定位元素。这只适用于 webview 容器中的 HTML 页面,继承
自 webdriver,与 PC 版本的 UI 测试一致。
示例代码如下。
_element_by_name("Create a new contact")
这里的 name 跟 UIAutomatorView 中该元素的 Text 是一致的。
需要注意的是,最好不要用这种定位方法,因为 Appium 已经不建议使用通过
name 进行定位的方式。
使用 find_element_by_tag_name(name)方法可以定位 tag 标识对应的元素。
4.使用 find_element_by_class_name(name)方法定位元素
格式:_element_by_class_name('class')。
用法:通过元素 class name 来定位元素,即 class 的值。
示例代码如下。
_element_by_class_name("")
_element_by_class_name("")
这里的 class name 与 UIAutomatorView 中该元素的 class 是一致的。
需要注意的是,由于 class name 不是唯一的,所以可能存在一个页面上有多个元素具
有相同的 class name。如果我们要查找某种类型的界面元素,且该类型界面元素在当前界
面中只有一个,则可以使用此方法。
5.使用 find_element_by_xpath(xpath)方法定位元素
XPath(XML Path Language)是对 XML 中的元素进行元素定位的一种语言,它可适
用 XML 标记语言、HTML 标记语言、app Dom 结构。XPath 是自动化工具的定位基础,可
适用于 Selenium 工具、Appium 工具、Appcrawler 工具。任何一个元素都可以通过 XPath
进行定位。
软件测试任务驱动教程
2
格式:_element_by_xpath("//元素类型[@属性='value']")。
用法:通过元素 xpath 的值来定位元素。
示例代码如下。
_element_by_xpath("//[@text='8']")
_element_by_xpath("//")
_element_by_xpath("//*[@class='']")
_element_by_xpath("//*[contains(@text,'通讯录')]") #精确匹配
_element_by_xpath("//*[contains(@content-desc,'通')]") #模糊匹配
_element_by_xpath("//*[@text='通讯录']")
_element_by_xpath("//*[@resource-id=':id/b09']")
如果元素 id 不唯一,text 唯一,这个时候需要 id + text 组合定位,例如定位通讯录示
例代码如下。
_element_by_xpath("//*[@resource-id=':id/e0y'][@text='通讯
录']")
XPath 的常用方法如下。
①nodename:选取此节占的所有子节点。
①/:从根节点选取。
①//:从匹配选择的当用节点选择文档中的节点,而不考虑它们的位置。
①.:选取当前节点。
①..:选取当前节点的父节点。
①@:选取属性。
(1)XPath 的模糊定位技巧
contains( )方法是模糊匹配的定位方法,如果一个元素的属性不固定,就可以模糊匹
配。示例代码如下。
_element(,'//*[contains(@text, "注册")]')
_element(,'//*[contains(@content-desc, "搜索")]')
_element(,'//*[contains(@resource-id, "login_phone")]')
(2)XPath 组合定位技巧
通过 XPath 可以同时匹配 2 个甚至多个属性来完成元素定位。这里常用的属性有
text、resource-id、class、index、content-desc 等,这些属性可以任意组合完成定位,示例代
码如下。
_element( ,'//*[@text="我的" and @resource-id="tab_name"]').click()
_element( ,'//*[@text="注册/登录" and @index="1"]').click()
(3)XPath 层级定位
通常定位元素的时候可能会涉及到通过子元素去定位父元素,或者通过父元素定位子
元素或定位兄弟元素,XPath 支持父子关系、兄弟关系元素的查找,示例代码如下。
# 通过子元素定位父元素
# 方法一:..
_element_by_xpath( '//*[@text="手机号"]/..').tag_name
# 方法二:parent::*
_element_by_xpath( '[@text="手机号"]/parent::*').tag_name
#通过父元素定位兄弟元素
_element_by_xpath( '//*[@text="手机号"]/../li' ).tag_name
6.使用 find_element_by_android_uiautomator(uia_string)方法定位元素
3
格式:_element_by_android_uiautomator("text(\"中文内容\")")。
用法: 及之后的版本废弃了 name 属性,例如 name=百度一下,需要使用
uiautomator 的定位方式来进行定位,即使用 text 的内容。
示例代码如下。
_element_by_android_uiautomator('new UiSelector()
.resourceId(":id/digit8")')
_element_by_android_uiautomator ("text(\"百度一下\")")
需要确认这个中文是当前页面唯一值,否则还是定位不到。
7.通过 css_selector 定位(webview)
格式:find_element_by_css_selector(css_selector)。
用法:只适用于 webview 的 HTML 页面,继承自 webdriver,与 PC 版本的 UI 测试一
致。
示例代码如。
_element_by_css_selector()
8.通过 link_text 定位(webview)
格式:find_element_by_link_text(link_text)。
用法:只适用于 webview 容器中的 HTML 页面,继承自 webdriver,与 PC 版本的 UI
测试一致。
示例代码如下。
_element_by_link_text()
使用 find_element_by_partial_link_text(link_text)方法可以通过部分链接文本进行定位。