Xpath定位小结

Xpath语法堂

1.Xpath语法教程

2.Xpath通过文字匹配

contains()函数匹配
xpath=//*[@id=“backFeeManage”]//a[@class=“btn btn-primary” and contains(text(), “查询”)]

3.Xpath通过多层级定位

(1)多层级
xpath=//[@id=“schoolListWrapper”]/div[@class=“allSchool”]
(2)通过//符号匹配A层级下所有路径中B层级的元素,而不管他的位置
xpath=//
[@id=“carryOverManage”]//a[@id=“carryOverManage_carryOverSubmit”]

4.匹配需匹配元素的最后一个或倒数第二个

使用last()函数
xpath=(//[@id=“courseArrange_table”]/tbody/tr/td[10])[last()]
xpath=(//
[@id=“courseArrange_table”]/tbody/tr/td[10])[last()-1]

5.截取字符再匹配

例如xpath为这种的//*[@id=“dropdown-menu-4436”]/li[1],4436这个数字由于会随时变化,所以会导致元素定位不到,可用如下方法定位
PS:先截取固定字符串,然后通过last()函数获取最后一个(不是最后一个则不用last)
xpath=(//ul[starts-with(@id,“dropdown-menu”)])[last()]/li[1]
在这里插入图片描述
6.有时,我们定位元素时,元素位置可能会发生随机性的变化,比如列表中有两行数据,课程1和课程2,其价格分别是100和200,页面加载出来后,可能课程1在第一行,也可能在第二行,那么对应的价格也会随之变化,当你想要做效验课程1的价格为100元时,由于元素变化可能就会与预期结果不符,导致用例失败
那么如何通过课程名称来定位价格呢,如下所示:
在这里插入图片描述

原xpath:
//[@id=“carryOverManage”]//table/tbody//tr[2]/td[15]
匹配后的xpath:
//
[@id=“carryOverManage”]//table/tbody//tr[td//text()[contains(.,“课程1”)]]/td[15]
(先定位到行://*[@id=“carryOverManage”]//table/tbody//tr
然后定位这一行的文本信息:[td//text()[contains(.,“课程1”)]],text()获取所有文本,contains(.,“课程1”)中.表示匹配所有文本,然后再去匹配列/td[15])

7.xpath定位时间控件
(1)定位当前日期的后一天
(//*[@id=“copyArrageCourse_selectedDate_dp”]//table/tbody//td[@class=“dp-table-wday today”]/following-sibling::td)[1]
在这里插入图片描述
(2)XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:
1、child 选取当前节点的所有子元素
2、parent 选取当前节点的父节点
3、descendant 选取当前节点的所有后代元素(子、孙等)
4、ancestor 选取当前节点的所有先辈(父、祖父等)
5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
7、preceding-sibling 选取当前节点之前的所有同级节点
8、following-sibling 选取当前节点之后的所有同级节点
9、preceding 选取文档中当前节点的开始标签之前的所有节点
10、following 选取文档中当前节点的结束标签之后的所有节点
11、self 选取当前节点
12、attribute 选取当前节点的所有属性
13、namespace 选取当前节点的所有命名空间节点
(转载至:https://www.cnblogs.com/VseYoung/p/8686383.html)

(3)使用position()函数定位

from lxml import etree

html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <!--网页头部信息-->
    <title>网页名</title>
</head>
<body>
    <!--下面是网页正文-->
    <div class="two">id-text</div>
    <div class="one two">class-text</div>
    <div class="one">class-span</div>
    <div class="three">three</div>
</body>
</html>
'''

html =etree.HTML(html)
#取div位置大于2的 并且类包含three的
content1 = html.xpath("//div[position()>2 and contains(@class,'three')]/@class") 
print(content1)

遇到日期控件时,取明天日期:
可以
可以看到,今天日期的元素为:dp-table-wday today
周末元素为:dp-table-wwday
周一到周五为:dp-table-wday
那么,需要定位明天的日期,就需要先拿到图示所有日期,然后再利用position()>今天日期,取到大于今天的所有日期,然后再匹配大于今日日期的第一个即可
((//td[starts-with(@class,“dp-table-w”)])[position()>//td[contains(@class,“today”)]])[1]
或者
(//td[contains(@class,“today”)]/following::td[starts-with(@class,“dp-table-w”)])[1]

8.substring()方法
假设name属性值为(name=“off”)
xpath = “//*[substring(@name,2)=‘ff’]”
表示查找name属性值中,从第二个数到最后一个数是否等于ff

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值