在只能通过xpath定位的情况下,最好选择相对定位,相对定位一脸懵逼的朋友,可以看完下面的内容,相对定位就不迷茫了。
点击F12-查看器在输入框里可以边写边检测自己是否写对
看完下面的语法知识,找个页面自己练习一下,半个小时基本就可以了解了。
1.基本语法
1.1 路径以“/”开始 表示找到满足该绝对路径的元素;
1.2 路径以“//”开始 表示找到文档中所有满足“//”后规则的元素 如//BBB 表示找到所有BBB元素;
1.3 * 表示所有 如//* 表示选择所有元素;
1.4 [表达式] 进一步限定元素:①[数字] 表示选择第几个, 其中[last()]表示最后一个;②[@属性] 限定满足该属性 ,如//BBB[@name] 表示含有name属性的BBB元素,//BBB[not(@*)]表示所有没有属性的BBB元素;拓展,属性赋值,如 /BBB[@name=“yyy”] 表示所有含有name属性且其值为“yyy”的BBB元素;
1.5 | 逻辑或 将多个路径合并到一起 如//BBB | /AAA 选择所有BBB元素和根元素AAA [可合并的路径数目没有限制]
2.1使用标签名+节点属性定位
语法://标签名[@属性名=属性值]
例如://input[@id=‘password’]
2.2.组合元素索引(下标)定位
例如://input[@id=‘password’]/div[1]
2.3.通过部分属性值匹配
语法://标签名[contains(@属性名,部分属性值)]、//标签名[starts-with(@属性名,部分属性值)]、//标签名[ends-with(@属性名,部分属性值)]
a.starts-with 例子: //input[starts-with(@id,‘ctrl’)] 解析:匹配以 ctrl开始的属性值
b.ends-with 例子://input[ends-with(@id,’_userName’)] 解析:匹配以 userName 结尾的属性值
c.contains() 例子://input[contains(@id,‘userName’)] 解析:匹配含有 userName 属性值
: *在一起会变成表情,大家注意一下
//following-sibling:???? # 定位当前元素的同级
例如://div[contains(text(),“合作伙伴”)]//following-sibling::
*/div/input
2.4.使用文本内容匹配
函数:text()
语法:文本全部匹配://标签名[text()=文本内容]
文本部分匹配-包含://标签名[contains(text(),部分文本内容)]
示例代码如下:
driver.find_element_by_xpath("//a[text(),“退出”]")#文本全部匹配
driver.find_element_by_xpath("//a[contains(text(),“出”)])#文本部分匹配
2.5、使用轴定位表达式
轴运算名称:
ancestor:祖先节点,包括父节点
parent:父节点
preceding:当前元素节点标签之前的所有节点(HTML页面之前的)
preceding-sibling:当前元素节点标签之前的所有兄弟节点(同级)
following:当前元素节点标签之后的所有节点
following-sibling:当前元素节点标签之后的所有兄弟节点(同级)
使用语法:轴名称::节点名称
前后的定位与之前一致,用/隔开即可。
例如://div[contains(text(),“合作伙伴”)]//following-sibling:????/div/input
定位文本包含合作伙伴的元素同一级下的div下的input