Как удаленный экземпляр Webelriver Selenium 2 принимает недоверенные сертификаты?

Я пытаюсь выполнить некоторые тесты Selenium 2 Webdriver с JUnit. Документация на SeleniumHQ.org и в Интернете сбивает меня с толку, потому что она, кажется, прыгает назад и вперед между Selenium RC и Webdriver. Кроме того, моя Java не очень сильная. Я взял несколько курсов несколько лет назад, но не использовал его много. Я хочу, чтобы тесты JUnit выполнялись с безгласного CI-сервера, а Firefox запускался на удаленной клиентской системе с помощью Webdriver.

Из того, что я собрал, я могу использовать следующий код, чтобы открыть управляемый Webdriver экземпляр Firefox в моей локальной системе. На веб-сайте, на котором я тестирую, есть ненадежный сертификат SSL/TLS, поэтому мне нужно сообщить драйверу Firefox принять ненадежные сертификаты. Это прекрасно работает на местном уровне:

FirefoxProfile profile = new FirefoxProfile();
profile.setAcceptUntrustedCertificates(true); //NOTE: this is the default behavior
RemoteWebDriver driver = new FirefoxDriver(profile);
Selenium selenium = new WebDriverBackedSelenium(driver, baseurl);

Но я не могу понять, как это сделать на удаленной системе с помощью Webdriver. Эти два подхода кажутся совершенно несовместимыми. Вышеприведенный код не вписывается в следующий код, который я использовал для удаленного использования Webdriver:

Selenium selenium = new DefaultSelenium(host, port, browser, baseurl);
selenium.start();

Теперь я провел много часов, работая с пользовательскими профилями Firefox в удаленной тестовой системе. Он работал летом 2012 года, но после недавних обновлений ОС и браузера он прекратил работать. Намного лучше создать профиль драйвера Firefox и вызвать setAcceptUntrustedCertificates (true). Можно ли использовать Webdriver для запуска тестов в браузере в удаленной системе, а также игнорировать браузер с ненадежными сертификатами SSL/TLS?

2
nl ja de
Есть ли причина, по которой вы используете webdriver с поддержкой селена вместо чистого webdriver?
добавлено автор Prashant Shukla, источник
Единственная причина, по которой я использую WebDriverBackedSelenium, заключается в том, что это единственный способ создать экземпляр объекта Selenium с объектом FirefoxProfile (так что я могу сказать, что он принимает ненадежные сертификаты). Я читал документацию на SeleniumHQ.org несколько раз, и каждый раз я становлюсь более смущенным. Что бы вы порекомендовали, Прашант?
добавлено автор Steve HHH, источник

3 ответы

Как уже упоминалось в вашем вопросе, вам не нужно устанавливать какое-либо свойство для принятия ненадежных сертификатов явно. По умолчанию webdriver принимает ненадежные сертификаты. Вместо использования webdriverbacked selenium вы должны использовать remotewebdriver прямо так:

Webdriver wd = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());

Здесь http://localhost: 4444/wd/hub - это URL-адрес концентратора, для которого тесты должны отправляться на исполнение. Когда вы начнете тесты, концентратор будет искать удаленные узлы, которые зарегистрировались с возможностью firefox.

Лично я бы предложил прочитать документацию на http://code.google.com/p/selenium/wiki/Grid2 , а не seleniumhq.org. Насколько мне известно, команда селена пытается обновить документацию seleniumhq. Вы также можете внести свой вклад в это :)

2
добавлено
Благодарю вас, A.J. То, что вы написали об использовании концентратора, и эта ссылка на Grid2, заставили меня начать в правильном направлении. Я пытался вставить объект WebDriver в объект Selenium и не понимал, что могу полностью избавиться от использования объектов Selenium и просто использовать объект WebDriver для поиска элементов на странице. Это был очень неприятный опыт, пытаясь понять, как объекты Selenium и WebDriver связаны и работают, но я начинаю понимать. Я был бы рад внести свой вклад в документацию SeleniumHQ, как только я смогу обернуть ее вокруг. Еще раз спасибо. Я проголосовал за ваш ответ.
добавлено автор Steve HHH, источник

Прежде всего, я порекомендую придерживаться webdriver, если вы используете webdriver backed selenium только для профиля. Вы можете определить профиль, который будет использоваться на вашей локальной машине, как

   File file = new File("firebug-1.8.1.xpi");
   FirefoxProfile firefoxProfile = new FirefoxProfile();
   firefoxProfile.addExtension(file);
   firefoxProfile.setPreference("extensions.firebug.currentVersion", "1.8.1"); 
   WebDriver driver = new FirefoxDriver(firefoxProfile);

To Answer Your Question: I will quote Simon Stewart's solution from here:

 FirefoxProfile profile = new FirefoxProfile(); 
 profile.setAcceptUntrustedCertificates(true); 
 DesiredCapabilities caps = DesiredCapabilities.firefox(); 
 caps.setCapability(FirefoxDriver.PROFILE, profile);

Используйте этот профиль для создания удаленного драйвера.

Если это не работает, мы можем написать ошибку (или, по крайней мере, запрос функции).

post edit: I can not really test this solution as I dont have a cert issue site readily available. So in a way I would be looking towards you feedback to get the real picture... :)

2
добавлено
Благодарю вас, Прашант. То, что вы писали о прилипании к чистому Webdriver, привело меня к правильному пути. Я пытался вставить объект WebDriver в объект Selenium. Я не понимал, что могу полностью избавиться от использования объектов Selenium и просто использовать объект WebDriver для поиска элементов на странице. Это было связано с моим принципиальным непониманием технологии Webdriver и тем, как оно относится к старой технологии Selenium RC (чего я пытался избежать). Это действительно грязные воды! Еще раз спасибо. Я проголосовал за ваш ответ.
добавлено автор Steve HHH, источник

Когда я задал этот вопрос, я не понял различия между объектами Selenium и объектами WebDriver. Несмотря на то, что я специально пытался узнать о функции «WebDriver» от Selenium 2, я с глупостью подумал, что могу написать проект «Selenium 2 Webdriver» с объектами Selenium 2. Это может показаться очевидным для тех, кто имеет опыт работы с этими инструментами, но это различие все еще не явилось в моем сознании после прочтения книг и проектной документации «Selenium 2».

В результате я писал код Java, чтобы создать экземпляр объекта Selenium для изучения веб-страницы и попытаться передать объект Selenium объекту WebDriver в надежде, что тест будет выполняться на удаленном сервере.

Теперь кажется яснее: проекты Selenium и WebDriver слились в новый зонтичный проект, названный (смущающий) Selenium 2.0, но они являются отдельными и отдельными инструментами в Selenium 2. Если я хочу использовать API WebDriver, кажется, что я должен преобразовать любые существующие объекты Selenium для объектов WebDriver. Кажется, что нет никакого полезного взаимодействия между этими двумя инструментами.

Например, в моем проекте у меня был следующий код. Он отлично работает на веб-браузере локальной настольной системы:

Selenium selenium = new DefaultSelenium(host, port, browser, baseurl);

selenium.get(urlPath);

selenium.type(username_field, username);
selenium.type(password_field, password);
selenium.click(login_button);

Но я хочу иметь возможность запускать этот тест на безголовом сервере непрерывной интеграции, а не в моей настольной системе. Я преобразовал код для использования объекта WebDriver вместо объекта Selenium. Теперь он запускается на удаленной системе, подключенной к серверу Selenium Grid 2:

WebDriver driver = new RemoteWebDriver(new URL("http://10.0.0.29:4444/wd/hub"), capability);

driver.get(urlPath);

driver.findElement(By.name(username_field)).sendKeys(username);
driver.findElement(By.name(password_field)).sendKeys(password);
driver.findElement(By.className(login_button)).submit();

Я надеюсь, что другие люди, желающие узнать, как использовать WebDriver в Selenium 2, не будут тратить столько времени, сколько я читал о объектах Selenium, думая, что объект Selenium является частью WebDriver. Мой текущий [n00b] совет - игнорировать все, что упоминает объекты Selenium, и сосредоточиться исключительно на том, чтобы узнать как можно больше о объектах WebDriver. Хорошим местом для начала является документация WebDriver на SeleniumHQ.org:

Как А.J. предложенный в его ответе, также взгляните на документацию Selenium Grid:

И PS: удаленный экземпляр Selenium 2 Webdriver автоматически принимает недоверенные сертификаты SSL/TLS по умолчанию. Не требуется код.

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async