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

Selenium无法关闭弹窗:ElementNotInteractableException问题求助

解决Selenium点击弹窗按钮时的ElementNotInteractableException问题

问题说明

我尝试从指定链接下载PDF文件,网站多数文档会弹出许可协议弹窗,通过driver.find_element(By.ID, "btnAcceptLicense").click()可以正常关闭。但该链接在关闭许可弹窗后会出现第二个带Close按钮的弹窗,用driver.find_element(By.CLASS_NAME, "modal-footer").find_element(By.CLASS_NAME, "btn")定位元素并执行click()时,抛出ElementNotInteractableException异常。

我的代码如下:

import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=chrome_options)

url = "https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=39859&ver=4"

driver.get(url)
time.sleep(0.5)
# Accept license
driver.find_element(By.ID, "btnAcceptLicense").click()
time.sleep(0.5)
# Close pop second pop up (fails here)
driver.find_element(By.CLASS_NAME, "modal-footer").find_element(By.CLASS_NAME, "btn").click()

# Download document
driver.find_element(By.ID, "btnDownload").click() 

解决方案

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

固定time.sleep()无法保证弹窗元素完全加载完成,改用Selenium的WebDriverWait等待元素进入可交互状态,从根源避免元素未就绪的问题:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 替换原sleep和点击逻辑
# 等待许可协议按钮可点击并点击
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "btnAcceptLicense"))).click()

# 等待第二个弹窗的Close按钮可点击并点击
close_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, ".modal-footer .btn"))
)
close_btn.click()

2. 优化元素定位精度

By.CLASS_NAME可能匹配到页面中多个同类元素(比如隐藏的备用按钮),改用更精确的CSS选择器锁定目标按钮。如果Close按钮有专属类名(比如btn-close或btn-primary),可以进一步缩小范围:

# 示例:如果Close按钮带有btn-primary类
close_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, ".modal-footer .btn.btn-primary"))
)

3. 修复headless模式的渲染问题

headless模式下窗口默认尺寸较小,可能导致弹窗元素被遮挡或未正常渲染,添加窗口大小参数:

chrome_options.add_argument('--window-size=1920,1080')

完整修正代码

import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--window-size=1920,1080')
driver = webdriver.Chrome(options=chrome_options)

url = "https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=39859&ver=4"

driver.get(url)

# 处理许可协议弹窗
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "btnAcceptLicense"))).click()

# 处理第二个弹窗
close_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, ".modal-footer .btn"))
)
close_btn.click()

# 触发下载
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "btnDownload"))).click()

# 等待下载完成(根据文件大小调整时间)
time.sleep(5)
driver.quit()

内容的提问来源于stack exchange,提问作者Marshall K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:06:15