Selenium Firefox:如何通过execute_script点击锚点实现PDF下载而非打开
实现Selenium+Firefox点击锚点直接下载PDF而非打开新标签
我用Python结合Selenium和Firefox开发了一个小型应用,需求是点击锚点元素时,将PDF文件下载到本地,而非在浏览器新标签页中打开。目前点击操作可正常执行,但3个PDF文件均在Firefox浏览器的新标签页中打开,请问如何修改实现PDF文件直接下载?
原代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC URL="https://no.net.com/INFO/details.xhtml" options = webdriver.FirefoxOptions() service=webdriver.FirefoxService(executable_path='/.../geckodriver') driver = webdriver.Firefox(options=options,service=service) driver.get(URL) objects = driver.find_elements(By.CSS_SELECTOR, "a > span.documents-text") print(f"Array[{len(objects)}]") # gives 3 for o in objects: print(o.text) parent = o.find_element(By.XPATH, "./..") # this element is a anchor element try: # A strange div is hiding the element # parent.click() # doesnt function # so I must run the following driver.execute_script("arguments[0].click();", parent) except: print("-- Click failed") raise
解决方法
核心是通过配置Firefox的首选项,让浏览器自动下载PDF而不是在标签页中打开,具体修改如下:
- 添加Firefox下载偏好配置
在初始化FirefoxOptions时,加入以下配置项,指定下载目录并设置PDF自动下载:
options = webdriver.FirefoxOptions() # 配置下载偏好 download_dir = "/你的本地下载路径" # 替换成实际路径,比如Windows用"C:/Downloads",Linux用"/home/user/Downloads" options.set_preference("browser.download.folderList", 2) # 2表示自定义下载目录 options.set_preference("browser.download.dir", download_dir) options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") # 指定PDF的MIME类型 options.set_preference("pdfjs.disabled", True) # 禁用内置PDF阅读器 options.set_preference("plugin.scan.plid.all", False) options.set_preference("plugin.scan.Acrobat", "99.0")
- 修改后的完整代码
将上述配置替换原代码中的options = webdriver.FirefoxOptions()部分,完整代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC URL="https://no.net.com/INFO/details.xhtml" options = webdriver.FirefoxOptions() # 配置PDF自动下载 download_dir = "/你的本地下载路径" # 替换为实际路径 options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.dir", download_dir) options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") options.set_preference("pdfjs.disabled", True) options.set_preference("plugin.scan.plid.all", False) options.set_preference("plugin.scan.Acrobat", "99.0") service=webdriver.FirefoxService(executable_path='/.../geckodriver') driver = webdriver.Firefox(options=options,service=service) driver.get(URL) objects = driver.find_elements(By.CSS_SELECTOR, "a > span.documents-text") print(f"Array[{len(objects)}]") # gives 3 for o in objects: print(o.text) parent = o.find_element(By.XPATH, "./..") # this element is a anchor element try: # A strange div is hiding the element # parent.click() # doesnt function # so I must run the following driver.execute_script("arguments[0].click();", parent) except: print("-- Click failed") raise
这样配置后,Firefox会自动将点击锚点对应的PDF文件下载到你指定的目录,而不会在新标签页打开。
内容的提问来源于stack exchange,提问作者JDias
相关产品推荐
相关产品推荐

