【06】Selenium+Python 定位动态ID

有时候页面元素的ID是动态变化的,这种变化的ID,无法通过By.ID来定位,也无法通过BY.XPATH的绝对路径来定位

比如此li标签的id,中间的数字部分就是变化的,刷新页面后,id中间部分的数字就会变化

刷新页面前ID:

刷新页面后ID:

这种动态ID可以使用部分属性值匹配来定位

xpath中提供了四个非常好的方法来为我们定位部分属性值:

1、contains(a, b) 如果a中含有字符串b,则返回true,否则返回false

示例代码

python 复制代码
    #判断ID中包含'-0-0'
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(
            (By.XPATH, "//li[contains(@id, '-0-0')]"))).click()

2、starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false

示例代码

python 复制代码
    #判断ID以'cascader-menu-'开头
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(
            (By.XPATH, "//li[starts-with(@id, 'cascader-menu-')]"))).click()

也可以组合使用

python 复制代码
#判断id以'cascader-menu-'开头,并且id中包含'-0-0'
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(
            (By.XPATH, "//li[starts-with(@id, 'cascader-menu-') and contains(@id, '-0-0')]"))).click()

3、ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false(不推荐此方法)

示例代码

此方法未运行成功,百度了一下原因:ends-with方法是xpath 2.0的语法,而浏览器只支持xpth 1.0,所以不能成功运行

可以用第4点的substring 和 string-length 组合使用替代此方法,substring 和 string-length 组合使用,同样可以检查ID是否以 某字符串 结尾

python 复制代码
    #判断ID以'-0-0'结尾
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(
            (By.XPATH, "//li[ends-with(@id, '-0-0')]"))).click()

4、substring 和 string-length 组合用来检查ID是否以 某字符串 结尾

示例代码

python 复制代码
 #判断id以'-0-2'结尾
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(
            (By.XPATH, "//li[substring(@id, string-length(@id) - string-length('-0-2') + 1) = '-0-2']"))).click()
相关推荐
apocelipes11 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户83562907805112 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
ClouGence13 小时前
Selenium、Playwright、CueCast 深度对比:Web 自动化测试工具怎么选
selenium·测试
MeixianAgent17 小时前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m62520 小时前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python
SelectDB2 天前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
荣码2 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵2 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li2 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸3 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程