序言:
前面介绍了利用浏览器的debug工具获取xpath地址,但是这个工具不是万能的,有时候直接复制粘贴会定位不到。这个时候就需要自己手动去写xpath路径了。接下来将详细讲解xpath的常用语法。
一、xpath的基本概念和基本语法
可上菜鸟教程和w3cschool查看相关资料:http://www.runoob.com/xpath/xpath-tutorial.html、http://www.w3school.com.cn/xpath/index.asp
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
二、下面我们开始介绍xpath的一些常用定位方法
语法:xpath = "//标签名[@属性='属性值']"
1. 属性定位
(1)通过id属性定位
driver.find_element_by_xpath('//*[@id="kw"]')
(2)通过name属性定位
element = driver.find_element_by_xpath('//*[@name="wd"]')
(3)通过class属性定位
element = driver.find_element_by_xpath('//*[@class="s_ipt"]')
(4)通过文本信息定位或autocomplete属性等定位。
element = driver.find_element_by_xpath('//*[@autocomplete="off"]')# 通过autocomplete属性定位
element = driver.find_element_by_xpath('//*[text()="hao123"]')# 通过文本信息定位
(5)属性判断条件中最常见为id,name,class等等,属性的类别没有特殊限制,只要能够唯一标识一个元素即可。当然在属性不唯一的时候,如果采取多个条件组合的方式能达到唯一也可以。xpath的逻辑运算可以支持与(and)、或(or)、非(not),以下代码以and作为例子:
element = driver.find_element_by_xpath('//*[@id="kw" and @autocomplete="off"]')
注释:与(and):A and B,即既满足A条件同时也满足B条件才成立,比如,上面用例中的@id="kw" and @autocomplete="off",只有当id为“kw”,并且autocomplete为“off”时才可定位到。
或(or): A or B,只要满足A条件或者满足B条件就可成立,即A和B两个条件只要满足其中一个就成立。
非(not):not A,只要不满足A条件就成立。
2. 标签定位
有时候同一个属性,同名的比较多,这时候可以通过标签筛选,定位更精准一点。这个时候我们可以结合上面的xpath路径基本语法进行定位,比如常用到的/号表示从根节点开始,//号表示从匹配到的元素作为开始节点,用*号表示任意标签等,以下均以定位hao123为例。
(1)/号表示从根节点开始定位, 其中[N]表示跟它的标签一样兄弟元素的第N个(注意:Xpath的索引是从1开始,不同于python语法的索引从0开始)
element = driver.find_element_by_xpath("/html/body/div/div/div[3]/a[2]")# 从根路径开始定位,其中div[3]表示此用例中/html/body/div/div/路径下的第3个div标签。
注释:一个元素无法通过自身属性直接定位到,则可以先定位它的父(或父节点的父节点,即它爷爷)元素,然后再找下一级即可,比如以上用例的body节点,它的父节点即为html。
(2)//号表示从匹配选择的当前节点开始定位
# 以下两个定位方法均可定位到hao123,放两个例子只是为了强调元素属性可在xpath路径任意节点添加。
element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]")# 从满足id为“s-top-left”的div标签开始定位。
element = driver.find_element_by_xpath("//a[text()='hao123']")# 从满足文本信息为“hao123”的a标签定位。
(3)*号表示从匹配选择的当前节点开始定位
# 以下两个定位方法均可定位到hao123,放两个例子只是为了强调*可表示xpath路径的任意节点。
element = driver.find_element_by_xpath("//div/*[text()='hao123']")# 定位文本信息为“hao123”的所有元素。
element = driver.find_element_by_xpath("//*[text()='hao123']")# 定位文本信息为“hao123”的所有元素。
3. 模糊匹配定位
模糊匹配功能非常强大,掌握了模糊匹配功能,基本上没有定位不到的。以下为模糊定位的常用方法:
# xpath语法支持模糊匹配某个属性 element = driver.find_element_by_xpath("//a[contains(text(),'ao12')]") element = driver.find_element_by_xpath("//*[contains(@id,'kw')]") # xpath语法支持模糊匹配以什么开始的 element = driver.find_element_by_xpath("//a[starts-with(text(),'hao12')]") element = driver.find_element_by_xpath("//input[starts-with(@id,'k')]") # xpath语法支持模糊匹配以什么结尾的 element = driver.find_element_by_xpath("//input[ends-with(@id,'w')]")# ends-with是xpath2.0的语法 element = driver.find_element_by_xpath("//input[substring(@id,string-length(@id)-string-length('w')+1)='w']")# 此为xpath1.0的语法