selenium - 在 Firefox 中下载 PDF 的 Selenium 问题
问题描述
我正在结合 Firefox 61.0 和 Geckodriver 0.21.0 将我们的内部 Java Selenium 框架升级到最新版本 3.14.0。
在使用 Firefox 自动下载 PDF 文件时,我遇到了问题。例如,在这个链接上有一个下载按钮,我可以让 selenium 执行点击。将打开一个内置查看器,而不是下载 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
为。只有在运行时第一次更改时,pdf 查看器才真正被禁用。似乎是 Firefox 中的一个错误。好吧,无论如何,我找到了一种在运行时使用 selenium 更改它的方法。true
about:config
但是现在跳过了 pdf 查看器,另一个弹出窗口正在中断下载。Selenium 甚至不知道这个弹出窗口。
在Applicationsabout:preferences
下的首选项页面上,我现在可以看到,对于 Content Type ,Action 已更改为空,这似乎与. 以前是,但它必须是为了达到我的目标,即立即下载 PDF 而没有任何问题。PDF document
Always ask
Preview in Firefox
Save File
不是使用单个配置,您可能会将其更改为“保存文件”。我错了吗?但是当我检查配置文件文件夹的差异时,我发现有一个handlers.json
包含上图中的设置。它在浏览器启动期间被读入,并首先在浏览器关闭时进行调整。
通常 selenium 会为每个新的浏览器实例创建一个新的临时配置文件夹。如果我想影响所需的设置,我需要定义一个自定义配置文件。那是我的想法。所以我尝试了这个:
firefoxOptions.addArguments("-profile", "/tmp/my.profile");
我认为这是正确的,但现在又一个问题......因为虽然 Firefox 在给定目录中创建了必要的文件,但 selenium 和 firefox 之间的通信失败了。浏览器窗口已打开且运行良好,但 Selenium 无法启动会话。
org.openqa.selenium.WebDriverException: connection refused
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$new$0(W3CHandshakeResponse.java:57)
at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$getResponseFunction$2(W3CHandshakeResponse.java:104)
at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:122)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:125)
at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:548)
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:212)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:130)
at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:140)
…
所以一般的问题是:
单击按钮时,如何强制 Firefox(由 selenium 控制)将 PDF 文件下载到我的文件系统?
任何可能性都是合理的。
由于我的想法已经不多了,如果有人可以帮助或至少确认这些事情是 Firefox 的问题,那就太好了。
解决方案
- 关闭火狐
- 运行 firefox 配置文件管理器 (Win+R: firefox -p)
- 创建一个名为 selenium_profile 的新 Firefox 配置文件
- 在 selenium_profile 中运行 firefox
- 手动下载所需的 PDF 文件并设置为始终下载此类文件类型
要使用 selenium_profile 运行 webdriver,请使用以下命令:
public static void setUpClass() {
FirefoxOptions options = new FirefoxOptions();
ProfilesIni allProfiles = new ProfilesIni();
FirefoxProfile selenium_profile = allProfiles.getProfile("selenium_profile");
options.setProfile(selenium_profile);
options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
System.setProperty("webdriver.gecko.driver", "C:\\Users\\pburgr\\Desktop\\geckodriver-v0.20.0-win64\\geckodriver.exe");
driver = new FirefoxDriver(options);
driver.manage().window().maximize();}
只需编辑路径。
推荐阅读
- python - 我看不到任何发布消息
- python - 使用 Nginx Docker 容器部署 Django
- reporting-services - 在 Visual Studio 中运行 RDL 时,跟踪调试 ODP.NET 不会产生输出
- c# - 如何在负载均衡器后面正确设置 AspNet Core 2 身份验证?
- javascript - 发送/接收带参数的 GET 请求
- java - 如何不匹配此正则表达式中的第一个空字符串?
- sql - 无法解决需要子查询的问题
- powershell - 在不修改 Fiddler 规则的情况下转储 fiddler 上的会话
- python - “x”在“for x in range(10):”中是什么意思?
- python - 将 python 包转换为单个可导入文件