Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向selenium webdriver添加ssl证书_Java_Selenium_Selenium Webdriver_Ssl Certificate_Browsermob Proxy - Fatal编程技术网

Java 向selenium webdriver添加ssl证书

Java 向selenium webdriver添加ssl证书,java,selenium,selenium-webdriver,ssl-certificate,browsermob-proxy,Java,Selenium,Selenium Webdriver,Ssl Certificate,Browsermob Proxy,我使用硒与chromeDriver进行端到端测试。要测试的网站需要ssl证书。当我手动打开浏览器时,会出现一个弹出窗口,允许我选择已安装的证书。不同的测试访问不同的URL,也需要不同的证书。但是,如果我在headless模式下运行测试,则不会出现弹出窗口。因此,我需要一种方法来编程设置一个证书(例如,设置一个.pem文件)以用于当前测试 我怎样才能做到这一点? 我尝试设置一个代理,然后在selenium中将其配置为代理-但是,这似乎没有任何作用。。。有更好的方法吗?我做错了什么?以下是我尝试过的

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

我怎样才能做到这一点? 我尝试设置一个代理,然后在selenium中将其配置为代理-但是,这似乎没有任何作用。。。有更好的方法吗?我做错了什么?以下是我尝试过的:

PemFileCertificateSource PemFileCertificateSource=新PemFileCertificateSource(
新文件(“myCertificate.pem”),
新文件(“myPrivateKey.pem”),
“myPrivateKeyPassword”);
ImpersonatingMitmanager-Mitmanager=ImpersonatingMitmanager.builder()
.rootCertificateSource(pemFileCertificateSource)
.build();
BrowserMobProxy BrowserMobProxy=新建BrowserMobProxyServer();
browserMobProxy.setTrustAllServers(true);
setMitmManager(mitmManager);
browserMobProxy.start(8080);
ChromeOptions ChromeOptions=新的ChromeOptions();
setProxy(ClientUtil.createSeleniumProxy(browserMobProxy));
WebDriver WebDriver=新的ChromeDriver(chromeOptions);
//使用webdriver进行测试,例如assertEquals(“foo”、webdriver.findelelement(…)

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

这就是它的工作原理:

  • 使用BrowserMob拦截Selenium HTTP请求
  • 为证书(.pfx文件)和密码设置
    SSLContext
  • 用于将请求转发到目标URL
  • 将okhttp
    响应
    转换为netty
    FullHttpResponse
    ,以便Selenium可以处理它
你可以在上面找到代码。下面是一个如何在Selenium端到端测试中使用它的示例(也适用于无头模式):


请注意,我只使用了chromeDriver,从未用其他驱动程序测试过它。其他驾驶人可能需要对SeleniumSlproxy进行轻微调整。

查看@AdiOhana我已经搜索过很多次了。。。此链接中的人只描述了如何避免不受信任的证书错误-这不是我想要的,我需要通过编程设置要使用的证书。对,但其中一个答案是:“通过添加包含以下内容的注册表项,您可以告诉Chrome浏览器对特定URL使用特定的客户端证书:“这就是你要找的吗?不是真的。。。对每个测试的注册表进行更改时感觉有点脏。另外,在某个时候,我想在docker容器中运行这些测试,因此这将不再可能。如果您根据您的网站为每个测试用例创建一个具有所需证书的新驱动程序(和浏览器),则可以在docker容器中运行这些测试。
@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();
}