[AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位

一、Appium元素定位的其他方式

1. name定位

使用:find_element_by_name('text属性值')
对于Android,根据name进行定位,即text属性
由于text稳定性不是很好,有的元素不能识别出text属性值,Appium1.5开始废弃了该方法

[AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位_第1张图片
未识别出text属性值

2. classname定位

使用:find_element_by_class_name('class类型')
classname定位是根据元素类型进行定位,但实际情况中很多元素的classname都是相同的,此时定位只会识别到第一个classname,一定程度上限制了classname定位的应用

如:某些APP登录界面中的用户名和密码输入框的class都为 android.widget.EditText

[AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位_第2张图片

3. 相对定位

相对定位:先找到该元素有对应属性的父元素节点,然后基于父元素进行元素定位

by_relative.py

from capability import driver

# 定位【注册】元素
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()

# 定位【添加头像】的父元素
root_element=driver.find_element_by_id('com.tal.kaoyan:id/activity_register_parentlayout')
# 定位到【添加头像】
root_element.find_element_by_class_name('android.widget.ImageView').click()
[AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位_第3张图片

4. xpath定位

xpath定位:一种路径定位方式,依赖元素绝对路径or相关属性定位,但绝对路径执行效率降低,建议采用相对路径和属性联合定位

关联:
Selenium WebDriver定位元素的9种方式及操作
Python数据清洗之XPath表达式、实践案例(商学院排名|贴吧图片)

xpath路径表达式

表达式 描述
/ 从根节点选取
// 从当前节点选择文档中的节点
nodename 选取对应节点的所有子节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

xpath匹配符

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
案例:

通过xpath定位识别进行登录APP

by_xpath.py

from capability import driver

# 根据控件类型的属性定位
username=driver.find_element_by_xpath('//android.widget.EditText[@text="请输入用户名"]')
username.send_keys('xxxxx')
# 联合多个属性定位
passsword=driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]')
passsword.send_keys('yyyyy')
# 根据具有唯一性的控件类型定位
lgBtn=driver.find_element_by_xpath('//android.widget.Button')
lgBtn.click()
# driver.find_element_by_xpath('//*[@class="android.widget.Button"]').click()

5. List定位

List定位:使用 find_elements_by_xxx 获取一组相同的class属性的元素,然后使用数组下标来区分标记不同元素来进行相关操作。通过List定位,可以解决其前相同的classname属性值元素无法定位区分的问题

测试案例
在新用户注册界面,点击添加头像按钮,选择指定的图片作为头像来保存

by_list.py

from capability import driver

# 点击【注册】按钮
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
# 定位【添加头像】按钮对应的元素
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_userheader').click()
# 定位待上传图片集(此处任一备选图片对应的id和class都一致),用数组接收
images=driver.find_elements_by_id('com.tal.kaoyan:id/iv_picture')
# 通过数组下标定位指定位置的图片
images[7].click()
# 点击【完成】图片选择
driver.find_element_by_id('com.tal.kaoyan:id/picture_tv_ok').click()
# 点击【√】确定选择图片
driver.find_element_by_id('com.tal.kaoyan:id/menu_crop').click()
[AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位_第4张图片
[AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位_第5张图片


二、List综合案例:用户注册

场景描述:
(1)进入注册界面,设置头像
(2)输入注册信息:用户名、密码、邮箱
(3)提交注册

kaoyan_register.py

from capability import driver
import random

# 点击【注册】按钮
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()

# 添加头像
# 定位【添加头像】按钮对应的元素
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_userheader').click()
# 定位待上传图片集(此处任一备选图片对应的id和class都一致),用数组接收
images=driver.find_elements_by_id('com.tal.kaoyan:id/iv_picture')
# 通过数组下标定位指定位置的图片
images[7].click()
# 点击【完成】图片选择
driver.find_element_by_id('com.tal.kaoyan:id/picture_tv_ok').click()
# 点击【√】确定选择图片
driver.find_element_by_id('com.tal.kaoyan:id/menu_crop').click()

# 填写用户信息
# 用户名
username='myyhm_'+str(random.randint(1000,9999))
print('username: %s' %username)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_username_edittext').send_keys(username)
# 密码
password='abc'+str(random.randint(10000,99999))
print('password: %s' %password)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_password_edittext').send_keys(password)
# Email
email='mydzyx_'+str(random.randint(100000,999999))+'@126.com'
print('email: %s' %email)
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_email_edittext').send_keys(email)

# 点击【立即注册】
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_register_btn').click()

你可能感兴趣的:([AP_09] Appium元素定位02:name| classname| xpath| List| 相对定位)