三、PARTxpath 高级用法
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似
表达式描述
nodename选取此节点的所有子节点,类似 css 中的标签选择器
/ 从根节点选取,也就是当前节点的最顶层(默认情况下当前节点是 html 最顶层,若从某元素开始,当前节点为此元素)
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
缺点:
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开始的属性值
ends-with 例子:input[ends-with(@id,'_userName')] 解析:匹配以userName结尾的属性值
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