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