Xpath常用的定位方法
相信做过selenium UI自动化的朋友都知道,工作中大部分的元素定位都是使用xpath进行定位,所以xpath是UI自动化工作中非常重要的一个环节,所以我单独整理出来一篇博客出来~~希望对大家有帮助~
相对定位
相对定位是两个杠表示“//”,相对路径易维护
绝对路径
绝对定位用一个杠“/”, 绝对路径一个层级变化所有空间都有变化
/html/body/div【1】/section/section/main/div【2】/div【2】/div【1】/div【2】/button【1】/span
last()方法
当标签存在多个相同的时候,可以使用xpath中的last()方法,定位到最后一个
//标签名【last()】
//span/ul//li【last()】
如果我们要定位到倒数第二个,可以在last() 后面加上 -1,代表倒数第二个
//标签名【last()-1】
//span/ul//li【last()-1】
属性查找@
如,这里我们以百度为例,如果我们要定位到百度的id元素,那么可以使用 //标签名【@元素名称=‘元素值’】
//标签名【@元素名称='元素值'】
//input【@id='kw'】
xpath逻辑表达式-and
当一个元素无法定位到唯一值得时候,我们可以使用and表达式,同一个标签下定位多个元素
//标签名【@元素名称='元素值' and @元素名称='元素值'】
//input【@id='kw' and @class='s_ipt'】
xpath表达式-or
xpath 中 or的表达式和and很像,指的是当你元素满足其中一个条件的时候,就可以定位到,如图,在百度搜索框中,我们故意将@class='s_t’元素写错,内容中并没有这个元素,
// 标签名【@元素名称='元素值' or @元素名称='元素值'】
//input【@id='kw' or @class='s_t'】
非查找控件
如图,如果我们想要查找元素值不等于某个值的内容,可以使用!=方法,但是这个方法在工作中用的比较少,目前我还没有用到过,不过xapth提供了这个方法,可以结合场景使用~
//标签名称【@元素名称 != '元素值'】
//input【@class!='1111'】
Not查找
//标签名【not(.='元素值')
//year【not(.=2005)】
//div【not(@id="tab-AndroidVersions")】
这里没有找到合适的场景,意思就是查找year内容不为2005的内容 注:“.”就等于text()
模糊匹配
//标签名【contains(text(), "内容"】
//div【contains(text(), "更新")】
这里的意思是模糊查询内容包含“更新”的元素
精准匹配
//标签名【(text()='内容')】
//div【(text()='更新文案')】
使用大于小于符号定位
//div【@class="cell" and text()>'1336'】
//div【@class="cell" and text()[span class="hljs-string">'1336'】
如图,当我们商品列表中有多个商品ID,那我们想要定位到ID大于或者小于1336的数据,可以通过上面的方式。
轴方式定位
轴表达式说明
parent:: :表示当前节点的父节点元素
ancestor:: :表示当前节点的祖先节点元素
child:: :表示当前节点的子元素 /A/descendant:: 表示A的所有后代元素
self:: :表示当前节点的自身元素
ancestor-or-self:: :表示当前节点的及它的祖先节点元素
descendant-or-self:: :表示当前节点的及它们的后代元素
following-sibling:: :表示当前节点的后序所有兄弟节点元素
preceding-sibling:: :表示当前节点的前面所有兄弟节点元素
following:: :表示当前节点的后序所有元素
preceding:: :表示当前节点的所有元素
parent:: 当前节点的父节点元素
//代码参考: https://weibo.com/u/7932047597
//div【@class="cell" and text()='1338'】/parent::
如图,我们要定位到ID为1338元素的父节点元素,可以使用如上xpath轴定位, “” 表示匹配所有
following-sibling::
/bookstore/book【1】/following-sibling::
查找books1所有的同级元素都查找出来,“”表示所有
//div【3】/table/tbody/tr【1】/td【1】/following-sibling::td【2】
查找td【1】下同级节点下的第二个节点
3. following-sibling::当前节点的前面所有兄弟节点元素
/bookstore/book【2】/year/preceding-sibling::
意思是:查找books【2】下year前的同级节点
查找节点的父辈
/bookstore/book【2】/year/parent::
查找节点的子辈
/bookstore/book【2】/descendant::
使用position位置定位
意思是定位到th标签下的第一个
//th【@class="c-id " and position()=1】
也可以//th【@class="c-id " and position()<2】 这样用~
1、css属性定位
css选择器策略
示例
说明
#id
#telA
选择id="telA"的所有元素。
.class
.telA
选择 class="telA”的所有元素。
【属性名=属性值】
【name=telA】
除了id和class属性,其他属性的定位格式
【attribute】
【target】
选择带有target 属性所有元素。
选择所有元素。
2、css属性值模糊匹配定位
css选择器策略
示例
说明
【attribute^=value】
a【src^="https"】
选择其src 属性值以"https”开头的每个元素。
【attribute$=value】
a【src$=".pdf"】
选择其src属性以".pdf“结尾的所有元素。
【attribute=value】
a【src="abc"】
选择其src 属性中包含“abc"子串的每个元素。
【attribute~=value】
a【title~=flower】
定位标签属性title值中有独立flower词汇的节点
【attribute
=value】
a【lang
=en】
用于选取带有以指定值开头的属性值的元素。
注意:【attribute|=value】
该值必须是整个单词,比如 lang="en",或者后面跟着连字符,比如 lang="en-us"。
3、css标签定位
css选择器策略
示例
说明
element
p
定位所有
元素。
标签名【属性名=属性值】
input#telA
定位id属性值为telA的所有元素
4、css层级关系定位
css选择器策略
示例
说明
element,element
div,p
选择所有 元素和所有
元素。
element element
div p
选择 元素内部的所有
元素。包括子孙后代。
element>element
div>p
选择父元素为 元素的所有
元素。只包括子代。
element+element
div+p
选择紧接在 元素之后的所有
元素。同辈元素。
示例:
css选择器策略
示例
说明
需要使用 > 或 空格表示层级关系
语法
父标签名【父标签属性名=属性值】>子标签名
p#p1>input
定位id属性值为p1的元素
父标签名【父标签属性名=属性值】 子标签名
p#p1 input
同上
5、css索引定位
css选择器策略
示例
说明
:only-child
p:only-child
选择属于其父元素的唯一子元素的每个
元素。
:nth-child(n)
p:nth-child(2)
选择属于其父元素的第二个子元素的每个
元素。
:nth-last-child(n)
p:nth-last-child(2)
同上,从最后一个子元素开始计数。
:nth-of-type(n)
p:nth-of-type(2)
选择属于其父元素第二个
元素的每个
元素。
:nth-last-of-type(n)
p:nth-last-of-type(2)
同上,但是从最后一个子元素开始计数。
6、css逻辑运算定位
css选择器策略
逻辑定位
示例
标签名【属性名1=属性值1】【属性名2=属性值2】
示例
说明
同时匹配多个属性
7、css元素状态定位
选择器
例子
例子描述
:empty
p:empty
选择没有子元素的每个
元素(包括文本节点)。
:target
#news:target
选择当前活动的 #news 元素。
:enabled
input:enabled
选择每个启用的 元素。
:disabled
input:disabled
选择每个禁用的 元素
:checked
input:checked
选择每个被选中的 元素。
:not(selector)
:not(p)
选择非
元素的每个元素。
七 、总结
如果元素有明确id,name,class属性时,使用对应的基本定位方法。
如果没有id,name,class属性时,或id,name,class属性是动态/不唯一的时候,使用XPath和css_selector定位。
定位页面超链接使用link_text和partial_link_text定位
可使用XPath和css_selector定位的时候,优先使用css_selector。
css_selector定位的速度和效率比Xpath高。
没有最好的,只有最精简的,怎么简单怎么来。
扩展:为什么css_selector定位的速度和效率比Xpath高?
因为你无论用那种方式定位,最终都会转换到css_selector进行元素定位。
我们可以在PyCharm中,安装ctrl点击对应的方法,进行查看源码,最终都会定位到如下代码:
def find_element(self, by=By.ID, value=None):
"""
Find an element given a By strategy and locator. Prefer the find_elementby methods when
possible.
:Usage:
element = driver.find_element(By.ID, 'foo')
:rtype: WebElement
"""
if self.w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '【id="%s"】' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '【name="%s"】' % value
return self.execute(Command.FIND_ELEMENT, {
'using': by,
'value': value})【'value'】