Я работаю над обновлением нашей внутренней платформы Java Selenium до последней версии 3.14.0 в сочетании с Firefox 61.0 и Geckodriver 0.21.0.
У меня проблемы с автоматической загрузкой PDF-файла с помощью Firefox. Например, по этой ссылке есть кнопка загрузки, на которой я могу позволить селену выполнить щелчок. Вместо того, чтобы загружать 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 пропущен, другое всплывающее окно прерывает загрузку. Селен даже не знает об этом всплывающем окне.
На странице настроек about:preferences
в разделе Приложения Теперь я вижу, что для типа контента PDF document
действие было изменено на ничего, что похоже на Always ask
. Раньше это было Preview in Firefox
, но это должно быть Save File
, чтобы достичь моей цели - немедленно загрузить PDF без каких-либо вопросов.
Ни в одной конфигурации вы не могли бы изменить это на «Сохранить файл». Я ошибся? Но когда я проверил папки профиля на наличие различий, я обнаружил, что есть 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 (управляемый селеном) загружать файл PDF в мою файловую систему при нажатии на кнопку?
Любые возможности разумны .
Поскольку у меня заканчиваются идеи, было бы замечательно, если бы кто-то мог помочь или хотя бы подтвердить, что эти вещи являются проблемами с Firefox.