接上一篇:https://blog.csdn.net/xiao66guo/article/details/98736536
5、xpath 定位
xpath 定位其实就是一中路径定位方式,它主要是依赖于元素的绝对路径或者一些相关属性来进行定位的,但是绝对路径 xpath 的执行效率比较低(尤其是当元素路径比较深的时候),一般使用的比较少。通常使用的是 xpath 的相对路径和属性定位。
在xpath中,有 7 中类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。
5.1 xpath 的路径表达式
表达式 | 描述 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不用考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
nodename | 选取此节点的所有子节点 |
@ | 选取属性 |
5.2 xpath 通配符
通配符 | 描述 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
5.3 xpath 语法参考
5.4 xpath 案例:
使用 xpath 定位元素来进行登录操作
from capability import *
driver.find_element_by_xpath('//android.widget.EditText[@text="手机号/email"]').clear()
driver.find_element_by_xpath('//android.widget.EditText[@text="手机号/email"]').send_keys('手机号/邮箱')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="1"]').send_keys('密码')
driver.find_element_by_xpath('//*[@class="android.widget.CheckBox"]').click()
driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @index="2"]').click()
6、List 定位
List 定位首先是使用 find_elements_by_XX 来获取一组相同的class属性的元素,而后在使用数组下标来区分表级不同元素进行相关的操作。
-
List 定位综合案例
启动 豌豆荚app ,进入登录页面输入用户名和密码后进行用户头像更新
- 测试场景
- 启动豌豆荚app
- 点击左上角主菜单导航—>管理—>右上角 设置
- 点击登录,进入到登录页面
- 输入用户名、密码并点击页面下方同意复选框,点击登录
- 点击头像—>账号管理—>再次点击头像—>修改个人资料
- 点击头像—>选择 从图库中选择—>进入图库—>选择头像
- 点击保存按钮进行保存操作
- wdj_list.py
// capability 的文件内容可以看上一篇文章哈
from capability import driver
// 登录
def login():
// 点击左上角的主菜单导航按钮
driver.find_element_by_id('com.wandoujia.phoenix2:id/w4').click()
driver.implicitly_wait(1)
// 点击
driver.find_element_by_id('com.wandoujia.phoenix2:id/pp_item_setting').click()
// 点击又上角的设置按钮
driver.find_element_by_id('com.wandoujia.phoenix2:id/ow').click()
// xpath 定位
driver.find_element_by_id('com.wandoujia.phoenix2:id/l_').clear()
driver.find_element_by_xpath('//android.widget.EditText[@text="手机号/email"]').send_keys('[email protected]')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="1"]').send_keys('2932104943qq')
driver.find_element_by_xpath('//*[@class="android.widget.CheckBox"]').click()
driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @index="2"]').click()
// 更换头像
def revise_user_photo():
// 点击头像——>账号管理
driver.find_element_by_id("com.wandoujia.phoenix2:id/nr").click()
// 点击头像——>修改个人资料
driver.find_element_by_id("com.wandoujia.phoenix2:id/ll").click()
// 点击头像——>选择头像列表
driver.find_element_by_id("com.wandoujia.phoenix2:id/ll").click()
// 点击从图片库中选择
driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @index="1"]').click()
/* 在图库中选择图片
List定位:
一定注意,这里选择是的 find_elements_by_id ,element 后面有一个 s 代表有多个的意思
*/
items_list = driver.find_elements_by_id('com.android.documentsui:id/icon_thumb')
items_list[0].click()
driver.implicitly_wait(1)
// 点击保存
driver.find_element_by_class_name('android.widget.Button').click()
if __name__ == '__main__':
login()
revise_user_photo()
-
List 定位综合案例效果图
-
遇到的问题
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the
given search parameters.
# 解决方法,就是检查下元素的 id 值有没有写错
7、UIAutomator 定位
UIAutomator 元素定位就是 Android 系统原生的定位方式,看起来和 xpath 很类似,但比起它更加好用,且还支持元素全部属性定位,它的这个定位是通过 Android 自带的 Android uiatuomator 的类库去查找元素的。Appium 元素定位的方法其实也是基于 UIAutomator 来进行封装的。
使用的方法: find_element_by_android_uiautomator() 可以运用UIAutomator 元素定位。
-
UIAutomator 定位的方式:
- id 定位
- text 定位
- class name 定位
① id 定位:是根据元素的 resource-id 属性来进行定位的,使用 UiSelector().resourceId() 这个方法即可实现
from capability import *
/*
使用UIAutomator中的 id 定位方式
*/
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/w5")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/pp_item_setting")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/ow")').click()
② text 定位:是根据元素的 text 属性值来进行定位的,使用 new UiSelector() 即可实现
/*
使用UIAutomator中的 id 定位方式,先清除输入框中内容
*/
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/l_")').clear()
/*
使用UIAutomator中的 text 定位方式
*/
driver.find_element_by_android_uiautomator('new UiSelector().text("手机号/email")').send_keys('手机号或者邮箱')
③ class name 定位:与 Appium class 定位方式一样,都是根据元素的 class 属性值来进行定位的
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/la")').send_keys('2932104943qq')
/*
使用UIAutomator中的 class name 定位方式
*/
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.CheckBox")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/mf")').click()