selenium之批量删除按钮操作

具体需求:
需要将某个列表项目中只保留一条数据,但是不确定有没有,所以需要先判断列表中有没有数据,
如果有数据查看是否大于1条,大于1条则删除到只有1条,只有一条则直接进行修改操作;
如果没有数据,则点击添加按钮,添加一条数据;

定位元素如下:

//[@id=“app”]/div[1]/div[2]/div/main/main/form/section[3]

//[@id=“app”]/div[1]/div[2]/div/main/main/form/section[3]/div[3]/div/div/div[1]/div[1]/div[5]/div[2]/table/tbody/tr[1]/td[8]/div/div/button[2]

[@id=“app”]/div[1]/div[2]/div/main/main/form/section[3]/div[3]/div/div/div[1]/div[1]/div[5]/div[2]/table/tbody/tr[2]/td[8]/div/div/button[2]

三个定位元素,第一个是section,后面两个是删除按钮,先统计删除按有几个,如果大于1个则删除所有且只保留第一个;如果只有一个按钮则不删除;使用selenium操作
以下是使用 Selenium 实现上述功能的 Python 代码示例:

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

# 初始化 WebDriver(请根据你的实际情况选择浏览器驱动)
driver = webdriver.Chrome()

# 访问目标页面
driver.get("你的目标页面URL")

# 等待section元素加载
section_xpath = '//*[@id="app"]/div[1]/div[2]/div/main/main/form/section[3]'
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, section_xpath)))

# 获取所有删除按钮
delete_button_xpath = '//*[@id="app"]/div[1]/div[2]/div/main/main/form/section[3]/div[3]/div/div/div[1]/div[1]/div[5]/div[2]/table/tbody/tr/td[8]/div/div/button[2]'
delete_buttons = driver.find_elements(By.XPATH, delete_button_xpath)

# 如果删除按钮数量大于1,删除所有且只保留第一个
if len(delete_buttons) > 1:
    for i in range(1, len(delete_buttons)):
        delete_buttons[i].click()
elif len(delete_buttons) == 1:
    print("只有一个删除按钮,不进行删除操作")

在这段代码中,我们首先初始化 WebDriver 并访问目标页面,然后等待包含删除按钮的 section 元素加载完毕。接着,我们通过 XPath 定位所有删除按钮并统计其数量。如果删除按钮数量大于 1,我们会删除所有按钮并保留第一个。如果只有一个删除按钮,我们则不进行任何删除操作。最后,关闭浏览器。
请确保你的 Selenium WebDriver 和浏览器驱动(如 ChromeDriver)已经正确安装,并替换代码中的 你的目标页面URL 为你实际的目标页面 URL。

实际代码运行后的报错:
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found in the current frame
遇到 StaleElementReferenceException 错误时,通常是因为页面的 DOM 发生了变化,导致之前找到的元素引用已经失效。可以通过重新查找元素来避免这个错误。以下是改进的代码示例:

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
from selenium.common.exceptions import StaleElementReferenceException

# 初始化 WebDriver(请根据你的实际情况选择浏览器驱动)
driver = webdriver.Chrome()

# 访问目标页面
driver.get("你的目标页面URL")

# 等待section元素加载
section_xpath = '//*[@id="app"]/div[1]/div[2]/div/main/main/form/section[3]'
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, section_xpath)))

# 获取所有删除按钮的XPath
delete_button_xpath = '//*[@id="app"]/div[1]/div[2]/div/main/main/form/section[3]/div[3]/div/div/div[1]/div[1]/div[5]/div[2]/table/tbody/tr/td[8]/div/div/button[2]'

try:
    while True:
        delete_buttons = driver.find_elements(By.XPATH, delete_button_xpath)
        
        # 如果删除按钮数量大于1,删除所有且只保留第一个
        if len(delete_buttons) > 1:
            for i in range(1, len(delete_buttons)):
                try:
                    delete_buttons[i].click()
                except StaleElementReferenceException:
                    # 元素引用过时,重新查找元素并重试
                    delete_buttons = driver.find_elements(By.XPATH, delete_button_xpath)
                    delete_buttons[i].click()
        elif len(delete_buttons) == 1:
            print("只有一个删除按钮,不进行删除操作")
            break
        else:
            # 没有找到任何删除按钮,跳出循环
            break

except StaleElementReferenceException as e:
    print(f"遇到错误:{e}")

# 关闭浏览器
driver.quit()

在这个代码示例中,我们使用了一个 while 循环来处理删除按钮的点击操作。每次点击后会重新查找删除按钮,确保引用是最新的。如果遇到 StaleElementReferenceException,则重新查找元素并重试点击操作。这样可以有效避免元素引用过时的问题。

再次报错内容: except StaleElementReferenceException: # 元素引用过时,重新查找元素并重试 delete_buttons = driver.find_elements(By.XPATH, delete_button_xpath) delete_buttons[i].click()报错:IndexError: list index out of rang

出现 IndexError: list index out of range 错误的原因是,在重新查找元素后,delete_buttons 的长度可能发生了变化,导致 i 超出列表的范围。要解决这个问题,可以在重新查找元素后,确保 i 仍然在新列表的范围内。以下是改进的代码:

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
from selenium.common.exceptions import StaleElementReferenceException
# 初始化 WebDriver(请根据你的实际情况选择浏览器驱动)
driver = webdriver.Chrome()

# 访问目标页面
driver.get("你的目标页面URL")

# 等待section元素加载
section_xpath = '//*[@id="app"]/div[1]/div[2]/div/main/main/form/section[3]'
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, section_xpath)))

# 获取所有删除按钮的XPath
delete_button_xpath = '//*[@id="app"]/div[1]/div[2]/div/main/main/form/section[3]/div[3]/div/div/div[1]/div[1]/div[5]/div[2]/table/tbody/tr/td[8]/div/div/button[2]'

try:
    while True:
        delete_buttons = driver.find_elements(By.XPATH, delete_button_xpath)
        
        # 如果删除按钮数量大于1,删除所有且只保留第一个
        if len(delete_buttons) > 1:
            for i in range(1, len(delete_buttons)):
                try:
                    delete_buttons[i].click()
                except StaleElementReferenceException:
                    # 元素引用过时,重新查找元素并确保索引有效
                    delete_buttons = driver.find_elements(By.XPATH, delete_button_xpath)
                    if i < len(delete_buttons):
                        delete_buttons[i].click()
                    else:
                        # 如果重新查找后索引无效,跳出循环
                        break
        elif len(delete_buttons) == 1:
            print("只有一个删除按钮,不进行删除操作")
            break
        else:
            # 没有找到任何删除按钮,跳出循环
            break

except StaleElementReferenceException as e:
    print(f"遇到错误:{e}")

# 关闭浏览器
driver.quit()

在这个改进版本中,如果捕获到 StaleElementReferenceException,会重新查找元素并检查 i 是否仍在新列表的范围内。如果 i 超出新列表的范围,则跳出循环,避免 IndexError。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/760030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鱼叉式钓鱼

鱼叉式网络钓鱼&#xff1a; 鱼叉式网络钓鱼是一种网络钓鱼形式&#xff0c;它针对特定个人或组织发送定制消息&#xff0c;旨在引发特定反应&#xff0c;例如泄露敏感信息或安装恶意软件。这些攻击高度个性化&#xff0c;使用从各种来源收集的信息&#xff0c;例如社交媒体资…

sky18流水线设计

1.最大时钟频率确定 时钟周期要大于等于组合逻辑的delay&#xff08;最大的那条delay&#xff09; Freq_max(Mhz) 1000/T_delay(ns); 数据吞吐率Throughput Freq_max *Toggle_rate;//Toggle_rate&#xff1a;如两个时钟&#xff0c;输入变一次&#xff0c;就是50%&#xff1b…

【考研408计算机组成原理】微程序设计重要考点指令流水线考研真题+考点分析

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 目录 微指令的形成方式 微指令的地址形成方式 对应考题 题目&#xff1a;微指令的地址形成方式 - 断定方式 解题思路&#xff1a; 答题&#xff1a; 分析考点&…

大模型系列课程学习-基于2080TI-22G魔改卡搭建双卡大模型训练平台(双系统)

1.选择合适的硬件配置 再配置电脑之前&#xff0c;需要确认自己需要的显存大小、主板、内存条、电源、散热等核心配件。经过前期调研&#xff0c;选择的硬件配置如下&#xff1a; &#xff08;1&#xff09;主板&#xff1a;华南X99_F8D(DDR4主板)&#xff0c;因为需要支持双卡…

1Panel运维利器:功能详解与实操指南

官网地址:https://1panel.cn/ 1Panel简介 1Panel是杭州飞致云信息科技有限公司旗下产品&#xff0c;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;于2023年3月推出。 名称&#xff1a;1Panel开源Linux面板 所属公司&#xff1a;杭州飞致云信息科技有限公司 编写语…

基于HarmonyOS NEXT开发智能提醒助手

目录 目录 目录 前言 关于HarmonyOS NEXT 智能提醒助手需求分析 智能提醒助手设计 1、系统架构 2、功能模块 智能提醒助手的应用场景 智能提醒助手的竞争力 具体技术实现 未来展望 结束语 前言 随着智能设备的普及和物联网技术的飞速发展&#xff0c;人们对于智能…

忙忙碌碌的混沌之中差点扑了个空而错过年中这条线

文章目录 前言初见端倪混沌初始力不从心心力交瘁拾遗补缺总结 前言 突然意识到过完这个周末已经7月份了&#xff0c;他预示着我的2024年已经过半了&#xff0c;过年回家仿佛还是昨天的事情&#xff0c;怎么转眼间已经到了年中了。心里还是不愿承认这件事&#xff0c;翻开自己2…

Nacos配置中心客户端源码分析(一): 客户端如何初始化配置

本文收录于专栏 Nacos 推荐阅读&#xff1a;Nacos 架构 & 原理 文章目录 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder总结「AI生成」 前言 专栏前几篇文章主要讲了Nacos作为服务注册中心相关…

github主页这样优化,让人眼前一亮

我的主页&#xff08;一之十六&#xff09; 1. 创建与账户ID同名的仓库 注意&#xff1a;记得勾选Add a README file 2. markdown语法自定义README.md 3. 辅助工具 优秀profile&#xff1a;https://zzetao.github.io/awesome-github-profile/动态文字&#xff1a;https://r…

SpringMVC(1)——入门程序+流程分析

MVC都是哪三层&#xff1f;在Spring里面分别对应什么&#xff1f;SpringMVC的架构是什么&#xff1f; 我们使用Spring开发JavaWeb项目&#xff0c;一般都是BS架构&#xff0c;也就是Browser&#xff08;浏览器&#xff09;-Server&#xff08;服务器&#xff09;架构 这种架构…

谷歌开发者新号上架攻略:开发者实战经验分享

前段时间&#xff0c;不少开发者朋友们在纷纷在吐槽新账号没法上架成功。以前谷歌对新号是真的很严格&#xff0c;但现在情况似乎有所好转。 今天&#xff0c;和大家聊聊如何在新号成功上架上“快人一步”&#xff0c;以及怎样增加账号权重提高上架成功率。 首先&#xff0c;我…

成绩发布背后:老师的无奈与痛点

在教育的广阔天地里&#xff0c;教师这一角色承载着无数的期望与责任。他们不仅是知识的传播者&#xff0c;更是学生心灵的引路人。而对于班主任老师来说&#xff0c;他们的角色更加多元&#xff0c;他们不仅是老师&#xff0c;还必须是“妈妈”。除了像其他老师一样备课、上课…

Linux文件系统与设备文件

一、Linux文件操作 Linux的文件系统API主要涉及创建、打开、读写、定位、关闭文件 创建 int creat(const char *filename, mode_t mode);mode: 代表新建文件的存取权限&#xff0c;需要和umask相与才能确定最终权限(mode&umask)。 umask代表文件在创建时需要去掉的存取…

8.12 矢量图层面要素单一符号使用十(箭头线渲染边界)

前言 本章介绍矢量图层线要素单一符号中箭头线渲染边界的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 箭头线渲染边界&#xff08;Outline: Arrow&#xff09; Outline系列只画边界&#xff0c;不填充内容以protected_areas.shp为例&#xff0c;图…

Spring 动态增强逻辑执行分析

1、假如UserService中存在被增强的public 普通方法&#xff0c;那么spring ioc时就会创建对应的代理对象放置到容器中&#xff1b; 2、那么Controller中注入的userService就是代理对象&#xff1b; Service public class UserService {Transactionalpublic void f2(String us…

【训练篇】MLU370-M8 完成 qwen1.5-7b-chat-lora训练及推理

文章目录 前言一、平台环境配置二、环境 or 模型准备1.模型下载2.环境准备2.1 modelscope2.2 transformers2.3 accelerate2.4 deepspeed2.5 peft2.6 环境代码修改 3训练代码准备4 代码修改 三&#xff0c;训练后推理验证四.推理效果展示1.微调前2.微调后 前言 本期我们采用魔塔…

【雷达原理】雷达测角原理及实现方法

目录 一、雷达测角原理1.1 测角研究历史和现状1.2 测角方法总结1.3 3DFFT测角1.3.1 基本原理1.2.2 测角性能 二、MATLAB仿真案例参考文献 一、雷达测角原理 1.1 测角研究历史和现状 &#xff08;1&#xff09;早期采用窄波束对准目标&#xff0c;目标的角度对应于天线的角度读…

【高性能服务器】服务器概述

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 服务器概述 服…

[深入理解DDR] 总目录

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门&#xff0c;点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论&#xff1a;DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存&#xff1f;内存与存…

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的&#xff0c;为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的&#xff0c;为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率&#xff0c;但多进程、多线程都存在局限性。比如多进程通过时…