WebDriver и SSL Untrusted certificate

Здравствуйте.

Тестируемый сайт использует ненадежный SSL сертификат.

При открытии урла всплывает диалоговое окно выбора этого самого сертификата(Chrome, IE).

Может кто сталкивался с таким, как с помощью WebDriver выбрать нужный сертификат и зайти на сайт?

Используется VS2012 + WebDriver + NUnit

для firefox

ProfilesIni allProfiles = new ProfilesIni();
System.setProperty("webdriver.firefox.profile","your custom firefox profile name");
String browserProfile = stem.getProperty("webdriver.firefox.profile");
FirefoxProfile profile = allProfiles.getProfile(browserProfile); 
profile.setAcceptUntrustedCertificates (true); 
webdriver = new FirefoxDriver(profile); 

 

для chrome можно поставить switches, чтобы игнорировать такие ошибки

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);


для ie (http://sqa.stackexchange.com/questions/1928/problem-with-ie9-security-certificate-when-accessing-https-urls-using-selenium-2)

webDriver.navigate().to("javascript:document.getElementById('overridelink').click()");

 

для opera

DesiredCapabilities capabilities = DesiredCapabilities.opera();
capabilities.setCapability("opera.profile", new OperaProfile("/path/to/existing/profile"));
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
WebDriver driver = new OperaDriver(capabilities);
2 лайка

Спасибо! Мне тоже как раз эта инфа нужна была, здесь все в одном месте собрано :)))

Спасибо

Спасибо! Мне тоже это нужно.

А не подскажете, что делать дальше?

У меня открывается окошко, в котором надо выбрать сертификат из нескольких имеющихся. Как это можно сделать?

Насколько я поняла, Селениум с такими окошками работать не умеет. Пробовала имитировать нажатие кнопок через Windows Forms - не получается.

Попробуйте подойти к проблеме с другого конца.

Зачем тестировать приложение на https?

Тестируйте его на http! Мы обычно запускаем наш приложение на http://localhost:8080 и там прогоняем все тесты. 

Затем, что сертификаты - неотъемлемая часть приложения :) А http и https у нас - принципиально разные приложения. 

Так что с другого конца не получится. 

На самом деле, уже разобралась, как делать. 

ну если разобрались как сделать, напишите решение, чтобы другие тоже увидели, на будущее

Напишите, пожалуйста, решение проблемы!

Я сделала так: сначала переключилась на диалоговое окно с помощью команды Alert:

 

            IAlert alert = driver.SwitchTo().Alert();
Переключаться пришлось 2 раза, т.к. сначала всплывает окошко типа "Подождите", а потом уже со списком сертификатов.
 
А потом в этом окне с помощью методов из System.Windows.Forms стрелками вниз выбирала нужный сертификат. 
            SendKeys.SendWait("{DOWN}");
            SendKeys.SendWait("{ENTER}");
Способ не универсальный, т.к. в общем случае не известно, каким по счету будет нужный сертификат, но мне пока подходит.

Если кто придумает более общий способ - пишите :)

	DesiredCapabilities capabilities = DesiredCapabilities.chrome();

	capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));

	driver = new ChromeDriver(capabilities);

после этих команд всё равно запрашивает подтверждение сертификата на хроме, язык ява

что нужно писать после этого метода?

 Alert alert = driver.switchTo().alert(); 

так как > SendKeys.SendWait("{ENTER}"); SendWait is undefined for the type SendKeys

Правильное решение, на которое никто так и не ответил - передача флага --test-types в DesiredCapabilities

А почему просто не добавить сертификат в доверенные рут на тестовой машине? Он ведь selfsigned вашим сервером и доверие к нему есть

--test-types флаг добавлен в 35 версии хрома, которая вышла в апреле 2014. А теперь обратите внимание на дату поста. К тому же, автор спрашивал и за IE, а не только хром.

Возник такой вопрос. А что если драйвер кликает на элемент на странице(для которой уже разобрались как принимать ненадежные сертификаты), но клик на этот элемент инициирует(внутри с помощью js) вызов метода какого-то апи. Этот метод - это пост метод, у которого (пусть) request url https://a.test.ru/method. При попытке в браузере перейти по этому адресу возникает такая же ошибка по поводу ненадежного сертификата. Вопрос вот в чем: могу я быть уверен, что выставление флажков в профиле вебдрайвера на принятие ненадежных сертификатов гарантирует мне принятие сертификатов и при неявном обращении к ресурсам, у которых ненадежные сертификаты? спасибо!

Ответьте пожалуйста подробнее. как передать этот флаг?

Решить вопрос сертификата , в случае WIN OS можно через реестр.
Пример для хрома

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls]
"1"="{\"pattern\":\"YoursiteURL\",\"filter\":{}}"
"2"="{\"pattern\":\"YoursiteURL/*\",\"filter\":{}}"
1 лайк

Слушайте, пора уже прекращать эти разговоры про ненадёжные сертификаты.
Регистрируйте это как баг, пусть админы настроят надёжный сертификат.
В наше время это делается легко и бесплатно. Например, утилита “letsencrypt” позволяет легко это делать.

1 лайк

Это вы просто в корпорациях не работали. некоторые вещи - непреодолимая боль которую нужно принять.

1 лайк

Очень даже работал.
И прекрасно понимаю, что ещё пару лет назад добиться от админов нормальных сертификатов было бы нереально.

Но сегодня - другое дело.
Я ж поэтому и дал ссылку: сегодня эта проблема легко решается.