Web UI自动化中XPath的使用


Web UI自动化中XPath的使用

XPath 是XML Path的简称,是一门在xml文档中查找信息的语言。由于HTML文档本身就是一个标准的XML页面。selenium支持八大定位方式,其中xpath是非常强大的元素查找方式,特别是在以文本方式查找元素,父级,兄弟级节点元素查找中。


在Chrome中检查xpath是否正确

在说xpath使用之前,先说一个在chrome中检查xpath是否正确的方法

在chrome浏览器中,用F12打开devtools

进入到Console tab

然后输入$x("xpath")

当xpath正确并在页面中有符合的元素时,就会显示出页面上的元素,如下图

检查xpath是否正确

当页面不包含此xpath的元素,显示为[],如下图

检查xpath是否正确

当写入的xpath错误时,就报xpath不正确错误

例如如下图报错:“is not a valid XPath expression”

检查xpath是否正确

$x("path")结果解析

检查xpath是否正确

如上图 xpath为.//a 即查找当前页面所有的a标签

红箭头指向个数14, 说明此页面检查出满足此.//a xpath的元素有14个

      点击前面的三角箭头,如下图所示,显示出所有的满足xpath标签的元素,并且当鼠标移动到对应的结果后,页面的元素会有一个蓝色的背景,说明此时鼠标执行的元素对应页面上的此元素。(当鼠标移动到对应元素后,在页面看不到对应的元素的显示,说明此时这个元素是在页面不可见的)

检查xpath是否正确

双击对应的元素后,会跳转到对应的DOM页面中

在web UI自动化中常用到的Xpath

以文本查找元素

text()

text

例如查找如上图中span的文本为“发行申请”的元素

.//span[text()='发行申请']

text

从截图结果看 查找到了两个span元素,是因为页面中还有一个span元素的为不可见

注意text()查找元素的时候,只能查找到当前标签中包含了文本信息的控件

例如如上图,我们查找div中文本为“发行申请”的元素

.//div[text()='发行申请']

text

如上图所示,可见符合要求的元素为空,是因为没有div中文本为发行申请的标签,只有span中文本为发行申请的标签,那么如果我们还是需要找到文本为发行申请的div呢?

string()

当要查找不是标签中直接文本的控件此时需要用string()函数

string

如下查找包含文本为首页发行申请的div

string
string

查找包含某个文本的控件

contains()

例如查找文本包含“发行”的label控件

contains

.//label[contains(text(),'市场')]

contains


查找不包含某个文本的控件

not(contains())

例如查找不包含“市场”的label控件

.//label[not(contains(text(),'市场'))]

not contains

去掉文本两边的空格和回车

normalize-space()

normalize-space

例如,如上图要找到button下文字为“新增”的span标签

如果直接用:.//button[text()='新增']这个进行查找呢

如下图所示可以看到查找结果为空,这是因为DOM结构中的新增的末尾带有空格和回车

normalize-space

.//button//span[normalize-space(text())='新增']

normalize-space

XPath轴

下面例子都以百度首页为例

xpath


XPath轴的使用

XPath提供了如下的轴对称节点

xpath

以下主要从我在UI自动化中经常使用到的节点做一些具体说明

parent - 父级元素

查找“百度热搜”的父级a标签

parent

ancestor - 祖先元素

查找“百度热搜”的所有祖先元素

.//div[@aria-label='百度热搜']//ancestor::*

ancestor

查找“百度热搜”的class为s-hotsearch-title的祖先级div元素

.//div[@aria-label='百度热搜']//ancestor::div[@class='s-hotsearch-title']

ancestor

下面的例子以下面DOM结构为例(百度首页的DOM片段)

DOM

following-sibling - 当前元素节点标签之后的所有兄弟节点

例如查找id为s-hotsearch-wrapper的向下兄弟textarea节点

.//div[@id='s-hotsearch-wrapper']//following-sibling::textarea

following-sibling

preceding-sibling - 当前元素节点标签之前的所有兄弟节点

例如查找id为s-hotsearch-wrapper的向上兄弟form节点

.//div[@id='s-hotsearch-wrapper']//preceding-sibling::form

preceding-sibling

preceding - 当前元素节点标签之前的所有节点

例如查找id为s-hotsearch-wrapper的div标签,之前的id为lm-new的标签

preceding

.//div[@id='s-hotsearch-wrapper']//preceding::*[@id='lm-new']

preceding

following - 当前元素节点标签之后的所有节点 

following

例如查找id为m的标签之后的class为hot-title的标签

.//div[@id='m']//following::*[@class='hot-title']

following

根据多个条件查找

and - 与条件

and

.//div[@aria-label='百度热搜' and contains(@class,'title-text')]

and

or - 或条件

or

例如查找class为hot-title 或者class包含title-text的标签

.//*[@class='hot-title' or contains(@class,'title-text')]

or

查找多个控件 - 使用“|”连接

当需要一次性查找多个不同xpath的元素时,可以使用"|" 对xpath路径进行相连

连续

例如查找id为u和id为u1的控件

.//*[@id='u'] | .//*[@id='u1']

连续

starts-with 查找以XX开头的元素

starts-with

例如查找class为head开头的div

.//div[starts-with(@class,'head')]

starts-with

在用Selenium做Web UI自动化时,对元素的定位是最基础的需要,在八中定位方式中Xpath是最强大的一种定位方式,但是有些同学在使用XPath时,会直接通过浏览器复制出DOM中的xpath,这个是不可取的,直接复制出来的xpath稳定性不高(当开发只是删除或新增以个div这个小小的改动,就需要更改xpath),所以在实际的使用中需要我们写出稳定性相对比较高的XPath. 以上是我在做UI自动化时常用的XPath,所以分享给大家,希望可以帮助到大家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容