史上最全的xpath 、CSS定位方法
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()<'1336']
如图,当我们商品列表中有多个商品ID,那我们想要定位到ID大于或者小于1336的数据,可以通过上面的方式。
轴方式定位
轴表达式说明
parent::* :表示当前节点的父节点元素
ancestor::* :表示当前节点的祖先节点元素
child::* :表示当前节点的子元素 /A/descendant::* 表示A的所有后代元素
self::* :表示当前节点的自身元素
ancestor-or-self::* :表示当前节点的及它的祖先节点元素
descendant-or-self::* :表示当前节点的及它们的后代元素
following-sibling::* :表示当前节点的后序所有兄弟节点元素
preceding-sibling::* :表示当前节点的前面所有兄弟节点元素
following::* :表示当前节点的后序所有元素
preceding::* :表示当前节点的所有元素
- parent:: 当前节点的父节点元素*
//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] 这样用~
原文链接:https://blog.csdn.net/weixin_43865008/article/details/115332404
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”开头的每个<a>元素。 | ||
[attribute$=value] | a[src$=".pdf"] | 选择其src属性以".pdf“结尾的所有<a>元素。 | ||
[attribute*=value] | a[src*="abc"] | 选择其src 属性中包含“abc"子串的每个<a>元素。 | ||
[attribute~=value] | a[title~=flower] | 定位标签属性title值中有独立flower词汇的节点 | ||
[attribute | =value] | a[lang | =en] | 用于选取带有以指定值开头的属性值的元素。 |
注意:[attribute|=value]
该值必须是整个单词,比如 lang="en",或者后面跟着连字符,比如 lang="en-us"。
3、css标签定位
css选择器策略 | 示例 | 说明 |
---|---|---|
element | p | 定位所有<p>元素。 |
标签名[属性名=属性值] | input#telA | 定位id属性值为telA的所有<input>元素 |
4、css层级关系定位
css选择器策略 | 示例 | 说明 |
---|---|---|
element,element | div,p | 选择所有 <div> 元素和所有 <p> 元素。 |
element element | div p | 选择 <div> 元素内部的所有 <p> 元素。包括子孙后代。 |
element>element | div>p | 选择父元素为 <div> 元素的所有 <p> 元素。只包括子代。 |
element+element | div+p | 选择紧接在 <div> 元素之后的所有 <p> 元素。同辈元素。 |
示例:
css选择器策略 | 示例 | 说明 |
---|---|---|
需要使用 > 或 空格表示层级关系 | 语法 | |
父标签名[父标签属性名=属性值]>子标签名 | p#p1>input | 定位id属性值为p1的<input>元素 |
父标签名[父标签属性名=属性值] 子标签名 | p#p1 input | 同上 |
5、css索引定位
css选择器策略 | 示例 | 说明 |
---|---|---|
:only-child | p:only-child | 选择属于其父元素的唯一子元素的每个 <p> 元素。 |
:nth-child(n) | p:nth-child(2) | 选择属于其父元素的第二个子元素的每个 <p> 元素。 |
:nth-last-child(n) | p:nth-last-child(2) | 同上,从最后一个子元素开始计数。 |
:nth-of-type(n) | p:nth-of-type(2) | 选择属于其父元素第二个 <p> 元素的每个 <p> 元素。 |
:nth-last-of-type(n) | p:nth-last-of-type(2) | 同上,但是从最后一个子元素开始计数。 |
6、css逻辑运算定位
css选择器策略 | 逻辑定位 | |
---|---|---|
示例 | 标签名[属性名1=属性值1][属性名2=属性值2] | |
示例 | input[type='telA'][placeholder='电话A'] | |
说明 | 同时匹配多个属性 |
7、css元素状态定位
选择器 | 例子 | 例子描述 |
---|---|---|
:empty | p:empty | 选择没有子元素的每个 <p> 元素(包括文本节点)。 |
:target | #news:target | 选择当前活动的 #news 元素。 |
:enabled | input:enabled | 选择每个启用的 <input> 元素。 |
:disabled | input:disabled | 选择每个禁用的 <input> 元素 |
:checked | input:checked | 选择每个被选中的 <input> 元素。 |
:not(selector) | :not(p) | 选择非 <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_element_by_* 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']
最好我这里给你们分享一下我所积累和真理的文档和学习资料有需要是领取就可以了
来自:https://zhuanlan.zhihu.com/p/571510714
标签:xpath,定位,标签,最全,元素,css,节点,CSS,属性 From: https://www.cnblogs.com/lhxsoft/p/18319664