使用Selenium Python绕过弹窗下载Firefox文件

5
我正在使用Python的Selenium库从这个网页下载特定文件。之前我一直使用设置偏好来创建Firefox配置文件,它们都可以正常使用。但是在这种情况下,尽管已经给出了偏好设置,下载弹窗仍然会在同一页中打开,需要手动选择保存或打开。有没有人能帮助绕过这个问题,自动下载文件而不弹出警报框?
偏好设置如下:
fp = webdriver.FirefoxProfile()
        fp.set_preference("browser.download.folderList", 2)
        fp.set_preference("browser.download.manager.showWhenStarting", False)
        fp.set_preference("browser.download.dir", downloadDir)
        fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv")


        self.driver = webdriver.Firefox(firefox_profile=fp)

我正在尝试下载的文件是: 要下载的文件

谢谢,如果需要完整代码,请参考以下内容:

# -*- coding utf-8 -*-
from selenium.webdriver.firefox.options import Options
from selenium import webdriver
import time
import os
import shutil
import uuid

class crawlOcean():

    def __init__(self):
        print("hurray33")
        global downloadDir
        downloadDir = ""

        fp = webdriver.FirefoxProfile()
        fp.set_preference("browser.download.folderList", 2)
        fp.set_preference("browser.download.manager.showWhenStarting", False)
        fp.set_preference("browser.download.dir", downloadDir)
        fp.set_preference("browser.helperApps.neverAsk.saveToDisk",
                          "text/plain, application/octet-stream, application/binary, text/csv, application/csv, application/excel, text/comma-separated-values, text/xml, application/xml")
        fp.set_preference("pdfjs.disabled", True)
        options = Options()
        options.add_argument("--headless")
        self.driver = webdriver.Firefox(firefox_profile=fp)
        #self.driver = webdriver.Firefox()
        print("hurray")
        self.driver.implicitly_wait(15)
        self.driver.get("http://www.oceanenergyireland.com/testfacility/corkharbour/observations")
        self.verificationErrors = []
        self.accept_next_alert = True

    def crawl(self):
        print("see")
        driver = self.driver
        driver.execute_script("window.scrollTo(0, 600)")
        index = 0
        driver.switch_to.frame(index)
        driver.find_element_by_xpath("//div[@id='CorkTideHeight']/div[3]/button[2]").click()
        time.sleep(3)
        driver.find_element_by_xpath("//div[@id='CorkTideHeight']/div[3]/div/ul/li[5]").click()
        time.sleep(5)

if __name__ == '__main__':
    obj = crawlOcean()
    obj.crawl()

你想下载哪个文件?你试图点击哪个元素? - undetected Selenium
@DebanjanB 我已经在问题中添加了图片,你可以通过从代码中检索URL或点击此处来查看它。 - Northern Shadow
这不是一个重复的问题吗?之前你不是已经回答了类似Selenium Python: Unable to locate button ID的问题吗? - undetected Selenium
@DebanjanB 不是的,这个问题是关于设置Firefox偏好的,请看描述。 - Northern Shadow
1个回答

6

与其使用text/csv,不如尝试一下attachment/csv,这个方法可行。实际上,下载文件是在JavaScript中生成的,他们设置了自定义数据类型。

    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.folderList", 2)
    fp.set_preference("browser.download.manager.showWhenStarting", False)
    fp.set_preference("browser.download.dir", downloadDir)
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "attachment/csv")
    self.driver = webdriver.Firefox(firefox_profile=fp)

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