Добавить ssl-сертификат в selenium-webdriver - PullRequest
11 голосов
/ 07 мая 2019

Я использую селен для сквозного теста с chromeDriver. Сайты для тестирования требуют ssl сертификата. Когда я вручную открываю браузер, появляется всплывающее окно, которое позволяет мне выбрать установленный сертификат. Различные тесты обращаются к разным URL-адресам, а также требуют разные сертификаты Однако, если я запускаю тесты в автономном режиме, всплывающее окно отсутствует. Поэтому мне нужен способ программно установить сертификат (например, установить файл .pem), который будет использоваться для текущего теста.

Как мне этого добиться? Я попытался настроить прокси browserMob , который я затем настроил в качестве прокси в Selen - однако, похоже, это ничего не дает ... Есть ли лучшие подходы? Что я делаю неправильно? Вот что я попробовал:

PemFileCertificateSource pemFileCertificateSource = new PemFileCertificateSource(
        new File("myCertificate.pem"),
        new File("myPrivateKey.pem"),
        "myPrivateKeyPassword");

ImpersonatingMitmManager mitmManager = ImpersonatingMitmManager.builder()
        .rootCertificateSource(pemFileCertificateSource)
        .build();

BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();
browserMobProxy.setTrustAllServers(true);
browserMobProxy.setMitmManager(mitmManager);

browserMobProxy.start(8080);


ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setProxy(ClientUtil.createSeleniumProxy(browserMobProxy));

WebDriver webDriver = new ChromeDriver(chromeOptions);

// use the webdriver for tests, e.g. assertEquals("foo", webDriver.findElement(...))

1 Ответ

5 голосов
/ 16 мая 2019

Таким образом, это невозможно с BrowserMob из коробки. Поэтому я написал расширение прокси SeleniumSslProxy, которое можно подключить к Selenium и добавляет аутентификацию на основе сертификатов для создания HTTPS-соединения.

Вот как это работает:

  • перехватывает запросы Selenium HTTP с BrowserMob
  • установить SSLContext с учетом сертификата (файл .pfx) и пароля
  • используйте okhttp для пересылки запроса на целевой URL
  • конвертирует okhttp Response в нетто FullHttpResponse, чтобы он мог обрабатываться Selenium

Вы можете найти код на github . Вот пример того, как его можно использовать в комплексных тестах Selenium (также работает в режиме без головы):

@Before
public void setup() {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    File clientSslCertificate = new File(
        classLoader.getResource("certificates/some-certificate.pfx").getFile());
    String certificatePassword = "superSecret";

    this.proxy = new SeleniumSslProxy(clientSslCertificate, certificatePassword);
    this.proxy.start();

    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.setProxy(proxy);
    this.webDriver = new ChromeDriver(chromeOptions);
}

@Test
public void pageTitleIsFoo() {
    // given
    String url = "http://myurl.lol";
    // NOTE: do not use https in the URL here. It will be converted to https by the proxy.

    // when
    this.webDriver.get(url);
    this.webDriver.manage().timeouts().implicitlyWait(5, SECONDS);

    // then
    WebElement title = this.webDriver.findElement(By.className("title"));
    assertEquals("Foo", title.getText());
}

@After
public void teardown() {
    this.webDriver.quit();
    this.proxy.stop();
}

Обратите внимание, что я использовал только chromeDriver и никогда не тестировал его с другими драйверами. Небольшие корректировки SeleniumSslProxy могут потребоваться для использования с другими драйверами.

...