UI自动化 Selenium元素定位与元素操作
元素定位
使用步骤
- 打开⾕歌浏览器
- 输⼊url
- 找元素及操作
- 关闭浏览器
八大定位方法
1、id
2、name
3、class
4、tag_name
5、link_text <a> 标签文本精准匹配
6、partial_link_text <a>标签文本模糊匹配
7、xpath
8、css
3.1 id定位
- ⽅法: driver.find_element_by_id("id值")
- 前置: 标签必须有id属性
- 输⼊⽅法: 元素.send_keys("内容"
3.2 name定位
- ⽅法: driver.find_element_by_name("name属性值")
- 前置: 标签必须name属性
- 特点: 当前⻚⾯可以重复
- 提示: 由于name属性值可以重复,所以使⽤时需要查看是否为唯⼀。
3.3 class定位
- ⽅法: driver.find_element_by_class_name("class属性值")
- 前置: 标签必须有class属性
- 特点: class属性值可以有多个值
- 说明:如果标签有多个class值,使⽤任何⼀个都可以。如:c1
3.4 tag_name定位
- 说明:根据的标签名进⾏定位
- ⽅法: driver.find_elemet_by_tag_name("标签名")
- 提示: 如果⻚⾯存在多个相同标签,默认返回第⼀个。
3.5 link_text定位
- 说明: 根据链接⽂本(a标签)定位
- ⽅法: driver.find_element_by_link_text("链接⽂本")
- 特点: 传⼊的链接⽂本,必须全部匹配,不能模糊
3.6 partial_link_text定位
- 说明: 根据链接⽂本(a标签)定位
- ⽅法: driver.find_element_by_partial_link_text("链接⽂本")
- 特点: 传⼊的链接⽂本,⽀持模糊匹配(传⼊局部⽂字)
3.7 扩展-查找⼀组元素
- 说明:返回列表格式,要使⽤需要添加下标或遍历。
- ⽅法: driver.find_elements_by_xxxx(),
- 提示: ⼋⼤元素定位⽅法,都可以使⽤⼀组元素定位,如果没有搜索到符合标签,返回空 列表。
总结
3.8 Xpath
3.8.1 使用场景
- 如果标签没有(id\name\class)3个属性,也不是链接标签,只能使⽤tag_name定位,⽐较麻 烦。
- ⽅便在⼯作⽤中查找元素,使⽤xpath和css⽐较⽅便(⽀持任意属性、层级)来找元素
3.8.2 基本介绍
- 说明:xpath是xml path简称,使⽤标签路径来定位。
- 绝对路径:从根⽬录开始,逐级查找标签。
- 相对路径:从任意层级开始,查找标签。
3.8.3 使用策略
⽅法: driver.find_element_by_xpaht("表达式")
1、路径
2、属性
3、属性与逻辑(多个属性)
4、属性与层级(路径)
属性
- 单属性: //*[@属性名='属性值']
- 多属性: //*[@属性名='属性值' and @属性名='属性值']
- 提示:可以使⽤任何属性。
层级与属性
- 说明: 如果元素现有的属性不能唯⼀匹配,需要结合层级使⽤
语法: - //⽗标签/⼦标签 必须为直属⼦级
- //⽗标签[@属性='值']
- //后代标签 ⽗和后代之间可以跨越元素
扩展
- 根据显示⽂本定位: //*[text()='⽂本值']
- 属性值模糊匹配: //*[contains(@属性名,'属性部分值')]
css选择器
策略
1、id选择器
2、类选择器
3、标签选择器
4、属性选择器
5、层级选择器
id选择器
- 语法: #id属性值
- 前置: 标签必须id属性
类选择器
- 语法: .class属性值
- 前置: 标签必须class属性
标签选择器
- 语法: 标签名
- 提示: 注意标签是否在⻚⾯中唯⼀,否则返回单个或所有
属性选择器
- 语法: [属性名='属性值']
- 说明: 标签任意属性都可以
- 案例
# ⽤户名 id选择->#id属性值
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 密码 属性选择器->[属性名='属性值']
driver.find_element_by_css_selector("[name='passwordA']").send_keys("123456")
# 电话 类选择器->.class属性值
driver.find_element_by_css_selector(".telA").send_keys("18600000000")
# 确定 标签选择器-标签名
sleep(2)
driver.find_element_by_css_selector("button").click()
层级选择器
- ⽗⼦关系: 选择器>选择器 如: #p1>input
- 后代关系: 选择器 选择器 如: #p1 input
- 提示: 选择器使⽤任何⼀种css选择器(id选择器、类选择器、属性选择器、标签选 择器)都可以
find_element
说明: ⼋种元素定位⽅法底层使⽤的查找元素⽅法都是find_element,通过By不同的值区 分定位⽅式 实例:
"""
⽬标:讲解find_element使⽤
场景:后期项⽬封装中,使⽤元素查找⽅法
⽬的:对后期封装元素查找⽅法
"""
driver.find_element(By.ID,"userA").send_keys("admin")
driver.find_element(By.NAME,"passwordA").send_keys("123456")
driver.find_element(By.CLASS_NAME,"telA").send_keys("18600000000")
sleep(2)
driver.find_element(By.TAG_NAME,"button").click()
元素定位总结
结论:
1、⾸推css定位,原因执⾏速度快。
①如果有ID属性,使⽤#id
②没有id属性,使⽤其他有的属性(能代表唯⼀的属性)
③如果属性都带不了唯⼀,使⽤层级
2、如果css解决不了,使⽤xpath。
常⽤操作⽅法
元素=driver.find_element()
- 点击:元素.click()
- 输⼊:元素.send_keys(内容)
- 清空:元素.clear()
获取元素信息
- 获取⼤⼩: 元素.size
- 获取⽂本: 元素.text
- 获取属性: 元素.get_attribute('属性名')
- 元素是否可⻅: 元素.is_displayed()
- 元素是否可⽤: 元素.is_enabled()
- 元素是否选中: 元素.is_selected()
- 案例
# 获取⼤⼩ 元素.size
user = driver.find_element(By.CSS_SELECTOR,"#userA").size
print("⽤户名输⼊框的⼤⼩:",user)
# 获取内容 元素.text
a_text = driver.find_element(By.TAG_NAME,"a").text
print("第⼀个a标签的⽂本:",a_text)
# 获取属性 超连接地址
a_href = driver.find_element(By.TAG_NAME,"a").get_attribute("href")
print("第⼀个a标签的链接:",a_href)
# 判断span标签是否可⻅ 元素.is_displayed
span = driver.find_element(By.TAG_NAME,"span").is_displayed()
print("span是否可⻅:",span)
# 判断取消按钮是否可⽤ is_enabled
btn_is_enabled = driver.find_element(By.CSS_SELECTOR,"#cancelA").is_enabled()
print("取消按钮是否可⽤:",btn_is_enabled)
# 旅游是否选中 is_selected
is_selected = driver.find_element(By.CSS_SELECTOR,"#lyA").is_selected()
print("旅游是否被选中:",is_selected)