Web自动化-05-XPath

XPath

一、简介

XPath,全称XML路径语言。

为什么要学习XPath?

  • XPath相比CSS选择器的功能要更加强大,它的检索速度要稍快;
  • XPath可以应用到:爬虫、App自动化测试

XPath的版本分为XPath 1和XPath 2,目前的浏览器只支持XPath 1。

XPath包括7种节点:

根节点、属性节点、元素节点、文档节点…

节点的分类:

  1. 父节点:一个节点的直接父节点
  2. 子节点:一个节点的直接子节点
  3. 先代节点:包含一个节点的所有节点
  4. 后代节点:一个节点的所包含的所有内部节点
  5. 同胞节点:同级节点

二、路径与元素节点

  • 绝对路径:/
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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值