xpath 高级用法

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似

表达式

描述

nodename

选取此节点的所有子节点,类似 css 中的标签选择器

/

从根节点选取,也就是当前节点的最顶层(默认情况下当前节点是 html 最顶层,若从某元素开始,当前节点为此元素)

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

 

注意:当你使用父元素.find_element_by_xpath 这种方式定位的时候,元素定位表达式必须以点开头,如

ele = driver.find_elements_by_xpath("//div[@id='category-block']//ol/li")
b = ele.find_elements_by_xpath('.//li[@class=\'subcate-item\']//span')

如果不用点,会从整个文档开始找,即使你前边使用了父元素也没有效果,xpath 就是这样实现的(╯▽╰)

缺点:

xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,这是个非常费时的操作,  如果脚本中大量使用xpath做元素定位的话,脚本的执行速度可能会稍慢

绝对路径定位

从顶层 html 开始往下找,像文件夹一样写的完整路径,

缺点:一旦页面结构发生改变,路径也随之失效,必须重新定位。所以不推荐使用绝对路径的写法

相对路径定位

绝对路径   "/"  开头,xpath 从文档的根节点开始解析

相对路径  "//" 开头,xpath 从文档的任何元素节点开始解析(也就是说每个节点都作为起点找一下

 

索引定位

//input[2]  任意节点下的第二个 input 标签

 

属性定位

//input[@name="username" and @type="text"]    任意节点下name 属性为 username input 标签

starts-with      例子: input[starts-with(@id,'ctrl')]              解析:匹配以ctrl开始的属性值

contains()        例子:Input[contains(@id,'userName')]        解析:匹配含有userName属性值

 

 

其他定位方式

parent  选取当前节点的父节点

//*[@id="content_views"]/p[51]/span[1]/parent::p


ancestor  选取当前节点的所有先辈(父、祖父等)

//*[@id="content_views"]/p[51]/span[1]/ancestor::div

 

ancestor-or-self  选取当前节点的所有先辈(父、祖父等)以及当前节点本身(不包含叔叔伯伯

//*[@id="content_views"]/p[51]/span[1]/ancestor-or-self::div

 

descendant选取当前节点的所有后代元素(子、孙等)

//*[@id="content_views"]/descendant::span

 

descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身

//*[@id="content_views"]/p[51]/descendant-or-self::p

 

preceding   选取文档中当前节点的开始标签之前的所有节点

//*[@id="content_views"]/p[51]/preceding::p

 

preceding-sibling选取当前节点之前的所有同级节点

//*[@id="content_views"]/p[51]/span[2]/preceding-sibling::span


following   选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素

//*[@id="content_views"]/p[51]/following::p


following-sibling选取当前节点之后的所有同级节点

//*[@id="content_views"]/p[51]/span[2]/following-sibling::span

posted @ 2020-09-04 15:13  RoseLv  阅读(402)  评论(0)    收藏  举报