Xpath定位方法
1.根据路径定位
#绝对路径:以/开头从html开始一级一级往下写
driver.find_element_by_xpath('路径') #选中元素->右击->copy full xpath
#相对路径:以//开头 路径[第几个符合条件的元素]
2.利用元素属性定位
//标签名[@属性名=属性值]
标签名为* 匹配所有标签名
3.属性与逻辑结合定位
#结合多个属性定位
//标签名[@属性名1=属性值1 and @属性名2=属性值2...]
#如果遇到class,值算一个整体,class属性值多个时不能只写一个属性值
4.层级与属性相结合
#通过其他元素进行定位
//路径.../标签名[@属性名=属性值]
5.向上查找
#.. 查找上一级
#ancestor 向上查找,所有父辈,可以结合属性查找
ancestor::标签名
--------------------------------------------------------------
例如:
ancestor::div[@role="dialog"]
6.通过文本查找
//标签名[text()=文本值]
----------------------------------------------------------------
例:
//a[text()="网站"]
7.节点信息(属性值或文本值)模糊查找
//标签名[contains(@属性名,属性值)]
//a[contains(@id,"AA")]
8.查找以XX开头的元素
适用于某属性开头固定,后面元素变化
//标签名[starts-with(@属性名,属性值)] #字符串要双引号
查找范围
通过层级关系查找,分2种,/ 或者 //分隔
路径中间以/分隔代表直接在子元素中查找
路径中间以//分隔代表在所有的后代元素中查找
查找特定元素
-
查找最后一个元素
标签名[last()]
-
定位的元素,文本中包含空格
//标签名[normalize-space(.)='去除空白后的文本'] #.表示当前节点,可能定位不到,推荐第二种写法 或 //标签名[normalize-space(text())='去除空白后的文本']
Xpath总结
部分 | 描述 | 是否必须 | 格式 |
---|---|---|---|
第一部分 | 开头部分 | 必须 | /或// |
第二部分 | 标签部分 | 必须 | *或指定标签 |
第三部分 | 节点信息部分 | 非必须 | 如果有的话用[]括起来,可以是属性或者文本,多个用and连接 |
第四部分 | 层级部分 | 非必须 | 层级之间用/或//分隔 |
Xpath轴定位
- 子节点轴(child::):选择指定节点的所有直接子节点。
//div/child::p #选择所有div节点的直接子节点中的p节点
- 父节点轴(parent::):选择指定节点的父节点。
//p/parent::div #选择所有p节点的父节点中的div节点
- 兄弟节点轴(following-sibling::、preceding-sibling::):选择指定节点之后或之前的所有同级节点。
//div/following-sibling::p #选择div节点之后的所有同级p节点
//p/preceding-sibling::span #选择p节点之前的所有同级span节点
- 祖先节点轴(ancestor::):选择指定节点的所有祖先节点。
//p/ancestor::div #选择所有p节点的祖先中的div节点
- 后代节点轴(descendant::):选择指定节点的所有后代节点。
//div/descendant::p #选择所有div节点的后代中的p节点
- 属性节点轴(attribute::):选择指定节点的属性节点。
//@class #选择所有节点的class属性
- 自身节点轴(self::):
//div/self::div #选择div节点本身。
- 同级节点轴(following::、preceding::):
//div/following::p #选择div节点之后的同级p节点
//p/preceding::span #选择p节点之前的同级span节点
- 命名空间节点轴(namespace::):
//namespace::* #选择文档中所有命名空间节点
- 前一个文档节点轴(preceding::):
//div/preceding::node() #选择div节点之前的所有节点。
- 后一个文档节点轴(following::):
//div/following::node() #选择div节点之后的所有节点。
- 默认命名空间轴(default namespace::):
//default namespace::* #选择文档的默认命名空间。