Xpath的写法比较复杂,如果不经常使用,学会了一段时间后就会忘记。
博主初学时还是用的FireFox的2个小插件,后来谷歌浏览器自带“复制Xpath”功能,就更完全不会了。最近在学习一个例子“12306抢票”用到了Xpath,所有这里把学习到的知识记录下来。
网址:https://kyfw.12306.cn/otn/leftTicket/init,实现目标:
1.查询二等座有票的车次
2.打印车次名称
3.点击预定
首先,简单学习一下几个例子。
1.要定位到input输入密码这里,有几种写法
//form[@id="J_login_form"]/dl/dt/input[@id="J_password"]
1)如果从根目录开始,以/开始,比如/html;2)如果从中间开始,以双斜杠//开始;3)每个层级以单斜杠隔开;4)定位元素如果不唯一,需要用中括号[] 来进行精准描述定位
//form[@id="J_login_form"]//input[@id="J_password"]
使用双斜杠//,可以跨越多个层级填写元素,
//*[@id="J_login_form"]/*/*/input[@id="J_password"]
只要层级正确,可以使用*代替标签名称
2.要定位到退出
//a[contains(@href,"logout")]
使用模糊匹配,a标签里contains方法,href元素包含logout。
//a[starts-with(@rel,"nofo")]
这种方法很容易理解,以“nofo”开始的rel代码的a标签。
//a[contains(text(),"退出"]
根据文本关键词搜索
ends-with
结尾方法也可以。
现在可以进行本次的作业了。
网址:https://kyfw.12306.cn/otn/leftTicket/init,实现目标:
1.查询二等座有票的车次
2.打印车次名称
3.点击预定
查询有票的车次 //tbody[@id="queryLeftTable"]/tr/td[4][@class]
1)不是从/html开始,所以用双斜杠开始;
2)因为多个车次,我们选择二等座td[4];
3)td有2个条件,所以有2个[];
4)我们只选择有票的车次,查看有票和无票的代码区别,有票的包含class="yes" 或 class="t-num",前者是有大量票,后者是有部分数量的票。所有只要包含@class的td就是我们需要的内容。
打印上面的车次 //tbody[@id="queryLeftTable"]/tr/td[4][@class]/../td/div/div/div/a
1)前面的Xpath之前写过的
2)使用2个点..可以退回到父节点,即tr
3)3个div和a标签可以定位到车次,然后输出Xpath.text就可以找到车次名称
点击预定 //tbody[@id="queryLeftTable"]/tr/td[4][@class]/../td[13]/a
好了,就写到这里。说实话,不经常使用,真的容易忘记,建议可以经常使用CSS和Xpath来进行定位,因为其他都非常简单,而且CSS和Xpath也会用到id、name、text等。
大家加油,新年找到高薪工作。