WEB自动化测试中Xpath定位方法

前言:
Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。

一  路径表达式:

  1. 路径以“/”开始     表示找到满足该绝对路径的元素;
  2. 路径以//”开始     表示找到文档中所有满足“//”后规则的元素  如//BBB  表示找到所有BBB元素;
  3. *                           表示所有  如//*  表示选择所有元素;
  4. [表达式]              进一步限定元素:①[数字]   表示选择第几个, 其中[last()]表示最后一个;②[@属性]  限定满足该属性  ,如//BBB[@name]   表示含有name属性的BBB元素,//BBB[not(@*)]表示所有没有属性的BBB元素;拓展,属性赋值,如 /BBB[@name="yyy"]   表示所有含有name属性且其值为“yyy”的BBB元素;
  5.   |       逻辑或    将多个路径合并到一起    如//BBB | /AAA  选择所有BBB元素和根元素AAA      [可合并的路径数目没有限制]  
二 辅助工具

 Firefox浏览器用FireBug插件查看元素,还可以单击鼠标右键,选择copy Xpath。

Chrome浏览器就F12键就OK

IE浏览器可以一个小程序

xpath是可以解决网页自动化定位99%的问题。

如果一个元素没有id 没有name那我们该怎么定位该元素了,第一想到的就是用xpath了。
在网上copy了一段代码,就以这个做说明吧,xpath定位元素分相对路径和绝对路径,主要说明下相对路径的用法。

示例代码如下:

<html>
  <body link="#0000cc">
    <div id="wrapper" style="display: block;">
      <div id="content" style="display: block;">
      <div id="u1" style="display: block;">
         <div id="m">
             <p id="lg">
             <p id="nv">
             <div id="fm">
                 <form id="form" class="fm" action="/s" name="f1">
                     <span class="s_ipt_wr">
                         <input id="kw"  type="text" name="wd">
        ......
    </body>
 </html>

1、绝对路径定位(初级)

使用绝对路径的方式定位除非是其父级元素都没有一个唯一识别的元素才使用该方式;
假如要定位到输入框,那么使用绝对路径的方式为:
xpath= /html/body/div[1]/div[2]/div[1]/div[1]/form/span[1]/input
就是从根部开始找,一级一级往下走,如果有同级别的需要用[]标明序号,从1开始

2、相对路径定位(初级)

下面各方法中都是以定位到input做说明,以下不再说明。

2.1 元素本身找(@表示属性)
xpath=//input[@id=”kw” ] 或者xpath=//*[@id=”kw” ]
//input表示匹配input标签的所有元素
//*表示匹配所有元素的标签
当然不限于用id,也可以xpath=//*[@type=”text”]
注意:要保证这些元素可以唯一的识别一个元素

2.2 布尔值写法
如果input标签中 id不是唯一的,type也不是唯一的,但在该页面中包含该id和type的只有这个元素时,那么我们可以用组合的方式定位
xpath=//*[@id=”kw” and @type=”text”]
当然还有or 或,慎用
xpath=//*[@id=”kw” or @type=”text”]

2.3 找父级
如果自己没有唯一的标志,那么就找自己的上级(父级),或者上级的上级,以此类推。
找父级:xpath=//span[@class=’s_ipt_w’]/input
找父级的父级:xpath=//form[@id=”form”]/span[1]/input

2.4 跳级
如果需要定位的元素在该页面不是唯一,但在某个容器内是唯一的,当然那个容器必须要有唯一的标志;
跳级的话要用两个//
那么可以这样表示:xpath=//div[@id=”wrapper”]//input [@id=”kw”]

注意:该方法要保证在某容器内该元素是唯一的。

3.过滤(中阶方法)----Xpath函数

3.1.contains (): //div[contains(@id,'in')] ,表示选择id中包含有’in’的div节点

3.2.text():由于一个节点的文本值不属于属性,比如“<a class=”baidu“ href=”http://www.baidu.com“>baidu</a>”,所以,用text()函数来匹配节点://a[text()='baidu']

3.3.last():前面已介绍

3.4.starts-with(): //div[starts-with(@id,'in')] ,表示选择以’in’开头的id属性的div节点

3.5.not()函数,表示否定,//input[@name=‘identity’ and not(contains(@class,‘a’))] ,表示匹配出name为identity并且class的值中不包含a的input节点。 not()函数通常与返回值为true or false的函数组合起来用,比如contains(),starts-with()等,但有一种特别情况请注意一下:我们要匹配出input节点含有id属性的,写法如下://input[@id],如果我们要匹配出input节点不含用id属性的,则为://input[not(@id)]

4.轴(高阶方法)

这里写图片描述

following-sibling    选取当前节点之后同级节点。

用我实际工作中的介绍下,如图:

这里写图片描述
要定位要编辑按钮(图片底部处)
假如要定位列表中的某些数据某个按钮,但不能确定他的位置在第一个还是第二个还是其他,那么可以用轴的方式定位;
xpath=//*[@id=”main-container”]//div[@class=”tabbable”]//li/h3[starts-with(text(),”【图片素材】”)]/ancestor::li[1]/div[3]/a[@title=”编辑”]
ancestor的前半部分,表示先定位到要找名称以“【图片素材】”开头的数据;后半部分定位到名称处后,再根据ancestor的功能(ancestor表示选取当前节点的所有先辈,那么要从名称处的父级开始定位)定位要需要定位的元素“编辑”按钮。
注意:该方法很实用,能定位到比较复杂的元素,还要加两个::

5.步(高阶方法)

语法:轴名称::节点测试[谓语]

这里介绍下last();上面的轴方法中,还存在一个问题就是,一条数据中图片数量不同的话,上面的方法又不能使用了,需用到步方法
xpath=//*[@id=”main-container”]//div[@class=”tabbable”]//li/h3[starts-with(text(),”【图片素材】”)]/ancestor::li[1]/div[last()]/a[@title=”编辑”]
因为编辑按钮在最后一个div中,所以前面不管有多少图片的话他总是会定位到最后一个,如果要定位要其他的则在()输入数字即可。

差不多了,用以上这些方式进行定位基本能应付常规工作中的定位了
版权声明:本文为qq_41030861原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41030861/article/details/79583383

智能推荐

idea基础–(7)–jsp页面Controller路径自动识别的问题“Cannot resolve controller URL ...”,Cannot resolve variable

idea之所以强大,就是强大的代码提示和联想功能,写起代码来简直不要太爽。但是这几天我发现在我的jsp页面中访问controller路径的时候不会自动提示了,对于这么严谨的我肯定要找出原因啊,哈哈。 最终效果:按住ctrl,同时点击左键会自动跳转到对应的controller代码块,爽。 需要同时满足的条件 JSP页面顶部包含如下代码: 在idea的项目设置中显示如下:  若显示的是spring a...

26_Python基础_继承

面向对象三大特性: 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用, 相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,  产生不同的执行结果,  增加代码的灵活度 1.  单继承 1.1 概念 继承的概念:&...

循环

与任何程序设计语言一样Java利用条件语句与循环结构确定流程控制,一下总结一下Java中的循环语句: while do while for switch 对于golang来说: switch非常灵活。从第一个expr为true的case开始执行,如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的expr,如果之后的case都有fallthrough,d...

1638 统计只差一个字符的子串数目(动态规划)

1. 问题描述: 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。比方说, "computer" 和 "computation"...

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

猜你喜欢

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...