目录
2.1.6 partial_link_text模糊定位:【推荐】
2.1元素定位方式
元素定位依赖于:
- 标签名
- 属性
- 层级
- 跨径
定位方式:
- id
- name
- class_name(使用元素的class属性定位)
- tag_name(标签名称<标签名...>)
- link_text(定位超链接a标签)
- partial_link_text(定位超链接a标签 模糊)
- xpath(基于元素路径)
- css(元素选择器)
汇总:
- 基于元素属性特有定位方式(id/name/class_name,selenium单独提供定位方法)
- 基于元素标签名称定位:tag_name(定位a标签(超链接:文本可点击跳转)
- 定位超链接文本(link_text,pattial_link_text)
- 基于元素路径定位(xpath)
- 基于选择器(css)
2.1.1 id定位说明:
说明:一般情况下唯一
方法:driver.find_element(By.ID, "userA").send_keys("admin")
前提:元素必须有id属性
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 获取 浏览器对象
diver=webdriver.Chrome()
# 打开 Url
diver.get(url=r"D:\test\资料\注册A.html")
# 查找 用户名元素
username = driver.find_element(By.ID, "userA")
# 查找 密码元素
password = driver.find_element(By.ID, "passwordA")
# 用户名输入 admin
username.send_keys("admin")
# 密码输入 123456
password.send_keys("123456")
sleep(3)
diver.quit()
注意:斜杠\是本地路径用的
反斜杠/是浏览器用的,这里直接用反斜杠会报错
可用:
- url = r"D:\test\资料\注册A.html" (r:修饰的字符串,如果字符串中有转义字符,不进行转义使用
- url = "D:\\test\\资料\\注册A.html" (使用双反斜杠,进行转义操作
- url = "file:///D:/test/资料/注册A.html"
tips: 赋值浏览器路径,乱码但可执行,浏览器可自动识别
不可用:
- url = "D:/test/资料/注册A.html"
扩展:
可查找元素后直接输入
# 查找元素 用户名 并输入admin
driver.find_element(By.ID, "userA").send_keys("admin")
# 查找元素 密码框 并输入123456
driver.find_element(By.ID, "passwordA").send_keys("123456")
2.1.2 name定位:
说明:一般情况下有多个 ,可以重名
方法:driver.find_element(By.NAME, "userA").sent_keys("admin")
前提:元素必须有name属性
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开url
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 查找元素 用户名 并输入admin
driver.find_element(By.NAME, "userA").send_keys("admin")
# 查找元素 密码框 并输入123456
driver.find_element(By.NAME, "passwordA").send_keys("123456")
# 等待三秒
sleep(3)
# 关闭浏览器驱动对象
driver.quit()
2.1.3 class_name定位:
方法:driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")
注意:标签名可以有多个
# 查找元素 用户名 并输入admin
driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")
以上为基于元素属性^
以下为基于标签属性v
2.1.4 tag_name定位:
通过标签名:
说明:当有多个标签名的时候,默认返回符合要求的第一个标签
方法:driver.find_element(By.TAG_NAME, "input").send_keys("admin")
注意:标签名可以有多个,存在多个标签,默认返回第一个
# 使用标签名tag_name input定位用户名并输入admin
# 注意:页面中如果存在多个相同的标签名,默认返回第一个
driver.find_element(By.TAG_NAME, "input").send_keys("admin")
2.1.5 link_text定位:
说明:只能定位超链接标签,只能精准匹配
方法:driver.find_element(By.LINK_TEXT, "访问 新浪 网站").click()
注意:标签为大段文字时不适合
# link_text:只能定位a标签;定位的内容必须为全部匹配
driver.find_element(By.LINK_TEXT, "访问 新浪 网站").click()
# driver.find_element(By.LINK_TEXT, "访问").click() //这个情况下报错,必须为全部匹配
2.1.6 partial_link_text模糊定位:【推荐】
说明:定位超链接标签,可以使用精准和模糊匹配,模糊匹配最好使用具有唯一标志性的关键词
(需要唯一代表性,否则默认返回符合操作的第一个,也可以使用完全匹配)
方法:driver.find_element(By.PARTIAL_LINK_TEXT, "访问").click()
注意:无法代表唯一性时不准确
# partial_link_text:只能定位a标签;定位的内容可以模糊部分内容,但是必须能代表唯一性
driver.find_element(By.PARTIAL_LINK_TEXT, "访问").click()
# driver.find_element(By.PARTIAL_LINK_TEXT, "新浪").click() //默认返回匹配的第一个
2.1.7 XPATH
- 为什么使用XPATH和css 定位:
- id,name,class依赖于这三个元素对应的属性,如果元素没有以上三个属性,定位方法不能使用
- link_text和partial_link_text只适合超链接
- tag_name:只能找页面唯一元素,或者多个相同元素中的第一个元素
- XPath()基于元素的路径:(xml 和path 简称)XML主要是数据的存储和传递,HTML重点在数据的显示,CSS重点是元素的样式
XPATH定位策略:(是一种标记语言,后缀.xml)
方法:driver.find_element(By.XPATH, "//p[@id = 'p1']/input").send_keys("admin")
-
路径定位:
-
绝对路径:以单斜杠开头逐级开始,不能跳级如:/html/body/form/div/fieldset/p[2]/input
#单斜杠开头 driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[2]/input").send_keys("12345")
-
相对路径:以双斜杠开头,双斜杠后面跟元素名称,不知元素名称可以使用*代替
如://p[@id = 'login-T2']/input 与 //*[@id = 'login-T2']/input 效果相同。
注意:使用*时检索速度慢
-
-
路径结合属性:
语法:在Xpath中,所有属性必须使用@符合修饰 如://*input[@id=id值]
注意:在XPATH终所有属性都要加上@ -
路径结合逻辑(多个属性):
语法://*[@id="id值" and @属性值="属性值"] -
路径结合层级:
语法://*[@id='父级id属性值'] / input
driver.find_element(By.XPATH, "//p[@id = 'p1']/input").send_keys("admin")
提示:
- 一般见识使用指定标签名称,不使用*代替,效率比较慢
- 无论是绝对路径和相对路径,/后面必须为元素的名称或者*
- 扩展:在工作中,如果能使用相对路径绝对不使用绝对路径
语法:
driver.find_element_by_xpath(xpath).send_keys()
练习:
需求:
打开注册A.html页面,完成以下操作1).使用绝对路径定位用户名输入框,并输入:admin
2).暂停2秒
3).使用相对路径定位密码输入框,并输入:123
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 获取浏览器对象
driver = webdriver.Chrome()
# 获取地址
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 使用绝对路径定位用户名输入框,并输入:admin
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[1]/input").send_keys("admin")
# 暂停2秒
sleep(2)
# 使用相对路径定位用户名输入框,并输入:123
driver.find_element(By.XPATH, "//p[2]/input").send_keys("123")
# 暂停三秒
sleep(3)
# 退出
driver.quit()
扩展:
- //*[text()="文本内容"] 根据文本内容查找
一般适合p标签,a标签
如://a[text()="访问 新浪 网站"] - //*[contains(@type,"word")] 属性中含有xxx的元素
contains为关键字,不可更改
- //*[starts-with(@id,"pass")] 以xxx开头的元素
stars-with为关键字,不可更改
2.1.8css定位方法:
- css是一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须找到元素,在css标记语言中使用css选择器
- css定位就是通过css选择器工具进行定位
- 极力推荐,查找效率高,语法比xpath更简单
方法:element = driver.find_element(By.CSS_SELECTOR,"span").text
css定位常用策略:
- id选择器
- class选择器
- 元素选择器
- 属性选择器
- 层级选择器
id选择器:
前提:元素必须有id属性
语法 #id 如:#password
class选择器:
前提:元素必须有class属性
语法 .class 如:.class
元素选择器:
语法:element 如:input
属性选择器:
语法:[属性名=属性值]
层级选择器:
语法:
1.p>input
2.p input
提示:>与空格的区别,使用大于号时后面必须为子元素,空格则不用
练习:
- 使用css id选择器 定位用户名 输入admin
- 使用css 属性选择 定位密码框 输入123456
- 使用css class 选择器 定位电话号码: 18611112222
- 使用css 元素选择器 定位span标签获取文本值
- 使用层级选择器 定位email 输入 123@qq.com
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 获取浏览器对象
driver = webdriver.Chrome()
# 获取地址
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 使用css id选择器 定位用户名 输入admin
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")
# 使用css 属性选择器 定位密码框 输入123456
driver.find_element(By.CSS_SELECTOR, "[name ='passwordA']").send_keys("123456")
# 使用css class选择器 定位电话号码:18611112222
driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18611112222")
# 使用css 元素选择器 定位span标签获取文本值
span = driver.find_element(By.CSS_SELECTOR, "span").text
print("获取的span标签文本值:", span)
# 使用层级选择器 定位email 输入123@qq.com
driver.find_element(By.CSS_SELECTOR, 'p[type="emailA"]').send_keys("123@qq.com")
# 暂停三秒
sleep(3)
# 退出
driver.quit()
扩展:[了解]
1.[属性^='开头的字母'] #获取指定属性以指定字母开头的元素
2.[属性$='结束的字母'] #获取指定属性以指定字母结束的元素
3.[属性*='包含的字母'] #获取指定属性中包含指定字母的元素
# 开头 定位用户名 输入admin
driver.find_element(By.CSS_SELECTOR, "[name^='us']").send_keys("admin")
# 结束 定位密码框 输入123456
driver.find_element(By.CSS_SELECTOR, "[name$='dA']").send_keys("123456")
# 包含 定位电话号码:18611112222
driver.find_element(By.CSS_SELECTOR, "[class*='el']").send_keys("18611112222")
工具:
可复制Xpath路径以及CSS路径,但不推荐使用,路径长且不一定唯一定位
2.1.9 定位一组元素:
方法:driver.find_elements(By.CSS_SELECTOR,"span")
返回结果:类型为列表,要对列表进行访问和操作必须指定下标或进行遍历[ 下标从0开始]
示例1:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = r"D:\test\资料\注册A.html"
driver.get(url)
# 获取所有input元素,列表形式
elements = driver.find_elements(By.TAG_NAME, "input")
print(len(elements))
print("element的类型为:", type(elements))
sleep(3)
driver.quit()
输出:
示例2:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = r"D:\test\资料\注册A.html"
driver.get(url)
elements = driver.find_elements(By.ID, "userA")
# 输入内容
# 第一种:通过下标访问
# elements[0].send_keys("admin")
# 第二种:通过遍历来输入
for el in elements:
el.send_keys("admin")
sleep(3)
driver.quit()