Firefox中PDF下载的硒问题

时间:2018-09-06 16:46:00

标签: selenium pdf firefox settings geckodriver

我正在将内部Java Selenium框架与Firefox 61.0和Geckodriver 0.21.0结合在一起升级到最新版本3.14.0。

在使用Firefox自动下载PDF文件时,我遇到了问题。例如,在此link处有一个下载按钮,我可以在其中单击硒。无需下载pdf,而是将打开内置查看器。首选项pdfjs.disabled应该停用查看器,因此使用配置文件创建了驱动程序实例(并尝试了更多首选项)。

FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.setAcceptUntrustedCertificates(true);
firefoxProfile.setAssumeUntrustedCertificateIssuer(true);
firefoxProfile.setPreference("browser.download.folderList", 2);
firefoxProfile.setPreference("network.cookie.cookieBehavior", 0);
firefoxProfile.setPreference("network.cookie.alwaysAcceptSessionCookies", true);
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
firefoxProfile.setPreference("browser.helperApps.neverAsk.openFile", "application/pdf");
firefoxProfile.setPreference("browser.helperApps.alwaysAsk.force", false);
firefoxProfile.setPreference("browser.download.manager.showAlertOnComplete", false);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting", false);
firefoxProfile.setPreference("browser.download.panel.shown", false);
firefoxProfile.setPreference("browser.download.manager.focusWhenStarting", false);
firefoxProfile.setPreference("browser.download.manager.closeWhenDone", false);
firefoxProfile.setPreference("browser.download.manager.useWindow", false);
firefoxProfile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false);
firefoxProfile.setPreference("browser.download.manager.alertOnEXEOpen", false);
firefoxProfile.setPreference("pdfjs.disabled", true);

FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setProfile(firefoxProfile);
WebDriver webdriver = new FirefoxDriver(firefoxOptions);

不幸的是,对于使用的Firefox版本,此配置无效。除非您在运行时在pdfjs.disabled页面中将true更改为about:config。只有在运行时第一次更改pdf查看器时,它才真正被禁用。似乎是Firefox中的错误。好的,无论如何,我找到了一种在运行时使用硒进行更改的方法。

但是现在pdf查看器被跳过了,另外popup中断了下载。硒甚至不知道此弹出窗口。

Applications下的首选项页面about:preferences上,我现在可以看到,对于内容类型PDF document,操作已更改为空,似乎与{{1}相同}。之前Always askPreview in Firefox,但为了达到我的目标,它必须立即下载PDF而没有任何问题。

如果没有单个配置,则可以将其更改为“保存文件”。我错了吗?但是,当我检查配置文件文件夹中的差异时,我发现有一个Save File包含上图的设置。在浏览器启动期间将其读入,并在浏览器关闭时首先进行调整。
通常selenium为每个新的浏览器实例创建一个新的临时配置文件文件夹。如果要影响所需的设置,则需要定义一个自定义配置文件。那是我的想法。所以我尝试了这个:

handlers.json

我认为这是正确的,但是现在又出现了一个问题……因为尽管Firefox在给定目录中创建了必要的文件,但是硒与Firefox之间的通信失败。浏览器窗口打开并且运行正常,但是Selenium无法启动会话。

firefoxOptions.addArguments("-profile", "/tmp/my.profile");

所以通常的问题是:
单击按钮时,如何强制Firefox(受硒控制)将PDF文件下载到我的文件系统中?可能性是合理的。

由于我的想法不多了,如果有人可以帮助或至少确认这些是Firefox的问题,那将是很好的。

2 个答案:

答案 0 :(得分:0)

  1. 关闭Firefox
  2. 运行firefox配置文件管理器(Win + R:firefox -p)
  3. 创建一个新的名为selenium_profile的Firefox配置文件
  4. 在selenium_profile中运行Firefox
  5. 手动下载所需的PDF文件,并将其设置为始终下载此类文件类型

要使用selenium_profile运行webdriver,请使用以下命令:

-bash-3.2$ c++filt _ZN3MDS15BloombergSource12startSessionEv
MDS::BloombergSource::startSession()

只需编辑路径。

答案 1 :(得分:0)

pdfjs.enabledCache.state添加为false。

FirefoxOptions options = new FirefoxOptions();
options.addPreference("browser.download.folderList", 2);
options.addPreference("browser.download.dir", pathToDownload);
options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
options.addPreference("pdfjs.enabledCache.state",false); 
WebDriver driver = new FirefoxDriver(options);

Geckodriver Selenium Auto Download PDFs