一、Appium元素定位的其他方式
1. name定位
使用:find_element_by_name('text属性值')
对于Android,根据name进行定位,即text属性
由于text稳定性不是很好,有的元素不能识别出text属性值,Appium1.5开始废弃了该方法
![](https://img.haomeiwen.com/i4866277/e1d312acd7e1f425.png)
2. classname定位
使用:find_element_by_class_name('class类型')
classname定位是根据元素类型进行定位,但实际情况中很多元素的classname都是相同的,此时定位只会识别到第一个classname,一定程度上限制了classname定位的应用
如:某些APP登录界面中的用户名和密码输入框的class都为 android.widget.EditText
![](https://img.haomeiwen.com/i4866277/c4a8c7144a101571.png)
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()
![](https://img.haomeiwen.com/i4866277/64def2854113df3b.png)
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()
![](https://img.haomeiwen.com/i4866277/a34a47e6d229460a.png)
![](https://img.haomeiwen.com/i4866277/535b7209a19147d3.png)
二、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()
网友评论