xpath —— 父子、兄弟、相邻节点定位方式详解

2023-05-16

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1. 由父节点定位子节点

最简单的肯定就是由父节点定位子节点了,我们有很多方法可以定位,下面上个例子:

对以下html代码

<html>
    <body>
        <div id="A">
            <!--父节点定位子节点-->
            <div id="B">
                <div>parent to child
                </div>
            </div>
        </div>
    </body>
</html>

想要根据 B节点 定位无id的子节点,代码示例如下:

# -*- coding: utf-8 -*-
from selenium 
import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.串联寻找
print driver.find_element_by_id('B').find_element_by_tag_name('div').text
# 2.xpath父子关系寻找
print driver.find_element_by_xpath("//div[@id='B']/div").text
# 3.css selector父子关系寻找
print driver.find_element_by_css_selector('div#B>div').text
# 4.css selector nth-child
print driver.find_element_by_css_selector('div#B div:nth-child(1)').text
# 5.css selector nth-of-type
print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text
# 6.xpath轴 child
print driver.find_element_by_xpath("//div[@id='B']/child::div").text driver.quit()

第1到第3都是我们熟悉的方法,便不再多言。第4种方法用到了css选择器:nth-child(n),该选择器返回第n个节点,该节点为div标签;第5种方法用到了另一个css选择器: nth-of-type(n),该选择器返回第n个div标签,注意与上一个选择器的区别;第6种方法用到了xpath轴 child,这个是xpath默认的轴,可以忽略不写,其实质是跟方法2一样的。

当然,css中还有一些选择器是可以选择父子关系的如last-childnth-last-child等,感兴趣可以自行百度,有机会博主会讲讲css selector。

2. 由子节点定位父节点

由子节点想要定位到父节点就有点难度了,对以下html代码:

<html>
    <body>
        <div id="A">
            <!--子节点定位父节点-->
            <div>
                <div>child to parent
                    <div>
                        <div id="C">
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>

我们想要由 C节点 定位其两层父节点的div,示例代码如下:

# -*- coding: utf-8 -*-
from selenium 
import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath: `.`代表当前节点; '..'代表父节点
print driver.find_element_by_xpath("//div[@id='C']/../..").text
# 2.xpath轴 parent
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text
driver.quit()

这里我们有两种办法,第1种是 .. 的形式,就像我们知道的,. 表示当前节点,.. 表示父节点;第2种办法跟上面一样,是xpath轴中的一个:parent,取当前节点的父节点。这里也是css selector的一个痛点,因为css的设计不允许有能够获取父节点的办法(至少目前没有)

3. 由弟弟节点定位哥哥节点

这是第3、第4种情况,我们这里要定位的是兄弟节点了。如以下html:

<html>
    <body>
        <div>
            <!--下面两个节点用于兄弟节点定位-->
            <div>brother 1
            </div>
            <div id="D">
            </div>
            <div>brother 2
            </div>
        </div>
    </body>
</html>

怎么通过 D节点 定位其哥哥节点呢?看代码示例:

# -*- coding: utf-8 -*-
from selenium 
import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text
# 2.xpath轴 preceding-sibling
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
driver.quit()

这里博主也列举了两种方法,一种是通过该节点的父节点来获得哥哥节点,另外一种比较优雅,是通过 xpath轴:preceding-sibling,其能够获取当前节点的所有同级哥哥节点,注意括号里的标号,1 代表着离当前节点最近的一个哥哥节点,数字越大表示离当前节点越远,当然,xpath轴:preceding也可以,但是使用起来比较复杂,它获取到的是该节点之前的所有非祖先节点(这里不太好解释,改天专门写篇博文讲解下所有的轴)

4. 由哥哥节点定位弟弟节点

html 与 3 一致,要想通过 D节点 定位其弟弟节点,看代码示例:

# -*- coding: utf-8 -*-
from selenium 
import webdriver
driver = webdriver.Firefox()
driver.get(
'D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
# 3.xpath轴 following
print driver.find_element_by_xpath("//div[@id='D']/following::*").text
# 4.css selector +
print driver.find_element_by_css_selector('div#D + div').text
# 5.css selector ~
print driver.find_element_by_css_selector('div#D ~ div').text
driver.quit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xpath —— 父子、兄弟、相邻节点定位方式详解 的相关文章

  • nextcloud 没有安装 “smbclient“. 无法挂载 “SMB / CIFS“

    Centos7安装apt get 第一步就是下载apt get curl https raw githubusercontent com dvershinin apt get centos master apt get sh o usr l
  • RedHat/CentOS8【OpenSSL】制作自签证书和 HTTPS 配置

    1 OpenSSL 制作自签名证书 1 1 第一阶段 xff1a 制作 CA 根证书 1 2 第二阶段 xff1a 制作服务器证书 1 3 第三阶段 xff1a 制作客户端证书 xff08 双向认证使用 xff09 2 Web 容器配置 H
  • centos安装horizon client

    https blog 51cto com chelaoer 4741839 CentOS 6 6安装Horizon View Client3 4 转载 圪蹴哈么2021 12 03 14 33 40博主文章分类 xff1a 运维 文章标签c
  • 构造函数的4种使用方式总结

    我们无法像调用成员函数那样使用对象来调用构造函数 xff0c 因为在构造函数构造出对象之前 xff0c 对象是不存在的 xff0c 因此构造函数被用来创建对象 xff0c 而不能通过对象来调用 C 43 43 提供了多种使用构造函数初始化创
  • 干线协议(802.1q/ISL)

    干线协议 802 1q交换机针对vlan tag数据帧的处理 ISL 802 1q 一台交换机收到一个数据帧 需要判断其属于哪一个vlan 有两种方法 1 让数据帧带上vlan tag 通过识别tag得知所属vlan 2 给交换机一张表 表
  • Python使用集合将txt文件重复行去除

    最近爬取了百度百科一些关键词的infobox xff0c 由于关键词也是从百度百科页面大量爬取的 xff0c 其中有诸多重复 xff0c 于是使用集合将重复的关键词去掉 xff0c 此方法也适用于其他类型重复行的去除 span class
  • Linux常用命令之软件包管理

    软件包管理 软件包分类 源码包 直接可以看到源码 需要手动编译 安装速度慢 脚本安装包 xff08 部分源码包将安装过程写成脚本 xff0c 交互式安装 xff09 二进制文件包 RPM 系统默认包 已经编译好 安装速度快 rpm命令管理
  • 【Windows11】麦克风不能用、扬声器不能用的解决办法

    这是一个目录0 0 前言扬声器不能用的解决办法麦克风不能用的解决办法 前言 最近笔者刚买的麦克风和扬声器 xff0c 插到电脑上居然不能用 一通排查之后发现原来是Windows系统内的一个设置不对 xff0c 下面是具体解决办法 xff08
  • python django mysql语句增删改查+报错execute() takes from 2 to 3 positional arguments but 4 were given

    python django框架 xff0c 进行增删改查语句 xff1a 1 查询 xff08 1 xff09 正确的写法如下 xff0c cursor execute那句 sql的所有参数 xff0c 应该都写到中括号里面 xff0c 以
  • 方法的形参和实参

    引用博客 博客 何为形参 实参 xff1a 方法定义时的参数称为形式参数 xff0c 简称形参 xff1b 方法调用时的传入参数称为实际参数 xff0c 简称实参 xff1b 实参和形参的类型要一致或兼容 个数 顺序必须一致 例如 span
  • 在linux(debian/ubuntu)中idea的插件默认安装位置和配置文件在哪里?亲测可用

    在 home 当前用户名 config JetBrains IntelliJIdea2020 具体版本号 options 目录下 我的debian10 其他的linux系统应该也在相同的位置
  • 中国电信修改光猫路由模式为桥接模式

    首先 需要搞到超级管理员的账号和密码 可以上网根据光猫型号查找 也可以直接跟安宽带的工作人员要 第一步 准备超级管理员账号和密码 可以自行根据光猫型号搜索 也可以直接跟安宽带的工作人员要 第二步 使用超级管理员账密登录网关管理页面 光猫 一
  • maven官网应该下载binary还是sources

  • Linux(Debian11)iptables放行所有端口

    iptables P INPUT ACCEPT iptables P OUTPUT ACCEPT iptables P FORWARD ACCEPT
  • mysql日期加一天

    使用函数 date add 日期 interval 1 day 即可 select DATE ADD 39 2022 02 24 09 03 36 39 INTERVAL 1 DAY select DATE ADD 39 2022 02 2
  • Debian安装mysql

    Debian 10系统中默认使用了MariaDB xff0c 在APT的软件源中并没有mysql 所以 xff0c Debian 10 如果要安装mysql xff0c 需要下载安装Mysql APT Repository xff0c 更新
  • mysql设置忽略大小写

    在连接数据库的时候发现库里有表的名字只是大小写不一样 xff0c 但就是连不上 xff0c 我用的是mysql5 7 8 默认没有开启忽略大小写 xff0c 这里记录一下 1 查看数据库大小写配置 show variables like 3
  • Linux(debian)常用代理设置

    不管实在开发还是在日常使用中 xff0c 梯子是必不可少的工具 xff0c 但是在linux系统中 xff0c 有时候操作起来不是那么方便 xff0c 于是在此做个笔记 0x01 环境变量设置 设置代理 xff1b echo 39 expo
  • linux(Debian11)安装后安装无线网卡等驱动

    在工作和生活中 xff0c 我们经常会用到linux系统 xff0c debian作为一个老牌的程序员常用发行版 xff0c 自然成为我们的首选 下面记录一下 xff0c 安装无线网卡的过程 首先 xff0c 可以通过命令查看自己所需要的驱
  • 基于深度学习的知识追踪研究进展 Research Advances in the Knowledge Tracing Based on Deep Learning

    8 基于深度学习的知识追踪研究进展 Research Advances in the Knowledge Tracing Based on Deep Learning 摘要 xff1a 知识追踪是教育数据挖掘领域的一个重要研究方向 xff0

随机推荐

  • Tomcat控制台弱密码漏洞

    文章目录 一 漏洞介绍1 1 漏洞原理1 2 影响版本1 3 触发条件 二 环境搭建2 1 环境信息2 2 tomcat配置2 3 配置漏洞环境 三 攻击过程3 1 控制台弱密码3 2 冰蝎控制 四 漏洞修复 一 漏洞介绍 1 1 漏洞原理
  • linux(debian11)系统安装那些事儿--没有无线网需要安装无线网卡驱动双显卡等问题

    linux在日常的工作和生活中是经常用到的 xff0c 在安装的时候 xff0c 和windows不太一样 xff0c 有些驱动是需要我们自己手动安装的 xff0c 但是也并不麻烦 这里记录一下 xff0c 一种很简单的安装intel无线网
  • java线程编排CompletableFuture

    在开发中偶尔也会需要用到线程编排 比如查询商品数据 查询商品规格信息和商品图片耗时分别是1 2s和5s 如果是异步执行 那么就可以使用5s完成查询了 而不是6 2s 这里记录一下 CompletableFuture完成线程编排 import
  • dump数据库导表线上服务无响应

    有时候 有些场景下 我们需要拷贝线上的数据 进行本地测试 如果你用的是dbeaver工具操作数据库 在拷贝数据库的时候容易导致服务器没响应 看服务正常运行 但是前端访问就是没反应 服务器也没欠费 这是什么情况呢 就是mysql在进行dump
  • 多线程之如何设计线程数量

    创建多少线程合适 xff0c 要看多线程具体的应用场景 一般来说 xff0c 我们可以将程序分为 xff1a CPU密集型程序和I O密集型程序 xff0c 而针对于CPU密集型程序和I O密集型程序 xff0c 其计算最佳线程数的方法是不
  • P1825 [USACO11OPEN]Corn Maze S 题解

    这道题就是一道普通的搜索题 xff0c 非常非常普通 xff0c 普通的不能再普通那种 xff0c 和以前的bfs一样 xff0c 不过这个bfs要注意一个特判 xff0c 当弹出的那个元素的是大写字母的时候 xff0c 要窜梭到对应的大写
  • 向CentOS7虚拟机中复制文件报错error when getting information

    xff08 安装过程中 xff0c 所有询问 xff0c 都是 yes 或者按 Enter 同意默认路径 xff0c 其中的一个要注意的见下图 xff09
  • 程序设计思维与实践week12作业

    文章目录 A 必做题 1 HDU 1029描述输入输出样例想法代码 B 必做题 2 POJ 2251描述输入输出样例想法代码 C 必做题 3 HDU 1024描述东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 输入输
  • nginx安装时/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthroug

    nginx安装时 ngx murmurhash c 37 11 error this statement may fall through Werror 61 implicit fallthroug如图报错 nginx 1 8 objs M
  • vmware如何把虚拟机和本地主机如何设置在同一网段

    我的本地系统是win10系统 xff0c 其它系统方法没试过 xff0c 应该差不多 一 前提是你此时已经安装好了vmware与操作系统了 二 首先在本地系统上操作 xff1a 1 2 3 4 右键该选择查看属性 ip4 不用做其它操作 5
  • 树莓派3B+指南(十五)omxplayer的安装与使用

    omxplayer的安装与使用 需要用python来控制播放视频 xff0c 所以就找到了这个播放器 xff0c 很好用 看了官网文档 xff0c 安装使用都写的比较明白了 官网地址 xff1a https python omxplayer
  • 使用ffmpeg将实时流保存为AVI

    项目中需要将编码器编码出的H264数据保存为avi格式文件 使用ffmpeg接口进行实现 ffmpeg一般是直接打开本地视频文件 如avi mp4等 或者网络视频流 如 xff1a rtmp流媒体等 xff0c 只需要直接将本地视频文件名或
  • 电脑发热严重:禁用独立显卡(Nvidia)/ TLP解决cpu占用率大

    引言 CPU温度经常居高不下 xff0c 每天风扇嗡嗡响 xff0c 尝试过许多办法都没有解决 xff0c 最后用了一个工具 xff0c 并禁用独显 xff0c 明显改善 xff01 1 禁用独立显卡 参考 xff08 真正帮我解决问题的方
  • 网易云音乐网络问题修复 (加载失败)

    问题 网易云一切网络功能正常 xff0c 唯有在线播放时出现问题 xff0c 提示加载失败 问题解决 查看log xff0c 发现是不能建立到m7 music 126 net 原因不知道 联系舍友问能不能听歌 xff0c 舍友说可以 xff
  • ibus-setup-sunpinyin 打不开

    ibus setup sunpinyin 打不开 提示 Traceback most recent call last File 34 usr share ibus sunpinyin setup main py 34 line 42 in
  • 编译原理 Tiny编译器和TM虚拟机

    编译器与解释器的设计流程 编译器前端部分 词法分析 字符流 gt 记号流 词法分析也称作扫描 xff0c 是编译器的第一个步骤 xff0c 词法分析器读入组成源程序的字符流 xff0c 并且将它们组织成为有意义的词素的序列 xff0c 对于
  • Markdown emoji 收藏

    表情符的使用 人物 syntaxpreviewsyntaxpreviewsyntaxpreview bowtie bowtie smile x1f604 laughing x1f606 blush x1f60a smiley x1f603
  • Powershell中解决win10无法打开设置等应用问题

    在powershell中 选择run as administer 输入 Get AppxPackage AllUsers Foreach Add AppxPackage DisableDevelopmentMode Register spa
  • Arduino设计 有害气体检测小车

    有害气体检测小车 从代码已经可以看得出电路应该怎么接了 具体电路就不放上来了 Arduino控制部分代码 span class token macro property span class token directive keyword
  • xpath —— 父子、兄弟、相邻节点定位方式详解

    1 由父节点定位子节点 最简单的肯定就是由父节点定位子节点了 xff0c 我们有很多方法可以定位 xff0c 下面上个例子 xff1a 对以下html代码 span class token tag span class token tag