Selenium-xpath定位

序言:

前面介绍了利用浏览器的debug工具获取xpath地址,但是这个工具不是万能的,有时候直接复制粘贴会定位不到。这个时候就需要自己手动去写xpath路径了。接下来将详细讲解xpath的常用语法。

一、xpath的基本概念和基本语法

可上菜鸟教程和w3cschool查看相关资料:http://www.runoob.com/xpath/xpath-tutorial.htmlhttp://www.w3school.com.cn/xpath/index.asp

Selenium-xpath定位

 

 

 Selenium-xpath定位 

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

Selenium-xpath定位

 

 

 Selenium-xpath定位

二、下面我们开始介绍xpath的一些常用定位方法

语法:xpath = "//标签名[@属性='属性值']"

1. 属性定位

(1)通过id属性定位

Selenium-xpath定位

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开始)

Selenium-xpath定位

 

 

 

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的语法

 

上一篇:python 解析网页html,提取需要的页面信息


下一篇:元素的定位