gpt4 book ai didi

java - 将 ssl 证书添加到 selenium-webdriver

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:36 43 4
gpt4 key购买 nike

我使用 selenium 对 chromeDriver 进行端到端测试。要测试的网站需要 ssl 证书。当我手动打开浏览器时,会出现一个弹出窗口,让我选择一个已安装的证书。不同的测试访问不同的URL,也需要不同的证书。但是,如果我以 headless 模式运行测试,则不会出现弹出窗口。所以我需要一种方法来以编程方式设置证书(例如设置 .pem 文件)以用于当前测试。

我怎样才能做到这一点?我尝试设置一个 browserMob然后我在 selenium 中配置为代理的代理 - 但是,这似乎没有做任何事情......有更好的方法吗?我究竟做错了什么?这是我尝试过的:

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(...))

最佳答案

显然,开箱即用的 BrowserMob 是不可能的。因此,我编写了一个代理扩展 SeleniumSslProxy,它可以插入 Selenium 并添加基于证书的身份验证以创建 HTTPS 连接。

它是这样工作的:

  • 使用 BrowserMob 拦截 Selenium HTTP 请求
  • 在给定证书(.pfx 文件)和密码的情况下设置 SSLContext
  • 使用okhttp将请求转发到目标 URL
  • 将 okhttp Response 转换为 netty FullHttpResponse,以便 Selenium 可以处理它

您可以在 github 上找到代码.这是一个如何在 Selenium 端到端测试中使用它的示例(也适用于 headless 模式):

@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 进行细微调整才能与其他驱动程序一起使用。

关于java - 将 ssl 证书添加到 selenium-webdriver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017155/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com