Подтвердить что ты не робот

Разница между webdriver.firefox.marionette и webdriver.gecko.driver

Сейчас я изучаю Selenium и столкнулся с проблемой.

Мне известно, что Selenium по умолчанию поддерживает старую версию Firefox без драйвера. А для последних версий Firefox мы должны загрузить драйвер и определить его с помощью System.setProperty.

По этой ссылке для Firefox 45 и 46 код запуска драйвера может выглядеть так:

WebDriver driver = new FirefoxDriver();

Мой Firefox - версия 45.5.1., Но приведенный выше код все равно не будет работать. Так что по этой ссылке я добавил:

System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");

И это сработало.

Тогда я понял, что я не установил geckodriver.exe на моем компьютере. Чтобы увидеть, как это происходит, я изменил код ниже:

System.setProperty("webdriver.firefox.marionette","");

Это все еще работает.

Итак, вот моя первая проблема: что случилось? Я уверен, что в моей среде не существует geckodriver.exe. Если ни одно местоположение не было указано, то зачем мне устанавливать свойство?

Кроме того, я видел такой код:

System.setProperty("webdriver.gecko.driver", "/tools/marionette/wires.exe");

Мой второй вопрос: в чем разница между webdriver.gecko.driver и webdriver.firefox.marionette или wires.exe и geckodriver.exe?

4b9b3361

Ответ 1

До версии 45 (до версии 47) драйвер, используемый для автоматизации Firefox, был расширением, включенным в каждый клиент. Но это расширение было удалено, вероятно, из-за изменения политики, которая теперь требует, чтобы все расширения были подписаны Mozilla.

Marionette - это новый драйвер, который поставляется вместе с Firefox. У этого драйвера есть собственный протокол, который несовместим с протоколом Selenium/WebDriver.

Драйвер Gecko (ранее называемые проводы) - это сервер приложений, реализующий протокол Selenium/WebDriver. Он переводит команды Selenium и перенаправляет их в драйвер Marionette.

Для клиента Java поведение по умолчанию заключается в использовании драйвера Gecko, но его можно переопределить, чтобы использовать устаревшее расширение как драйвер с свойством webdriver.firefox.marionette:

System.setProperty("webdriver.firefox.marionette", "false");

или с возможностью marionette через FirefoxOptions:

FirefoxOptions options = new FirefoxOptions()
  .setLegacy(true);

WebDriver driver = new FirefoxDriver(options);
// or with a remote server
WebDriver driver = new RemoteWebDriver(remoteUrl, options.toDesiredCapabilities());

или непосредственно с помощью DesiredCapabilities:

DesiredCapabilities capa = DesiredCapabilities.firefox();
capa.setCapability("marionette", false);

WebDriver driver = new FirefoxDriver(capa);
// or with a remote server
WebDriver driver = new RemoteWebDriver(remoteUrl, capa);

И чтобы определить местоположение драйвера Gecko, поместите драйвер в папку, присутствующую в переменной среды PATH, или определите местоположение в свойстве webdriver.gecko.driver:

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");

или запустите удаленный сервер со свойством, назначенным в командной строке:

java -Dwebdriver.gecko.driver="C:\\geckodriver.exe" -jar selenium-server-standalone-3.4.0.jar

Ответ 2

До выпуска Firefox 47.x устаревший драйвер был реализован как расширение Firefox. Это расширение было установлено в профиле, используемом драйвером всякий раз, когда WebDriver запускал Firefox.

Следовательно мы использовали:

WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");

Firefox 48 отключил расширение браузера и представил WebDriver. С тех пор GeckoDriver на марионетках решение, разрабатываемое и поддерживаемое Mozilla, предназначено для автоматизации браузера Mozilla Firefox.

марионетка

Согласно официальной документации Mozilla на developer.mozilla.org. Марионетка - водитель автоматизации. Он использует удаленный протокол Firefox, который может управлять пользовательским интерфейсом. Марионетка принимает запросы и выполняет их в Gecko. У него тоже есть клиент. Клиент отправляет инструкции на сервер, а сервер выполняет инструкции в браузере.

Поэтому мы начали использовать Марионетку:

System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://gmail.com");

Провода

Есть некоторые ссылки, чтобы переименовать исполняемый файл в 'wire.exe и добавить его к вашему пути. Следовательно, было использовано следующее:

System.setProperty("webdriver.firefox.marionette","C:\\wires.exe");
WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://gmail.com");

GeckoDriver

GeckoDriver - это исполняемый файл, который мы должны загрузить в нашей системе и указать его местоположение в наших скриптах/программах во время выполнения наших тестовых случаев. GeckoDriver, в свою очередь, запустит браузер Mozilla Firefox.

Эти выдержки были взяты из эпического ответа Джима Эвана на вопрос. Каковы преимущества использования Marionette FirefoxDriver вместо старого Selenium FirefoxDriver для тестера Selenium? что дает нам подробное понимание того, как GeckoDriver и Marionette вошли в практику.

Поэтому мы начали использовать geckodriver.exe:

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");

Теперь в текущем сценарии у вас все еще есть возможность выполнить свою автоматизацию через устаревший браузер Firefox 47.x и последние версии браузера Firefox 53.x.

Вариант использования 1:

В случае использования старых браузеров Firefox 47.x вы должны явно установить "марионетку" в false через класс DesiredCapabilities следующим образом:

DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setCapability("firefox_binary", "C:\\Program Files\\Mozilla Firefox47\\firefox.exe");
dc.setCapability("marionette", false);
WebDriver driver =  new FirefoxDriver(dc);
driver.navigate().to("https://gmail.com");

Вариант использования 2:

В случае использования устаревших браузеров Firefox 47.x, если вы пропустите установку "марионетка" в false или если вы установите "марионетка" в true, вы увидите IllegalStateException

Вариант использования 3:

В случае использования браузеров Firefox 53.x вы можете пропустить установку "marionette" на true, как показано ниже, в котором будут отображаться журналы Marionette INFO Listening on port 11105 например, Marionette INFO Listening on port 11105:

System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");

Вариант использования 4:

В случае использования браузеров Firefox 53.x вы можете явно установить "марионетку" в значение true через класс DesiredCapabilities, который будет также отображать журналы WARN Marionette, например, WARN TLS certificate errors will be ignored for this session

System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setCapability("marionette", true);
WebDriver driver =  new FirefoxDriver(dc);
driver.navigate().to("https://gmail.com");

Вариант использования 5:

В случае использования Firefox 53.x браузеров, если вы принудительно установить "марионетку" ложь через класс DesiredCapabilities вы будете наблюдать UnreachableBrowserException.

Ответ 3

Marionette - это новый драйвер, который поставляется с последними версиями Firefox.

Однако Geckodriver является прокси-сервером для использования W3C-совместимых клиентов с WebDriver для взаимодействия с браузерами на основе Gecko. Geckodriver предоставляет HTTP API, описанный протоколом WebDriver, для связи с браузерами Gecko, такими как версия Firefox выше 47.

System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
WebDriver driver = new FirefoxDriver();

Если проблемы все еще возникают (из-за несовместимости версий FF), вы можете использовать следующие возможности:

DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);