Java 如何使SeleniumWebDriver动态选择客户端证书,而无需直观地检测弹出窗口
我正在尝试使用Java和Selenium来测试一个需要客户端证书的网站。 当我浏览到我的网站时,我会看到一个类似下面的弹出窗口,用于选择正确的证书 我的要求如下:Java 如何使SeleniumWebDriver动态选择客户端证书,而无需直观地检测弹出窗口,java,internet-explorer,selection,client-certificates,selenium-iedriver,Java,Internet Explorer,Selection,Client Certificates,Selenium Iedriver,我正在尝试使用Java和Selenium来测试一个需要客户端证书的网站。 当我浏览到我的网站时,我会看到一个类似下面的弹出窗口,用于选择正确的证书 我的要求如下: 按名称选择证书 在不同版本的Windows/IE/Edge上 理想情况下,不会显示弹出窗口;i、 例如,解决方案将涉及调用一些API或设置一些配置来锁定要使用的正确证书 我自己的解决方案想法: 我尝试了一个解决方案,该方案基于使用(确实有效)直观地检测正确的证书,但我想知道是否有更好的解决方案不依赖于直观地检测弹出窗口。如果
- 按名称选择证书
- 在不同版本的Windows/IE/Edge上
我自己的解决方案想法:
- 我尝试了一个解决方案,该方案基于使用(确实有效)直观地检测正确的证书,但我想知道是否有更好的解决方案不依赖于直观地检测弹出窗口。如果Microsoft决定更改此弹出窗口的外观,则在多个版本的Windows中发生故障的可能性较小,并且是未来的证明
- 我的另一个想法(但我不知道如何/是否可能)是删除除一个之外的所有已安装证书,以便永远不会显示弹出窗口:
- 备份整个商店
- 删除IE可以使用的所有客户端证书(我需要的证书除外)
- 进行不再需要任何证书选择的登录
- 恢复备份的存储
- 是否可以启动(使用Selenium Java)一个只知道我需要的单个证书的Internet Explorer窗口
- 在Internet Explorer中是否可以为给定域设置默认证书
- 我不能肯定,但如果硒不可能做到这一点,我也不会感到惊讶
这个问题并没有让我充满希望:
你越是远离网页,转向本机浏览器,然后转向操作系统控件,Selenium就变得越无能
正如链接问题的唯一答案所述:您可以禁用浏览器中的弹出窗口,这可能是可行的解决方案,也可能不是可行的解决方案
如果您不想走这条路,人们通常会求助于Java机器人来处理selenium驱动程序无法完成的事情,例如与打印对话框和其他此类控件交互
见mouseMove,mousePress,mouseerelease
您可以调用其中的每一个,为mouseMove提供按钮位置。
我们使用的解决方案非常干净、简单且可在浏览器和操作系统之间移植-使用代理服务器为您处理SSL握手 您可以在测试运行的同一JVM中设置一个内存中人中间代理服务器,甚至在不同端口上设置多个实例,每个实例分配给不同的客户端证书。然后,在创建WebDriver实例时,请使用适合您的浏览器的。注意,浏览器将显示安装在代理本身而不是目标服务器上的服务器证书,因此可能存在一些无效的证书错误,应在WebDriver设置中禁止这些错误。或者-代理可以简单地使用有效的服务器证书,如果您可以使用它的密钥,在这种情况下,连接对于测试脚本是完全透明的 提供Java所需功能的一个简单代理服务器是。也许类似的东西提供了一个更完整的解决方案,具有现成的API 使用LittleProxy的示例只需要几(十几)行样板文件: 第一步:
扩展
org.littleshoot.proxy.MitmManager
类,使用客户端证书(例如p12文件或PEM文件)将其插入到代码中。工作示例可在网站上公开获取
第二步:使用您选择的客户端证书和服务器证书启动代理服务器:
org.littleshoot.proxy.impl.DefaultHttpProxyServer.DefaultHttpProxyServer.bootstrap()
.withIdleConnectionTimeout(FIVE_MINUTES)
.withName(clientCertFile.getName())
.withPort(port)
.withAllowLocalOnly(localConnectionOnly)
.withManInTheMiddle(new MutualAuthenticationCapableMitmManager(
usingPKCS12File(clientCertFile, clientCertPassword),
usingPemKeyPair(serverKeyPair[0], serverKeyPair[1])))
.start();
为需要重用同一端口或通过startnig并发实例的每个客户端证书创建另一个代理
第三步:使用代理启动WebDriver。主要浏览器(如Firefox、Chrome)以类似方式支持此设置:
org.openqa.selenium.Proxy proxy = new Proxy();
proxy.setSslProxy("127.0.0.1:5555");
proxy.setNoProxy("<-loopback>"); // overwrite the default no-proxy for localhost, 127.0.0.1
FirefoxOptions options = new FirefoxOptions();
options.setProxy(proxy);
WebDriver driver = new FirefoxDriver(options);
org.openqa.selenium.Proxy Proxy=newproxy();
proxy.setSslProxy(“127.0.0.1:5555”);
proxy.setNoProxy(“”;//覆盖本地主机的默认无代理127.0.0.1
FirefoxOptions=新的FirefoxOptions();
选项。设置代理(代理);
WebDriver=newfirefoxdriver(选项);
第四步:在运行测试时,浏览器不会因为任何证书提示而打扰您。利润
如果使用此技术,请格外小心,以确保机密的安全,尤其是代理服务器本身无法被第三方访问。在安全的公司网络之外公开密钥从来都不是一个好主意,不管它们是真的(!!!)还是假的。您是否查看过:
SSLContexts.custom().loadTrustMaterial(新文件(路径)、密码、新TrustSelSignedStrategy()).build()代码>?这将返回一个SSLContext。如果这是一个好方法,我可以在这方面帮助您,我使用Selenium开发了一个SSL自签名证书。请参阅:(示例2)@Bob如何向Selenium注册此SSLContext?这个解决方案会让Internet Explorer在不询问弹出窗口的情况下使用文件中的客户端证书吗?我很担心。机器人解决方案类似于我的SikuliX解决方案,是我想要避免的事情。我希望java能够以一种干净的方式操作证书存储,从而能够恢复初始状态,或者理想情况下可以使用一些IE配置自动获取所需的证书。