Как открыть браузер Firefox через Селен 3.6.0 с другим профилем, используя Javascript - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу запустить браузер Firefox через selenium-webdriver 3.6.0 с некоторыми изменениями настроек браузера по умолчанию. В частности, я хочу, чтобы Firefox загружал файлы во время автоматического тестирования, не запрашивая, сохранять или нет, и загружать в предопределенный каталог, отличный от каталога по умолчанию, который является папкой загрузок.

Способ сделать это в Google Chrome:

if (this.bName === 'chrome') {  
   var cap = Capabilities.chrome();  
   var options = {  
      'prefs': {  
          profile: {  
            default_content_settings: {  
                  popups: 0,  
            },  
          },  
          download: {  
            default_directory: path.join(__dirname,  
 '/../Downloads For Testing'),  
          }  
      }  
 };  
 var cap = cap.set('chromeOptions', options);  
 this.browser = new Builder().withCapabilities(cap).build();  
}

Соответствующая попытка Firefox с настройкой параметров после создания нового профиля не сработала.

Я включаю профиль из папки Firefox

firefoxProfile = require ('selenium-webdriver / firefox'). Профиль;

и я строю с новыми возможностями

else if (this.bName === 'firefox') {
            var cap = Capabilities.firefox();
            var profile = new firefoxProfile;
            profile.setPreference("browser.download.folderList", 2);
            profile.setPreference("browser.download.manager.showWhenStarting", false);
            profile.setPreference("browser.download.dir", path.join(__dirname, '/../Downloads For Testing'));
            profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/html");
            cap.set('firefox_profile', profile);
            console.log(profile);
            this.browser = new Builder().withCapabilities(cap).build();
        }

Это распечатка нового объекта профиля:

Profile {
  preferences_:
   { 'browser.download.folderList': 2,
     'browser.download.manager.showWhenStarting': false,
     'browser.download.dir': 'C:\\path\\Downloads For Testing',
     'browser.helperApps.neverAsk.saveToDisk': 'text/html' },
  template_: undefined,
  extensions_: []
}

Браузер запускается без ошибок, и все обещания возвращаются корректно mocha, тестовой платформой, пока не будет нажата кнопка, чтобы загрузить файл, и появится нормальное диалоговое окно, поэтому безуспешно.

1 Ответ

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

Файл index.js в selenium-webdriver\firefox четко определяет, как динамически создавать новый профиль и устанавливать настройки.

* The {@linkplain Profile} class may be used to configure the browser profile
* used with WebDriver, with functions to install additional
* {@linkplain Profile#addExtension extensions}, configure browser
* {@linkplain Profile#setPreference preferences}, and more. For example, you
* may wish to include Firebug:
*
*     const {Builder} = require('selenium-webdriver');
*     const firefox = require('selenium-webdriver/firefox');
*
*     let profile = new firefox.Profile();
*     profile.addExtension('/path/to/firebug.xpi');
*     profile.setPreference('extensions.firebug.showChromeErrors', true);
*
*     let options = new firefox.Options().setProfile(profile); 
*     let driver = new Builder()
*         .forBrowser('firefox')
*         .setFirefoxOptions(options)
*         .build();

Он попробовал это, и это не сработало. Очевидно, я не пытался добавить расширение, а только для того, чтобы задать 4 предпочтения, написанные в моем вопросе.

Что помогло мне, как обходной путь, это создать новый профиль, выполнив firefox.exe -p в диалоговом окне «Выполнить» окна. (Нажмите клавишу со значком окна и клавишу R на клавиатуре, чтобы открыть диалоговое окно запуска).
После этого я использовал этот новый «тестовый» профиль в качестве шаблона для динамического создания нового временного профиля через селен.

var profile = new firefox.Profile('/pathTo/firefox profile for testing/');

А вот и хитрость. Похоже, что-то вроде Firefox и MIME. Если сервер, отправляющий файл для загрузки, называет тип содержимого файла по-другому, как это сделал бы Firefox, автосохранение не произойдет, и появится диалоговое окно «сохранить или открыть файл».
Вероятно, из соображений безопасности.
Тип содержимого можно найти здесь

В моем случае речь идет о файле csv и настройке profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv"), в то время как сервер отправляет текстовый тип text / html, а firefox идентифицирует его как файл TXT, который не работает.
Поэтому я отредактировал файл handlers.json внутри /pathTo/firefox profile for testing/, установив атрибут 'ask' для 'text / plain' внутри 'mimeTypes' с true на false.

И, конечно, я установил в качестве единственного предпочтения путь к файлу, на который нужно загрузить. Кстати, это также создаст путь, по крайней мере, к последней папке. Итак, мой код:

    else if (this.bName === 'firefox') {
        var cap = Capabilities.firefox();
        var profile = new firefox.Profile('/pathTo/firefox profile for testing/');
        profile.setPreference("browser.download.dir", '/pathTo/Downloads For Testing');
        let options = new firefox.Options().setProfile(profile);
        this.browser = new Builder().forBrowser(this.bName).setFirefoxOptions(options).build();
    }

Вы также можете попробовать это и не связываться с handler.json (конец страницы) , но у меня это не сработало.

Или просто грубая сила , этого тоже не было.

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