《手把手教你》系列技巧篇(十五)javaselenium自动化测试元素定位大法之yxpath中卷(详细教程)腾讯云开发者社区

按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。 使用这种方法几乎可以定位到页面上的任意元素。

xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。

XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。XPath 定位和CSS定位相比有更大的灵活性。XPath 在文档树中某个节点既可以向前搜索,也可以向后搜索,CSS定位只能在文档树中向前搜索,但XPath的定位速度比CSS 慢一些。

xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作, 如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢。

(1)id(2)name(3)class name(4)tag name(5)link text(6)partial link text(7)xpath(今天讲解)(8)css selector

1.访问度娘首页。

2.通过xpath定位到元素,点击一下。

索引号定位,以‘//’开头,具体格式为

具体例子:

具体步骤:

在被测试百度网页中,按照宏哥在上卷中5.2中的方法 (1)查找输入框并输入“北京宏哥”,如下图所示:(2)查找“百度一下”按钮,如下图所示:(3)点击“百度一下”按钮。

XPath表达式:

java定位语句:

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

根据元素类型在页面中出现的先后顺序,可以使用序号来查找指定的页面元素。本实例的XPath表达式表示查找页面中第二个出现的span中的input元素,即被测试页面上的按钮元素。 如果使用span/input[1],会发现固定位出输入框和按钮元素,这是因为页面中含有两个span节点,每个span节点都包含input元素,XPath在查找的时候,把每个span节点都当作相同的其实层级开始查找,所以input[1]能查出两个元素。因此在使用序号进行页面定位元素的时候,需要注意网页HTML代码中是否包含多个层级完全相同的代码结构。如果使用XPath表达式同时定位多个页面元素,将定位到多个元素存储到List对象中。在实际使用中,如果元素经常有新增或减少的情况,不建议使用索引号定位的方式,因为页面的变化会导致使用索引号的XPath表达式定位失败。

标签属性定位,相对比较简单,也要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认只是第一个,具体格式:

属性判断条件:最常见为id,name,class等等,目前属性的类别没有特殊限制,只要能够唯一标识一个元素都是可以的

具体例子:

(1)当某个属性不足以唯一区别某一个元素时,也可以采取多个条件组合的方式,具体例子

(2)当标签属性很少,不足以唯一区别元素时,但是标签中间中间存在唯一的文本值,也可以定位,其具体格式

具体例子:

注意:尽量在html中复制此段文本,避免因为肉眼无法分辨的字符导致定位失败

(3) 其他的属性值如果太长,也可以采取模糊方法定位,直接上示例

当然,如果上面的单一方法不能完成定位,也可以采取组合式定位 类似

(5) .//和//的区别

//是指从全文上下文中搜索//后面的节点,而.//则是指从前面的节点的子节点中进行查找

(6) 选取若干路径|

这个符号用于在一个xpath中写多个表达式用,用|分开,每个表达式互不干扰,意思是一个xpath可以匹配多个不同条件的元素,例如:如下图所示,xpath可以匹配到满足条件的i标签元素和满足条件的span标签元素。

具体步骤:

在被测试百度网页中,按照宏哥在上卷中5.2中的方法 (1)查找输入框并输入“北京宏哥”,(2)查找“百度一下”按钮,(3)点击“百度一下”按钮。因为上卷中的相对路径宏哥已经用了id,在这里宏哥就是用一下其他的属性。

XPath表达式:

java定位语句:

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

在定位页面元素的时候,会遇到各种结构复杂的网页,并且经常出现无法使用ID,name等方式进行定位。有不想使用感觉对路径的定位方式,也没法搞清使用什么序号来定位元素,那么则推荐使用属性值定位元素的方法。

被测试网页的元素一般都包含各种各样的属性值,并且很多属性值具有唯一性。因此非常建议使用相对路径结合属性值定位的方式来编写XPath定位表达式,基于此定位方法可以解决大部分的页面元素定位问题。

使用Aixs方法可依据在文档书中的元素相对位置关系进行定位。先找到一个相对好定位的元素,再根据这个元素和要定位的相对位置进行定位,可以解决一些元素难以定位的问题。

XPath常用的关键字如下所示:

XPath轴关键字

轴含义

实例

表达式解释

ancestor

选取当前节点的所有先辈(父、祖父等)

//img[@alt=’div2-img2’]/ancestor::div

查找alt属性值为div2-img的图片,并基于图片位置找到它的上级div页面元素。

ancestor-or-self

选取当前节点的所有先辈(父、祖父等)以及当前节点本身

//img[@alt=’div2-img2’]/ ancestor-or-self::*

查找alt属性值为div2-img的图片,并基于图片位置找到它全部上级元素,包括它本身。

attribute

选取当前节点的所有属性

//img[@alt=’div2-img2’]/ attribute::*

查找alt属性值为div2-img的图片并返回该节点下的所有属性节点

child

选取当前节点的所有子元素。

//div[@id=’div1’]/child::img

查找ID属性为div1的div页面元素,并基于div的位置找到它下层节点中的img页面元素

descendant

选取当前节点的所有后代元素(子、孙等)。

//div[@name=’div2’]/ descendant::img

查找name属性值为div2的元素,并基于div位置找到它下级的所有节点中的img页面元素。

descendant-or-self

选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

//div[@name=’div2’]/ descendant::div

查找name属性值为div2的元素,并基于div位置找到它下级的(包括自己)所有节点中的div页面元素。其实就是它本身。

following

选取文档中当前节点的结束标签之后的所有节点。

//div[@id=’div1’]/ following::img

查找到ID属性值为div1的div页面,并基于div找到它后面节点中的img页面元素

parent

选取当前节点的父节点。

//img[@alt=’div2-img2’]/ parent::div

查找到alt属性值为div2-img的图片并基于图片位置找到它上一级的div页面元素。

preceding

选择当前节点前面的所有节点

//img[@alt=’div2-img2’]/preceding::div

查找alt属性值为div2-img2的照片页面元素,并基于图片的位置找到它前面节点中的div页面元素。

preceding-sibling

选取当前节点之前的所有同级节点。

//img[@alt=’div2-img2’]/ preceding-sibling::a[1]

查找alt属性值为div2-img2的照片页面元素,并基于图片的位置找到它前面同级节点中的第二个链接页面元素

self

选取当前节点。

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

例如:

可以看到,input标签的父元素是span标签,而span标签的父元素是form标签,所以可以通过先定位form标签,然后利用descendant定位input标签

xpath路径如下:

把路径放到浏览器控制台,按下Ctrl+F,然后输入xpath路径,查看一下,确实定位到了标签(在执行程序之前,可以通过这种方式来验证一下写的xpath路径是否正确)

注意这里说的是“结束标签之后”,所以在用这个轴进行定位时要看清目标标签的与辅助定位标签的层级关系,所以上例中就不能通过标签结合following来定位,因为标签在标签里面;

分析一下:input标签的上级是一个span标签,这个span标签上面也有一个span标签,可以通过它(span)来定位

按上边的方法,宏哥再次验证一下,成功定位到“百度一下”按钮,如下图所示:

例如,父节点是个div,即可写成parent::div,如果要找的元素不是直接父元素,则不可使用parent,可使用ancestor,代表父辈、祖父辈等节点,child::表示直接子节点元素,following-sibling只会标识出当前节点结束标签之后的兄弟节点,而不包含其他子节点;

定位网页中的python:

宏哥这里就不做验证了,有兴趣或者不信的小伙伴或者童鞋们,可以按照宏哥的方法自己验证一下。

THE END
0.各类软件教程AI平面设计AI基础3AI大神教大家快速画潮流与复古【Illustrator】 - 3 06:55 4CDR平面设计】CDR基础教程:对象复制的技巧_合并文件 - 1 08:37 5CDR平面设计】CDR基础教程:对象复制的技巧_合并文件 - 3 08:41 6看CDR大神如何制作奶油文字【CorelDRAW】 03:11 7AI平面设计】AI基础_路径查找器1【IljvzquC41yy}/3?80eqs0qyjpeq{sun4fgvgjn8{kfgu.JQOR5NK866PJLR9MGV6