本文是摘取的其他几个大神博客的内容,用自己的记录方式又记录的一次,参考的博客来自:
https://www.cnblogs.com/hanmk/p/8997786.html
https://www.cnblogs.com/odoo/p/4386694.html
https://www.cnblogs.com/haiya2019/p/10627731.html

一、XPath的用法介绍
1、div,前面没有任何的/ 或者 // 选择这个元素下的所有子节点(目前还没用到过)
2、/ 表示从根节点选取,/div 若路径起始于 / ,则此路径始终代表到某元素的绝对路径,从根开始
3、div/book,选取属于div的所有book子元素(目前还没用到过)
4、// 从匹配选择的当前节点开始,所有满足双斜线//之后规则的元素,无论层级关系及文档位置
5、div//book ,选取属于div的所有book元素,不管他们位于div之下的什么位置(目前还没用到)
6、//@class,选取名为class的所有属性
7、星号 匹配任何元素节点 /div/* 选取 div元素的所有子元素 (目前没用到)
8、/div 选择所有祖先元素的BBB元素(目前没用到)
9、 //
选取文档中的所有元素
10、@* 匹配任何属性节点 //title[@*] 选取所有带有属性的 title 元素
11、node() 匹配任何类型的节点(目前没用到)
12、可通过谓语,也就是属性值,来精确定位节点
(1)/div/book[1] 选取属于div子元素的第一个 book 元素
(2)/div/book[last()] 选取属于div子元素的倒数第一个 book 元素
(3)/div/book[last()-1] 选取属于div子元素的倒数第二个 book 元素
(4)/div/book[position() < 3] 选取最前面的两个属于div子元素的 book 子元素
(5)//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素
(6)//title[@lang=‘eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
(7)/div/book[price>35.00] 选取 div元素的所有 book 元素,且 price 元素值须大于 35.00
(8)/div/book[price>35.00]//title 选取div元素中的 book 元素的所有title元素, price大于 35.00
(9) 运算符 | 计算两个节点集
(10) + - *(乘) div(除) = != < <= > >= or (或) and(与) mod(计算除法的余数)
13、选取若干路径,使用 |
(1)//book/title | //book/price 返回 book 元素的所有 title 和 price 元素
(2)//title | //price 返回文档中的所有 title 和 price 元素
(3)/div/book/title | //price 返回属于div元素的book元素的所有title元素和 price 元素
14、normalize-space 函数去掉前后空格
选择含有属性name且其值(在用normalize-space函数去掉前后空格后)为’bbb’的div元素
//div[normalize-space(@name)=‘bbb’]

二、常用的xpath定位方法

1、利用标签内属性id、name、class进行定位 xpath = “//标签名[@属性=‘属性值’]”
Python+Selenium Xpath定位
currenrDr.find_element_by_xpath("//input[@id=‘username’])].click()
currenrDr.find_element_by_xpath("//div[@class=’*’])].click()
currenrDr.find_element_by_xpath("//div[@name=’
’])].click()

2、利用text()进行定位 xpath = “//标签名[text()=‘文字’]”
Python+Selenium Xpath定位
currentDr.find_element_by_xpath("//a[text()=“我的博客”]")).click()

3、利用contains()方法模糊定位 xpath = “//标签名[contains(@属性,‘属性值’)]”
Python+Selenium Xpath定位 currentDr.find_element_by_xpath("//a[contains(@href,“article”)]")).click()

4、如果一个元素无法通过自身属性直接定位到,可以先定位他的父及爷爷元素
Python+Selenium Xpath定位
currentDr.find_element_by_xpath("//form[@id=‘form’]/span[contains(@class,‘s_ipt_wr’)]/a[text()=‘按图片搜索’]").click()

5、如果一个标签的没有这个属性,或者一会儿有一会儿没有,可以用下面的方法
(1)没有class属性 currentDr.find_element_by_xpath("//a[not(@class)]")).click()
(2)没有class和id属性 currentDr.find_element_by_xpath("//a[not(@class) and not(@id)]"))
(3)没有class或id属性 currentDr.find_element_by_xpath("//a[not(@class) or not(@id)]"))
(4)什么属性都没有 currentDr.find_element_by_xpath("//a[not(*)]"))
(5)模糊定位,不包含某一值 currentDr.find_element_by_xpath("//a[not(contains(@class,‘ipt’)]"))
(6) 使用!= 页面有有2个button,但是一个的父目录是隐藏的一个是不隐藏的,隐藏的那个style的属性是style=‘display: none;’,展示出来的那个,只有style这个属性,后面没有值,现在获取展示出来的这个button,//div[@class=‘tab’ and @style!=‘display: none;’]//button[./span[text()=‘确定’]]

三、如何验证XPath
1、打开浏览器,右键,查看元素,切换到Elements页
2、选中下面的任意位置,ctrl+F,最下面会出现来一个“Find by string,selector,or XPath”的行
3、可以直接在这个搜索框中输入自己的xpath,以//开头,写的过程中,上面能匹配到的元素会标黄提示,在编辑框的右边会显示匹配到的总数,拿上面的//form[@id=‘form’]/span[contains(@class,‘s_ipt_wr’)]/span[text()=‘按图片搜索’] 在百度的首页试一下
Python+Selenium Xpath定位

相关文章: