自动化测试——Xpath定位

273 阅读5分钟

1. Xpath的相对路径与绝对路径

<AAA>
    <BBB>
        <CCC id="password", title="input">
        </CCC>
    </BBB>
</AAA>

在Xpath中,以“/”开始表示从根路径开始查找;以“//”开始表示从任意位置开始查找。 那么要定位如上CCC控件,可以使用/AAA/BBB/CCC定位,也可以使用//CCC定位。

2.通过控件唯一属性定位

<AAA>
    <BBB>
        <CCC id="password", title="input">
        </CCC>
    </BBB>
</AAA>

定位CCC可以通过CCC的属性来定位,可以写成//CCC[@id="password"]或者//CCC[@title="input"]来定位。

3.通过上一级的唯一属性来定位

<AAA>
    <BBB>
        <CCC id="password", title="input">
            <DDD>
            </DDD>
        </CCC>
    </BBB>
</AAA>

定位DDD,可以先找到DDD上一级控件再定位DDD,可以写成//CCC[@id="password"]/DDD

4.布尔逻辑运算

<AAA>
    <BBB>
        <CCC>
            <DDD id="password", title="first">
            </DDD>
        </CCC>
        <DDD title="password">
        </DDD>
    </BBB>
</AAA>

Xpath中可以使用的逻辑运算符:and、or
定位两个DDD,可以使用//DDD[@id="password" or title="password"]
定位第一个DDD可以使用//DDD[@id="password" and title="first"]

5.双条件判断

<AAA>
    <BBB>
        <CCC>
            <DDD id="password", title="first">
            </DDD>
        </CCC>
        <DDD title="password">
        </DDD>
    </BBB>
</AAA>

定位第一个DDD可以使用//DDD[@id="password"][@title="first"]

6.模糊定位

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
            <DDD id="password", title="sencond">
            </DDD>
        </CCC>
    </BBB>
</AAA>

模糊定位通常可以使用下面三个方法:
contains: 定位第一个DDD可以使用//DDD[contains(@id,"cc")],
starts-with: 定位第一个DDD可以使用//DDD[starts-with(@id,"acc")]
ends-with: 定位第一个DDD可以使用//DDD[ends-with(@id,"unt")],但是你的浏览器可能并不支持ends-with方法,这个是Xpath2.0的语法,反正在下的QQ浏览器不支持这个方法

7.通过控件索引定位

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
            <DDD id="password", title="sencond">
            </DDD>
        </CCC>
    </BBB>
</AAA>

例如想要定位第二个DDD,可以使用//CCC/DDD[2]

8.Xpath中的轴--child

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
            <DDD id="password", title="sencond">
            </DDD>
        </CCC>
    </BBB>
</AAA>

child是Xpath的默认轴,可以忽略不写,例如/AAA/child::BBB等价于/AAA/BBB

9.Xpath中的轴--parent

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
        </CCC>
    </BBB>
    <EEE>
        <DDD>
        </DDD>
    </EEE>
</AAA>

parent返回当前控件的父控件,想要获取所有DDD控件的所有父控件可以使用//DDD/parent::*

10.Xpath中的轴--descendant

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
        </CCC>
    </BBB>
    <EEE>
        <DDD>
        </DDD>
    </EEE>
</AAA>

descendant返回当前控件的子孙控件,例如想要获取AAA控件所有子孙控件中的DDD控件可以使用/AAA/descendant::DDD

11.Xpath中的轴--ancestor

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
        </CCC>
    </BBB>
    <EEE>
        <DDD>
        </DDD>
    </EEE>
</AAA>

ancestor返回当前控件的父、祖父控件,若想获得第一个DDD控件的所有父、祖父控件可以使用//DDD[@id="account"]/ancestor::*

12.Xpath中的轴--descendant-or-self

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
        </CCC>
    </BBB>
    <EEE>
        <DDD>
        </DDD>
    </EEE>
</AAA>

descendant-or-self返回当前控件以及当前控件的子孙控件,例如想要获取AAA控件以及AAA控件所有子孙控件可以使用/AAA/descendant-or-self::*

13.Xpath中的轴--ancestor-or-self

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
        </CCC>
    </BBB>
    <EEE>
        <DDD>
        </DDD>
    </EEE>
</AAA>

ancestor-or-self返回当前控件以及当前控件的父、祖父控件,若想获得第一个DDD控件以及其所有父、祖父控件可以使用//DDD[@id="account"]/ancestor-or-self::*

14.Xpath中的轴--preceding-sibling

<AAA>
    <BBB>
        <CCC>
        </CCC>
        <ZZZ>
            <DDD id="account"/>
        </ZZZ>
    </BBB>
    <EEE>
        <DDD id="password">
        </DDD>
    </EEE>
</AAA>

preceding-sibling返回当前控件之前的于当前控件同级的控件,例如想要获取EEE控件的所有同级控件(当前示例获取到的是BBB控件)可以使用//EEE/preceding-sibling::*

15.Xpath中的轴--preceding

<AAA>
    <BBB>
        <CCC>
        </CCC>
        <ZZZ>
            <DDD id="account"/>
        </ZZZ>
    </BBB>
    <EEE>
        <DDD id="password">
        </DDD>
    </EEE>
</AAA>

preceding返回当前控件开始标签之前的所有控件,但不会返回祖先控件,例如//DDD[@id="password"]/preceding::*返回的控件是BBB、CCC、ZZZ和id为account的DDD控件,不会返回AAA控件和EEE控件

16.Xpath中的轴--following-sibling

<AAA>
    <BBB>
        <CCC>
        </CCC>
        <ZZZ>
            <DDD id="account"/>
        </ZZZ>
    </BBB>
    <EEE>
        <DDD id="password">
        </DDD>
    </EEE>
</AAA>

following-sibling返回当前控件时候的与当前控件同级的控件,例如//BBB/following-sibling::*返回的是EEE控件

17.Xpath中的轴--following

<AAA>
    <BBB>
        <CCC>
        </CCC>
        <ZZZ>
            <DDD id="account"/>
        </ZZZ>
    </BBB>
    <EEE>
        <DDD id="password">
        </DDD>
    </EEE>
</AAA>

following返回当前控件结束标签之后的所有控件,同样也不会返回祖先控件,例如//CCC/following::*返回的是ZZZ、EEE和两个DDD控件,但不会返回BBB控件和AAA控件

18.Xpath中的轴--self

self返回当前控件,单独使用无任何意义,一般与ancestor\descendant一起使用

19.Xpath中的轴--attribute

<AAA>
    <BBB>
        <CCC>
            <DDD id="account", title="first">
            </DDD>
            <DDD id="password", title="sencond">
            </DDD>
        </CCC>
    </BBB>
</AAA>

attribute返回当前控件的属性,例如获取第一个DDD的所有属性,可以使用//CCC/DDD[1]/attribute::*

20.Xpath中的轴--namespace

namespace返回的是当前节点的命名空间节点