什么是XPATH

1.     是用来选择“节点”的一种基于表达式的语言;

2.     表达式的格式类似于文件系统,eg. C:\user\admin;

3.     其最常用的场景之一就是在自动化中用来选择HTML DOM 节点;

4.     Selenium原生支持xpath,因此也是selenium自动化测试中作为选择web 元素的主要方法之一;

 

XPATH术语

      Parent

      Child

      Sibling

      Ancestor

      Descendant

 

1.     Parent

1.png

拥有类名“header_nav”的div标签即是拥有类名“nav_container”的div标签的parent节点。

2.     Child

1.png

拥有类名“nav_container”的div标签即是拥有类名“header_nav”的div标签的child节点。

3.     Sibling

XPATH手册_第1张图片

拥有类名“nav”的div标签即是拥有类名“main_header”的div标签的sibling节点,另外兄弟节点是相互的。

4.     Ancestor

XPATH手册_第2张图片

拥有类名“main_header”的div标签即是拥有类名“header_login”的div标签的Ancestor节点,注parent也属于Ancestor节点。

5.     Descendant

XPATH手册_第3张图片

反过来,拥有类名“header_login”的div标签即是拥有类名“main_header”的div标签的Descendant节点,注child也属于descendant节点。

 

XPATH语法

// - 99%的情况都是以//开始

   i.e //div 将选择页面上的所有div元素

/ - 可以/来选择孩子元素

   i.e //div/span 将选择div元素的所有子span元素

// - 可以用//来选择后代元素

   i.e //div//span 将选择所有div元素的后代span元素

[] – 用在标签后面添加筛选条件

   用 @ 符号通过元素的属性实现筛选

//div[@class=“example”] 将筛选所有类名等于example的div元素

* - 适配所有元素

i.e //div/* 将选择所有div元素的孩子元素

text() – 用来选择拥有特定text的元素

                        i.e //div/p[text()=‘poi’] 将选择div的孩子元素,且该子元素拥有poi文本节点

 

XPATH核心

Ancestor

   //span/ancestor::div 将选择div元素,且该元素是span元素的祖先元素,含父元素;

Descendant

   //div/descendant::span 将选择span元素,且该元素是div元素的后代元素,含孩子元素(这种方式不常用,引入等同于//div//span);

Following-sibling

   //div/following-sibling::div 将选择第一个div元素的“弟弟”元素

      当要定位的元素无可用的属性时,可用来定位同级的元素

Preceding-sibling

   //div/preceding-sibling::div 将选择第一个div元素的“哥哥”元素

      同理,当要定位的元素无可用的属性时,可用来定位同级的元素

 

XPATH常用操作符

Equivalency (=)

   //div[@class=‘poi’]

Less than or Equal (<=)

   //div[@value<=42] 将选择一个div元素,且该元素拥有value属性且该属性的值小于等于42

Greater Than or Equal (>=)

   //div[@value>=42] 与上同理

And

   可用该运算符联合多个属性筛选

   //div[@name=‘poi’ and @class=‘header’]

Or

   与and相似,只是满足任意一个条件即可

   //div[@name=‘poi’ or @class=‘header’]

 

    XPATH高级用法

      () 与索引连用 [index] 可选择结果集中的第n个元素

              (//li[@class='some_class'])[3]  将选择第3个 li 元素

      [contains( @property,‘ poi‘)] 会匹配属性值,只要属性值中包含poi则可被定位到

    //span[contains(@class, ‘nav’)] 将选择所有类值包含nav的span元素

      [starts-with( @property,‘ poi‘)] 会匹配属性值,只要属性值是以poi开头的则可被定位到

    //span[starts-with(@class, ‘nav’)] 将选择所有类值以nav开头的span元素

      [ends-with( @property,‘ poi‘)] 会匹配属性值,只要属性值是以poi结尾的则可被定位到

    //span[ends-with(@class, ‘nav’)] 将选择所有类值以nav结束的span元素

      . 用在条件筛选时,被当成是 text(), 例如可以用//p[.=‘poi’] 代替 //p[text()=‘poi’]

      . 还可以用来表示当前节点,这样可在筛选条件中用xpath 实现递归地查询

      //div[@id='mainContents']//a[contains(@class,'sectionTab') and ./span[.='All Games']]

-    上面的xpath可以找到a元素,并且该元素有个孩子元素,且该孩子元素有“All Games”文本节点