无法使用 Selenium Firefox 自动保存文件

Posted

技术标签:

【中文标题】无法使用 Selenium Firefox 自动保存文件【英文标题】:Cannot auto-save file with Selenium Firefox 【发布时间】:2018-07-08 02:49:57 【问题描述】:

我正在使用 Selenium 单击 Firefox 中的链接,我希望它自动下载文件。 我查看了 internet inc 上的各种资源。 Selenium firefox profile for saving a file。 &Set Firefox profile to download files automatically using Selenium and Java。但我无法让它工作。它只是通过打开/保存对话框不断提示我。 我正在使用 Firefox 57.0.2、firefox 驱动程序 3.8.1、Geckodriver 0.19.1。 我可以手动设置 firefox 选项来保存文件,但是在代码中我创建了一个新的配置文件,所以这显然会被忽略。 我的代码是:

System.setProperty(webdriver.gecko.driver",System.getProperty("user.dir") + Constants.GECKODRIVER);

FirefoxOptions firefoxOptions = new FirefoxOptions();
FirefoxProfile profile = new FirefoxProfile();

profile.setPreference("browser.download.dir", dirPath);
profile.setPreference("browser.download.folderList",2);
profile.setPreference("browser.helperApps.neverAsk.openFile","application/pdf,text/plain,application/octet-stream,application/x-pdf,application/vnd.pdf,application/vnd.openxmlformats-officedocument.spreadsheethtml,text/csv,text/html,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel");
profile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/pdf,text/plain,application/octet-stream,application/x-pdf,application/vnd.pdf,application/vnd.openxmlformats-officedocument.spreadsheethtml,text/csv,text/html,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel");
profile.setPreference("browser.helperApps.alwaysAsk.force, false);
profile.setPreference("browser.download.manager.useWindow, false);
profile.setPreference("browser.download.manager.focusWhenStarting, false);
profile.setPreference("browser.download.manager.alertOnEXEOpen, false);
profile.setPreference("browser.download.manager.showAlertOnComplete, false);
profile.setPreference("browser.download.manager.closeWhenDone, false);
profile.setPreference("browser.allowpopups, false);
profile.setPreference("pdfjs.disabled",true);
profile.setAcceptUntrustedCertificates(true);
profile.setAssumeUntrustedCertificatesIssuer(true);
firefoxOptions.setProfile(profile);
currentdriver = new FirefoxDriver();

我试过了

profile.setPreference("plugin.disable_full_page_plugin_for_types","application/pdf,application/x-pdf");
profile.setPreference("plugin.scan.Acrobat,"99.0");

我尝试查看我需要的 2 个文件(.pdf 和 .xlsx)的 MIME 类型,我认为它们是 text/html;charset=iso-8859-1。

请给点建议?

【问题讨论】:

您需要做的第一件事是确定这两个文件的确切 mime。其次,您需要删除browser.helperApps.neverAsk.openFile,因为您不能要求同时打开和保存文件。 我试过不使用 .openFile 但没有成功。如何确定 MIME 类型(未连接到 Internet 时)。 mime 是请求返回的内容类型。看看这里:***.com/questions/36309314/… 最新版本的 firefox 与这篇文章略有不同,但是如果我检查元素并转到 Network,Type 是 x-unknown。 【参考方案1】:

我在 selenium 的 webdriver.FirefoxProfile 中使用 set_preference 也没有成功。有效的是修改 firefox 配置文件目录中的 handlers.json 文件。

必须在 json 文件的 mimeTypes 下插入以下内容:

"application/text":"action":0,"extensions":["csv"],

【讨论】:

【参考方案2】:

是的,我不擅长英语,但我对这个该死的问题感到愤怒,所以写下这个答案。我在 firefox 配置文件目录中的 set_preference 和 json 也没有成功。如你所知,我们的生命是短暂的。所有问题都必须快速解决。所以我在下面使用丑陋的解决方案并解决了。

我再说一遍,我们的生命很短暂。如果这个该死的丑陋解决方案对您有好处,请使用它并随意享受我们的生活。

from ahk import AHK
ahk = AHK()

sleep(2)
handle = ahk.win_get(title="ahk_class MozillaDialogClass") # yeah this is f***ing file download dialog window of firefox
if  ("" !=handle.title):
    handle.send("Down")
    sleep(0.2)
    handle.send("TabTab")
    sleep(0.2)
    handle.send("Space")
    sleep(0.2)
    handle.send("TabEnter")

【讨论】:

以上是关于无法使用 Selenium Firefox 自动保存文件的主要内容,如果未能解决你的问题,请参考以下文章

Firefox Profile 无法自动下载文件

Selenium2+python自动化18-加载Firefox配置

Selenium2+python自动化18-加载Firefox配置

在 selenium firefox webdriver 中自动下载 .dmg 文件

Mac系统上,Firefox和Selenium不兼容的情况

python+selenium自动化环境搭建之后,能打开firefox,却不能执行自动化操作