由于 SSL 证书使用 Selenium Webdriver 和 BrowserMob 代理来捕获 har 文件,因此无法加载资源

Posted

技术标签:

【中文标题】由于 SSL 证书使用 Selenium Webdriver 和 BrowserMob 代理来捕获 har 文件,因此无法加载资源【英文标题】:Unable to load resource due to SSL certificates using Selenium Webdriver with BrowserMob proxy to capture har file 【发布时间】:2013-06-07 09:52:12 【问题描述】:

我在 Java 中使用 Selenium Webdriver (Chromedriver) 以及 BrowserMob 代理服务器来捕获 har 文件中的 HTTP 流量。我最近遇到了网站部分无法加载的问题,我已将其缩小为以下错误: "未能加载资源https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"。

似乎在使用代理服务器时,Selenium 驱动程序无法访问 https 链接的 SSL 证书。这是我正在使用的代码的 sn-p:

ProxyServer server = new ProxyServer(4040);
server.start();
Proxy proxy = server.seleniumProxy();
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, proxy);
driver = new ChromeDriver(capabilities);
server.newHar("myHar");
Har har = server.getHar();
server.stop();

我尝试添加"capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);",这解决了上述问题,但前提是我删除"capabilities.setCapability(CapabilityType.PROXY, proxy);",然后我不再能够捕获har文件。

我尝试切换到 firefox 驱动程序并设置 firefox 配置文件,但要么我做得不正确,要么它也不适合我的目的。

我也尝试在 Trusted Root Certifaction Authorities 中设置 BrowserMob 代理附带的 cybervillainsCA 证书,但这也没有解决问题。

有谁知道如何以收集 HTTP 流量并成功加载上述资源的方式解决此问题?

【问题讨论】:

我可以向this one提出重复的问题 【参考方案1】:

我最终做的是完全取消代理,转而使用带有 Firebug 和 NetExport 扩展的 Firefox 配置文件来导出 har 文件。这最终显着减慢了测试速度,并为每个访问的页面而不是整个会话导出一个 har。

代码://Firefox profile FirefoxProfile ffProfile = new FirefoxProfile();ffProfile.addExtension(new File("firebug-1.11.4-fx.xpi"));ffProfile.addExtension(new File("netExport-0.9b3.xpi"));

//Set default Firefox preferences ffProfile.setPreference("app.update.enabled", false); String domain = "extensions.firebug.";

//Set default Firebug preferences ffProfile.setPreference(domain + "currentVersion", "1.11.4"); ffProfile.setPreference(domain + "allPagesActivation", "on");ffProfile.setPreference(domain + "defaultPanelName", "net"); ffProfile.setPreference(domain + "net.enableSites", true);

//Set default NetExport preferences ffProfile.setPreference(domain + "netexport.alwaysEnableAutoExport", true);ffProfile.setPreference(domain + "netexport.autoExportToFile", true);ffProfile.setPreference(domain + "netexport.showPreview", false);ffProfile.setPreference(domain + "netexport.defaultLogDir", "string file path");

//WebDriver, instantiated outside the methoddriver = new FirefoxDriver(ffProfile);s = new WebDriverBackedSelenium(driver, "http://www.google.ca/");

我在每页之后收集的har文件如下:

HarFileReader r = new HarFileReader();HarFileWriter w = new HarFileWriter();int count = 1;String allHars = "";String harFolderPath = "file path for har";File dir = new File(harFolderPath);for (File child : dir.listFiles()) HarLog log = r.readHarFile(child);File f = new File(harFolderPath + "\\test"+count+".txt");w.writeHarFile(log, f);allHars = allHars + readFileAsString(f.getPath());count++;FileUtils.cleanDirectory(dir);

【讨论】:

以上是关于由于 SSL 证书使用 Selenium Webdriver 和 BrowserMob 代理来捕获 har 文件,因此无法加载资源的主要内容,如果未能解决你的问题,请参考以下文章

使用keytool生成ssl证书

通过 SSL 进行 WCF 通信:由于第三方受信任的根证书颁发机构导致的 WCF 访问问题

Charles ssl 证书下载失败“由于网络故障”

零基础Selenium:Webdriver图文入门教程java篇(附相关包下载)

尝试从 AWS Lambda 但不是桌面访问 AWS Device Farm 时出现 SSL 证书错误

企业为啥不能使用自签名SSL证书?