Python / Selenium使用Firefox下载PDF文件

3
在我的代码中,我使用Firefox作为浏览器去导航到一个网站,进行搜索,然后点击查看每个PDF文档。一旦进入文档(它会加载而不提示我下载),我想下载这个文档。我找到了一个Java版本的方法来实现这一点,但在Python中并不容易。我还尝试从Adobe框架中选取元素(以直接下载它),但再次无法找到xpath对象。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests, time


driver = webdriver.Firefox(executable_path="geckodriver")
driver.get("https://www.okcc.online/")
driver.maximize_window()
options = webdriver.FirefoxOptions()
options.set_preference("browser.download.folderList", 2)
options.set_preference("browser.download.dir", "/Users/username/Desktop/oklahoma/oklahoma_county")
options.set_preference("browser.download.useDownloadDir", "true")
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
options.set_preference("pdfjs.disabled", "true")

wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='rod-menu-button']"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@id='rodDocTypeTxt']"))).send_keys('MTG')
wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='ui-id-1']//li//div"))).click()

driver.find_element_by_xpath('//*[@id="rod-date-toggle"]').click()

driver.find_element_by_xpath('//*[@id="rodFromDateTxt"]').send_keys('4/1/2020')
driver.find_element_by_xpath('//*[@id="rodToDateTxt"]').send_keys('4/20/2020')

search_button = driver.find_element_by_xpath('//*[@id="rod-submit-search"]').click()

time.sleep(2)

pdf = driver.find_elements_by_css_selector(".icon.pdf-icon")

for i in pdf:
    i.click()
    time.sleep(3)
    download_button = driver.find_element_by_xpath('//*[@id="download"]')
    download_button.click()
    close_button = driver.find_element_by_css_selector('.pdf-function-button.pdf-close')
    close_button.click()

你有两个问题。首先,PDF弹出窗口需要一些时间来加载。你应该使用webdriver.wait等待直到新的iframe出现。其次,PDF弹出窗口在一个iframe中。在查找下载按钮之前,你需要切换到该iframe。请注意,在完成后,你需要切换回主页面才能继续访问下一个PDF。 - Sri
这个回答解决了你的问题吗?Selenium Webdriver:如何使用Python下载PDF文件? - Infern0
不是真的。它是为Chrome而不是Firefox。 - DesertDeveloper
在这种情况下,你如何选择iframe?我尝试选择它,但它没有被识别。 - DesertDeveloper
我有同样的问题。 - brienna
1个回答

3

可能您已经解决了这个问题,但是您的问题帮助我解决了我面临的相同问题。

您只需要在“options.set_preference”之后添加部分“driver = webdriver.Firefox”,并在webdriver.Firefox中添加选项参数即可。

此外,您需要更改部分:

options.set_preference("browser.download.useDownloadDir", "true")
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
options.set_preference("pdfjs.disabled", "true")

for:

options.set_preference("browser.download.useDownloadDir", True)
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
options.set_preference("pdfjs.disabled", True)

以下是我的代码。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests, time



options = webdriver.FirefoxOptions()
options.set_preference("browser.download.folderList", 2)
options.set_preference("browser.download.dir", "/Users/username/Desktop/oklahoma/oklahoma_county")
options.set_preference("browser.download.useDownloadDir", True)
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
options.set_preference("pdfjs.disabled", True)
driver = webdriver.Firefox(options = options, executable_path="geckodriver")
driver.get("https://www.okcc.online/")
driver.maximize_window()

wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='rod-menu-button']"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@id='rodDocTypeTxt']"))).send_keys('MTG')
wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='ui-id-1']//li//div"))).click()

driver.find_element_by_xpath('//*[@id="rod-date-toggle"]').click()

driver.find_element_by_xpath('//*[@id="rodFromDateTxt"]').send_keys('4/1/2020')
driver.find_element_by_xpath('//*[@id="rodToDateTxt"]').send_keys('4/20/2020')

search_button = driver.find_element_by_xpath('//*[@id="rod-submit-search"]').click()

time.sleep(2)

pdf = driver.find_elements_by_css_selector(".icon.pdf-icon")

for i in pdf:
    i.click()
    time.sleep(3)
    download_button = driver.find_element_by_xpath('//*[@id="download"]')
    download_button.click()
    close_button = driver.find_element_by_css_selector('.pdf-function-button.pdf-close')
    close_button.click()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接