Разница между 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?




Ответы (3)


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

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

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

Для клиента 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
person Florent B.    schedule 10.05.2017
comment
Драйвер Gecko (ранее назывался проводами) - на этом спасибо. Это объясняет некоторые недопонимания. - person Peter M. - stands for Monica; 31.05.2017
comment
я не могу найти официальную страницу загрузки geckodriver. у вас где-то хранится ссылка ?? - person oldboy; 24.07.2018

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

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

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

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

Марионетка

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

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

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 вы должны явно установить для "marionette" значение 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, если вы пропустите установку "marionette" на false или если вы установите для "marionette" значение true, вы увидите IllegalStateException

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

В случае использования браузеров Firefox 53.x вы можете пропустить установку «марионетки» в значение true, как показано ниже, чтобы отобразить журналы информации о марионетках, например. 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 вы можете явно установить для "marionette" значение true с помощью класса DesiredCapabilities, который также будет отображать журналы Marionette WARN, например, 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, если вы принудительно установите для «марионетки» значение false через класс DesiredCapabilities, вы увидите UnreachableBrowserException.

person DebanjanB    schedule 11.05.2017
comment
Большое спасибо! Я нашел так много статей, в которых говорилось, что установка марионетки на истинное или ложное устранила это. Это первая статья, объясняющая почему, а не просто слепое решение для программирования культа карго. - person Peter M. - stands for Monica; 31.05.2017

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);
person satender    schedule 19.06.2017
comment
Значит, драйвер марионетки должен поддерживать функцию, недоступную в geckodriver? - person Thomas Lee; 11.09.2017