You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium循环迭代时第二次触发ElementNotInteractableException问题

解决Selenium循环关闭弹窗时的ElementNotInteractableException异常

问题背景

执行千次以上的链接点击+弹窗关闭操作时,第一次迭代能正常打开链接并关闭弹窗,但第二次打开链接后无法关闭弹窗,抛出ElementNotInteractableException异常。尝试过延长time.sleep时长(最高60秒),用CLASS_NAME、CSS_SELECTOR、XPATH定位按钮:CSS_SELECTOR固定但仅第一次能检测到按钮显示,XPATH每次会变化(比如首次为/html/body/div[6]/div[1]/a,第二次变为/html/body/div[8]/div[1]/a)。

核心原因

  1. 初始获取的interesting_links列表在DOM更新后会变成失效元素(stale element),复用旧引用会导致操作失败。
  2. 多次弹窗后,页面DOM中存在多个相同类名的关闭按钮元素,直接用CLASS_NAME定位会选中隐藏的旧弹窗按钮,导致无法交互。
  3. 固定时长的time.sleep无法适配页面加载的时序差异,可能在元素未完全就绪时就执行操作。

解决方案

1. 每次循环重新获取链接元素

避免复用初始的interesting_links列表,每次循环都重新定位链接,保证元素引用有效。

2. 用显式等待替代固定sleep

使用WebDriverWait等待元素可交互后再操作,比固定sleep更可靠,能精准适配页面加载节奏。

3. 精准定位当前显示的弹窗关闭按钮

通过CSS选择器结合:visible伪类,只定位当前处于显示状态的弹窗的关闭按钮,过滤隐藏的旧元素。

修改后的完整代码

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

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")

# 初始化浏览器和等待对象
driver = webdriver.Chrome(options=options, executable_path=r"D:\SeleniumDriver\chromedriver.exe")
wait = WebDriverWait(driver, 20)  # 最长等待20秒

driver.get('https://sprawozdaniaopp.niw.gov.pl/') 

# 等待搜索按钮可点击并点击
find_button = wait.until(EC.element_to_be_clickable((By.ID, "btnsearch")))
find_button.click()

# 处理前5个链接(保持原代码的停止条件)
for i in range(5):
    # 每次循环重新获取链接列表,避免元素失效
    interesting_links = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "dialog")))
    # 点击当前链接
    interesting_links[i].click()
    
    # 等待当前显示的弹窗的关闭按钮可点击,然后关闭
    close_box = wait.until(EC.element_to_be_clickable(
        (By.CSS_SELECTOR, ".ui-dialog:visible .ui-dialog-titlebar-close")
    ))
    close_box.click()

关键修改说明

  • 显式等待:用WebDriverWait替代time.sleep,确保元素处于可交互状态再执行操作,彻底解决时序问题。
  • 重新获取元素:每次循环重新定位链接列表,避免DOM更新后元素引用失效。
  • 精准定位关闭按钮:CSS选择器.ui-dialog:visible .ui-dialog-titlebar-close只匹配当前显示的弹窗的关闭按钮,不会选中隐藏的旧弹窗元素,解决多次弹窗后多元素冲突的问题。

内容的提问来源于stack exchange,提问作者Kacper Oleszkiewicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:35:30