Селен проблемы с PDF скачать в Firefox - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю над обновлением нашей внутренней платформы 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.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Добавить pdfjs.enabledCache.state к ложному.

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 Загрузить PDF-файлы

0 голосов
/ 07 сентября 2018
  1. закрыть Firefox
  2. запустить менеджер профилей Firefox (Win + R: firefox -p)
  3. создайте новый профиль Firefox, который называется скажем selenium_profile
  4. запустить firefox в selenium_profile
  5. загрузите вручную нужный файл PDF и настройте его на постоянную загрузку

Чтобы запустить веб-драйвер с selenium_profile, используйте это:

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();}

Просто отредактируйте пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...