汇总selenium利用xpath等找网页节点的方法

一、通过子节点定位父节点,模拟建立一个test.html

html 复制代码
<!--子节点定位父节点-->
<html>
<body>
<div id="A">
    <div>定位到这里1
        <div>定位到这里2
            <div>定位到这里3
                <div id="C">子节点</div>
            </div>
        </div>
    </div>
</div>
</body>
</html>

直接上代码

html 复制代码
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('D:\\LC\\PycharmProjects\\xpath_css_dingwei\\test.html')
#  .代表当前节点, ..代表父节点
node=driver.find_element(By.XPATH,'//div[@id="C"]/../..')
str=node.text
print(str)#会输出父节点内所有的文本
str_list=str.split('\n')
print(str_list)#如想只输出指定父节点内的文本,先拆分str,然后指定输出,如str_list[0]


# node=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@id="C"]/../..')))
# print(node.text)

driver.quit()

输出结果:

二、利用节点属性来定位,模拟建立一个login.html

html 复制代码
<button onclick="alert('你点击了按钮')" data-var="loginBtn" 
        data-type="click_navMembership" data-path="sign in" 
        class="nav-btn p0-sm body-3 u-bold ml2-sm mr2-sm" 
        data-pre="ILink">
    <span>登录</span>
</button>

利用节点的指定属性来定位,代码如下

html 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Chrome()
driver.get('D:\\LC\\PycharmProjects\\xpath_css_dingwei\\login.html')

#利用某个指定属性来定位,如data-var属性
button = WebDriverWait(driver, 5).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@data-var='loginBtn']"))
)
button.click()
time.sleep(5)

driver.quit()

如果一个属性下有多个值,比如class="nav-btn p0-sm body-3 u-bold ml2-sm mr2-sm" 怎么办呢?

第一种,必须将所有的值都写上才能定位成功。

html 复制代码
button = WebDriverWait(driver, 5).until(
     EC.element_to_be_clickable((By.XPATH, "//button[@class='nav-btn p0-sm body-3 u-bold ml2-sm mr2-sm']"))
)

第二种,只需要填一个值就行(其实填包含于就行,如"//buttoncontains(@class,'nav-btn p0-')")

html 复制代码
button = WebDriverWait(driver, 5).until(
     EC.element_to_be_clickable((By.XPATH, "//button[contains(@class,'nav-btn')]"))
)

第三种,有时可能只需要选择其中几个值,此时需要使用and

html 复制代码
button = WebDriverWait(driver, 5).until(
     EC.element_to_be_clickable((By.XPATH, "//button[contains(@class,'p0-sm') and contains(@class,'ml2-sm')]"))
)

三、利用节点文本来定位,仍使用login.html测试代码

html 复制代码
#本段代码为示例代码,与login.html无关
#新selenium中,find_element_by_xpath已经无法使用,需要By.XPATH替代
driver.find_element_by_xpath('//a[text()="使用电子邮件登录。")]')
或者
driver.find_element(By.XPATH, '//a[contains(text(), "下一页")]')

下面实测:仍使用login.html测试代码如下:

html 复制代码
#完美运行,模糊包含定位。注意button内部还有span,不能省略掉span
button = WebDriverWait(driver, 5).until(
     EC.element_to_be_clickable((By.XPATH, '//button/span[contains(text(), "登录")]'))
)

不过以下精确匹配代码却报错,仍未解决,期待博友指教。

html 复制代码
button = WebDriverWait(driver, 5).until(
      EC.element_to_be_clickable((By.XPATH, '//button/span[text()="登录")]'))
)

节点定位花样非常多,后续继续写。

2023/9/15继续更新:针对上述问题,我又设置了个login_2.html,增加了一个标签<a>

复制代码
<button onclick="alert('你点击了按钮')" data-var="loginBtn" 
        data-type="click_navMembership" data-path="sign in" 
        class="nav-btn p0-sm body-3 u-bold ml2-sm mr2-sm" 
        data-pre="ILink" myname="prev_12345678">
    <span>登录</span>
</button>
<a href="http://www.baidu.com">百度搜索</a>

采用文本精确匹配定位,程序运行正确。

复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('D:\\LC\\PycharmProjects\\xpath_css_dingwei\\login_2.html')
node=driver.find_element(By.XPATH,"//a[text()='百度搜索'] ")
node.click()


time.sleep(5)
driver.quit()

文本精确匹配定位,测试button,实测也是正确的。

复制代码
#文本精确匹配定位
node_button=driver.find_element(By.XPATH,"//button/span[text()='登录'] ")
node_button.click()
相关推荐
LT101579744410 小时前
2026年在线兼容性测试工具推荐|零部署网页 / APP / 小程序实测对比
测试工具·小程序
疯狂的魔鬼16 小时前
精确计算容器剩余视口高度:useAutoContainerFullHeight 的工程实践
前端·css·typescript
用户0595401744616 小时前
用了 3 个月 ChatGPT,才发现它一直在遗忘——用 Playwright 自动化验证记忆存储一致性
前端·css
spmcor16 小时前
CSS 黏性定位完全指南:从入门到精通
css
用户0595401744616 小时前
用了半年 LangChain Memory,才发现回滚测试压根没测对
前端·css
程序员杰哥16 小时前
接口自动化测试项目框架详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
灵翼飞航科技有限公司1 天前
2026款WF-EN系列多功能发动机测试台(适用DLE、林巴赫、Rotax等发动机)
功能测试·测试工具·无人机
丨我是张先生丨1 天前
日语单词 Web Page
前端·css·css3
吃西瓜不吐籽_2 天前
2026 届前端校招冲刺:2 万字高频面试题库(含详解、追问与评分标准)
前端·javascript·css·typescript·前端框架·es6
Csvn3 天前
CSS :has() 选择器实战:没有它之前我们写了多少冗余 JS
前端·css