使用Python+Selenium下载iframe内嵌PDF弹窗文件遇阻
解决Selenium点击PDF弹窗“Abrir”按钮的问题
1. 先切换到PDF所在的iframe
PDF弹窗大概率嵌套在iframe里,必须先切换到对应iframe才能操作内部元素:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 替换成实际的iframe定位规则(比如id、xpath),等待iframe加载完成 target_iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//iframe[contains(@src, 'pdf')]")) ) driver.switch_to.frame(target_iframe)
2. 等待按钮可点击后再操作
不要直接定位元素就点击,必须等按钮进入可交互状态:
# 用文本定位“Abrir”按钮,等待可点击 abrir_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//*[text()='Abrir']")) ) abrir_button.click()
3. 处理shadow DOM的情况
如果按钮嵌套在shadow DOM里,需要先获取shadow根节点再定位:
# 先定位shadow DOM的宿主元素 shadow_host = driver.find_element(By.CSS_SELECTOR, "your-shadow-host-selector") shadow_root = shadow_host.shadow_root # 在shadow根节点内找按钮 abrir_button = shadow_root.find_element(By.XPATH, "//*[text()='Abrir']") abrir_button.click()
4. 键盘快捷键替代点击(备选方案)
如果按钮点击始终失效,试试模拟回车触发:
from selenium.webdriver.common.keys import Keys abrir_button.send_keys(Keys.ENTER)
5. 直接提取PDF链接下载(更高效)
绕开按钮点击的麻烦,直接获取PDF的真实链接下载:
import requests # 从iframe的src属性提取PDF链接 pdf_url = target_iframe.get_attribute("src") # 复用Selenium的登录cookie,避免权限问题 session = requests.Session() for cookie in driver.get_cookies(): session.cookies.set(cookie['name'], cookie['value']) # 下载PDF with open("target.pdf", "wb") as f: f.write(session.get(pdf_url).content)
内容的提问来源于stack exchange,提问作者Sérgio De Brito
相关产品推荐
相关产品推荐

