Selenium处理模态框元素点击:解决ElementNotInteractableException问题
解决Selenium点击模态框复选框出现ElementNotInteractableException的问题
问题分析
目标元素是页面底部Download按钮弹出的模态框内的复选框(id: id-terr-cod),能定位但无法点击,报错提示元素无法滚动到视图内,已尝试scrollIntoView、ActionChains等方法无效,排除alert和iframe场景。
可行解决方案
1. 使用JavaScript直接点击元素
跳过Selenium的交互检查,直接通过JS触发点击事件,这是解决元素遮挡、滚动异常问题的常用方法:
# 替换原有的ActionChains代码 driver.execute_script("arguments[0].click();", terrBox)
2. 优化滚动逻辑,确保元素完全进入视口
调整scrollIntoView的参数,让元素居中显示,避免被页面或模态框的边缘遮挡:
driver.execute_script("arguments[0].scrollIntoView({block: 'center', inline: 'center'});", terrBox)
3. 用显式等待替代固定sleep,确保元素可交互
固定time.sleep不可靠,改用WebDriverWait等待元素完全可点击后再操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 点击Download按钮后,等待复选框可交互 terrBox = WebDriverWait(driver, 10).until( EC.element_to_be_clickable(("id", "id-terr-cod")) )
4. 针对模态框内部滚动调整
如果模态框自身带有滚动条,需要先滚动模态框到元素位置,而不是滚动整个页面:
# 先定位模态框容器(实际需根据页面DOM结构调整容器选择器) modal = driver.find_element_by_css_selector(".modal-content") driver.execute_script("arguments[0].scrollTop = arguments[1].offsetTop;", modal, terrBox)
修改后的完整示例代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def sidraGet(table_code, variables, panels : dict, years=()): driver = webdriver.Firefox() driver.get("https://sidra.ibge.gov.br/tabela/"+str(table_code)) driver.maximize_window() # 等待Download按钮可点击并点击 WebDriverWait(driver, 10).until( EC.element_to_be_clickable(("id", "botao-downloads")) ).click() # 等待模态框内的复选框可交互 terrBox = WebDriverWait(driver, 10).until( EC.element_to_be_clickable(("id", "id-terr-cod")) ) # 滚动元素到视口中并通过JS点击 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", terrBox) driver.execute_script("arguments[0].click();", terrBox) # 后续操作... # driver.quit()
内容的提问来源于stack exchange,提问作者Oz_Magician
相关产品推荐
相关产品推荐

