XPath
一、简介
XPath,全称XML路径语言。
为什么要学习XPath?
- XPath相比CSS选择器的功能要更加强大,它的检索速度要稍快;
- XPath可以应用到:爬虫、App自动化测试
XPath的版本分为XPath 1和XPath 2,目前的浏览器只支持XPath 1。
XPath包括7种节点:
根节点、属性节点、元素节点、文档节点…
节点的分类:
- 父节点:一个节点的直接父节点
- 子节点:一个节点的直接子节点
- 先代节点:包含一个节点的所有节点
- 后代节点:一个节点的所包含的所有内部节点
- 同胞节点:同级节点
二、路径与元素节点
- 绝对路径:
/
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Edge()
wd.get('http://10.0.0.200:8080/woniusales/')
wd.find_element(By.XPATH, """/html/body/div/div/form/div[2]/input""").send_keys('admin')
- 相对路径:
//
# //form/div[2]/input
# //div[2]/input
# //input[@id='username']
# //*[@id="username"]
wd.find_element(By.XPATH, """//input[@id='username']""").send_keys('admin')
- 通配符:
*
# //*//div[2]/input
wd.find_element(By.XPATH, """//*[@id='username']""").send_keys('admin')
- 补充:在获取的Element对象中,再查找元素
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Edge()
wd.get('http://10.0.0.200:8080/woniusales/')
we = wd.find_element(By.XPATH, """//form/div[2]""")
print(we.get_attribute('outerHTML'))
""" 打印结果:
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" style="text-align: center; padding: 10px;">
<label for="username">请输用户名:</label>
<input type="text" id="username" class="form-control">
</div>
"""
we.find_element(By.XPATH, """//*[@id='username']""").send_keys('admin')
三、属性节点
id
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Edge()
wd.get('http://10.0.0.200:8080/woniusales/')
we.find_element(By.XPATH, """//*[@id='username']""").send_keys('admin')
container(@属性名,部分属性值)
:属性中包含属性值,相当于通配符
wd.find_element(By.XPATH, """//*[contains(@id,"name")]""").send_keys('admin')
starts-with(@属性名,属性值的开头)
wd.find_element(By.XPATH, """//*[starts-with(@id,'us')]""").send_keys('admin')
ends-with(@属性名,属性值的结尾)
:XPath 2中的语法,目前不能使用
四、节点次序
[序号]
:同名节点的序号,序号从1开始计算
wd.find_element(By.XPATH, """//form/*[2]""").send_keys('admin')
last()
:表示同名节点的最后一个
we = wd.find_element(By.XPATH, """//form/div[last()-4]/input""")
print(we.get_attribute('outerHTML'))
position()
:表示同名节点的位置,一般为值的范围
we = wd.find_elements(By.XPATH, """//form/div[position()>4]""")
for ele in we:
print(ele.get_attribute('outerHTML'))
position()
之后 可以跟=
、<
、<=
、>
、>=
五、组、父节点、同胞节点
|
:表示多个元素节点之间或的关系,用于连接完整的XPath
# 一句XPath在三个输入框中输入admin
we = wd.find_elements(By.XPATH, """//*[@id="username"]|//*[@id="password"]|//*[@id="verifycode"]""")
for i in we:
i.send_keys('admin')
..
:当前节点的父节点
# 一句XPath,先找到密码输入框,再查找用户名输入框
we = wd.find_element(By.XPATH, """//*[@id="password"]/../..//*[@id="username"]""")
and
:用于[]
表示多个属性和
的关系,多个条件同时满足
# 定位密码框
we = wd.find_element(By.XPATH, """//*[@type="password" and @class="form-control"]""")
print(we.get_attribute('outerHTML'))
or
:多个条件至少满足一个
# 同时找到用户名框和密码框
we = wd.find_elements(By.XPATH, """//*[@id="username" or @id="password"]""")
print(len(we))
for ele in we:
ele.send_keys('admin')
following-sibling
:当前节点的后续同胞节点
# 先找到form节点的第一个div,再查找用户名输入框
# //form/div[1]/following-sibling::div[1]/input
# //form/div[1]/following-sibling::div//*[@id="username"]
we = wd.find_element(By.XPATH, """//form/div[1]/following-sibling::div[1]/input""")
we.send_keys('admin')
preceding-sibling
:当前节点的前置同胞节点
# 先找到验证码框,再找用户名输入框
# //*[@id="verifycode"]/../preceding-sibling::div[2]/input
we = wd.find_element(By.XPATH, """//*[@id="verifycode"]/../preceding-sibling::div[2]/input""")
we.send_keys('admin')