🔦 定位语法
定位语法用于指明以哪种方式去查找指定元素,语法简洁明了,熟练使用可大幅提高程序可读性。
所有涉及获取元素的操作都可以使用定位语法,如ele()
、actions.move_to()
、wait.eles_loaded()
、get_frame()
等等。
定位语法用于简化代码,提高可读性,但并不覆盖所有复杂场景。很复杂的场景可直接用 xpath 查找。
以下使用这个页面进行讲解。
<html>
<body>
<div id="one">
<p class="p_cls" id="row1" data="a">第一行</p>
<p class="p_cls" id="row2" data="b">第二行</p>
<p class="p_cls">第三行</p>
</div>
<div id="two">
第二个div
</div>
</body>
</html>
✅️️ 基本概念
几乎所有查找方法都是基于元素属性进行。
元素属性包括以下三种:
写法 | 说明 | 示例 |
---|---|---|
@tag() | 标签名 | 即<div id="one"> 中的div |
@**** | 标签体中的属性 | 如<div id="one"> 中的id ,写作'@id' |
@text() | 元素文本 | 即<p class="p_cls">第三行</p> 中的第三行 |
查找语法就是按需要对这三种属性进行组合,达到查找指定元素的目的。
@tag()
和@text()
后面加上'()'
,是为了避免与普通元素冲突(如<div text="abc">
)。
📌 简单示例
tab.ele('@id=one') # 获取第一个id为one的元素
tab.ele('@tag()=div') # 获取第一个div元素
tab.ele('@text()=第一行') # 获取第一个文本为“第一行”的元素
✅️️ 基本逻辑
📌 单属性匹配符 @
单个@
在只以一个属性作为匹配条件时使用,以'@'
开头,后面跟属性名称。
上面简单示例中就是这种方式:tab.ele('@id=one')
。
如果@
后面只有属性名而没有属性值,查找有这个属性的元素,如'tab.ele(@id)'
。
如果属性中包含特殊字符(如包含@
),用这个方式不能正确匹配到,需使用 css selector 方式查找。且特殊字符要用\
转义。
📌 多属性与匹配符 @@
当需要多个条件同时确定一个元素时,每个属性用'@@'
开头。
- 匹配文本或属性中出现
@@
、@|
、@!
时,不能使用多属性匹配,需改用 xpath 的方式。 - 如果属性中包含特殊字符(如包含
@
),用这个方式不能正确匹配到,需使用 css selector 方式查找。且特殊字符要用\
转义。
示例:
ele = tab.ele('@@class=p_cls@@text()=第三行') # 查找class为p_cls且文本为“第三行”的元素
📌 多属性或匹配符 @|
当需要以或关系条件查找元素时,每个属性用'@|'
开头。
- 匹配文本或属性中出现
@@
、@|
、@!
时,不能使用多属性匹配,需改用 xpath 的方式。 - 如果属性中包含特殊字符(如包含
@
),用这个方式不能正确匹配到,需使用 css selector 方式查找。且特殊字符要用\
转义。
示例:
eles = tab.eles('@|id=row1@|id=row2') # 查找所有id为row1或id为row2的元素
📌 否定匹配符 @!
用于否定某个条件。
如果@!
后面只有属性名而没有属性值,查找没有这个属性的元素。
示例:
ele = tab.ele('@!id=one') # 获取第一个id不等于“one”的元素
ele = tab.ele('@!class') # 匹配没有class属性的元素
📌 混合使用
@@
和@|
不能同时出现的查找语句中,即一个查找语句只能是与关系或者或关系。
@!
则可与两者混合使用。混用时,与还是或关系视@@
还是@|
而定。
当语句中有多个tag()
时,如果全部都没有被@!
修饰,它们是与关系;如有任一个被@!
修饰,它们是或关系。
tag()
与其他属性之间是与关系。
示例:
# 匹配class等于p_cls且id不等于row1的元素
tab.ele('@@class=p_cls@!id=row1')
# 匹配class等于p_cls或id不等于row1的元素
tab.ele('@|class=p_cls@!id=row1')
✅️️ 匹配模式
匹配模式指某个查询中匹配条件的方式,有精确匹配、模糊匹配、匹配开头、匹配结尾四种。
tag()
属性无论用哪种匹配模式,都会视作=
。