Java 远程Selenium 2 Webdriver实例如何接受不受信任的证书?

Java 远程Selenium 2 Webdriver实例如何接受不受信任的证书?,java,webdriver,selenium-webdriver,Java,Webdriver,Selenium Webdriver,我试图用JUnit实现一些Selenium2WebDriver测试。SeleniumHQ.org和web上的文档让我感到困惑,因为它似乎在SeleniumHQ.org和Webdriver之间来回跳跃。另外,我的Java不是很强。几年前我上过几门课,但没怎么用。我想让JUnit测试在无头CI服务器上运行,并让Firefox通过使用Webdriver在远程客户端系统上运行 根据我收集的信息,我可以使用以下代码在本地系统上打开一个由Webdriver控制的Firefox实例。我正在测试的网站有一个不受

我试图用JUnit实现一些Selenium2WebDriver测试。SeleniumHQ.org和web上的文档让我感到困惑,因为它似乎在SeleniumHQ.org和Webdriver之间来回跳跃。另外,我的Java不是很强。几年前我上过几门课,但没怎么用。我想让JUnit测试在无头CI服务器上运行,并让Firefox通过使用Webdriver在远程客户端系统上运行

根据我收集的信息,我可以使用以下代码在本地系统上打开一个由Webdriver控制的Firefox实例。我正在测试的网站有一个不受信任的SSL/TLS证书,所以我需要告诉Firefox驱动程序接受不受信任的证书。这在本地非常有效:

FirefoxProfile profile = new FirefoxProfile();
profile.setAcceptUntrustedCertificates(true);  // NOTE: this is the default behavior
RemoteWebDriver driver = new FirefoxDriver(profile);
Selenium selenium = new WebDriverBackedSelenium(driver, baseurl);
但我不知道如何在使用Webdriver的远程系统上实现这一点。这两种方法似乎完全不相容。上面的代码与我在远程使用Webdriver时使用的以下代码完全不符:

Selenium selenium = new DefaultSelenium(host, port, browser, baseurl);
selenium.start();

现在,我花了很多时间在远程测试系统上使用定制的Firefox配置文件。它在2012年夏天开始工作,但在最近的操作系统和浏览器更新之后,它停止了工作。创建Firefox驱动程序配置文件并调用setAcceptUntrustedCertificates(true)似乎更好。是否可以使用Webdriver在远程系统的浏览器中运行测试,并让浏览器忽略不受信任的SSL/TLS证书?

如您的问题中所述,您不需要设置任何属性来明确接受不受信任的证书。默认情况下,webdriver接受不受信任的证书。与使用webdriverbacked selenium不同,您应该直接使用remotewebdriver,如下所示:

Webdriver wd = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());
这里
http://localhost:4444/wd/hub
是测试应发送到其执行的中心的URL。启动测试时,hub将查找已注册firefox功能的远程节点


就我个人而言,我建议您阅读seleniumhq.org上的文档,而不是seleniumhq.org上的文档。据我所知,seleniumhq团队正在努力更新seleniumhq文档。您也可以对此做出贡献:)

首先,如果您只是为了配置文件而使用webdriver支持的selenium,我建议您坚持使用webdriver。您可以将要在本地计算机上使用的配置文件定义为

   File file = new File("firebug-1.8.1.xpi");
   FirefoxProfile firefoxProfile = new FirefoxProfile();
   firefoxProfile.addExtension(file);
   firefoxProfile.setPreference("extensions.firebug.currentVersion", "1.8.1"); 
   WebDriver driver = new FirefoxDriver(firefoxProfile);
回答您的问题:我将引用Simon Stewart的解决方案:

使用此配置文件创建远程驱动程序

现在,如果这不起作用,我们可以编写一个bug(或者至少是一个特性请求)


后期编辑:我无法真正测试此解决方案,因为我没有现成的证书问题网站。因此,在某种程度上,我会期待您的反馈,以了解真实情况……:)

当我问这个问题时,我不理解Selenium对象和WebDriver对象之间的区别。尽管我特别想了解Selenium 2的“WebDriver”特性,但我愚蠢地认为我可以用Selenium 2对象编写一个“Selenium 2 WebDriver”项目。对于有使用这些工具经验的人来说,这听起来很明显,但在阅读了“Selenium 2”的书籍和项目文档之后,我仍然不清楚这种区别

因此,我编写了Java代码来实例化一个Selenium对象来检查网页,并试图将Selenium对象传递给WebDriver对象,希望测试能够在远程服务器上运行

现在看起来更清楚了:Selenium和WebDriver项目合并到一个名为(令人困惑的)Selenium 2.0的新伞形项目中,但它们在Selenium 2中是不同的、独立的工具。如果我想使用WebDriver API,似乎必须将任何现有的Selenium对象转换为WebDriver对象。这两个工具之间似乎没有有用的交互作用

例如,在我的项目中,我有以下代码。它在本地桌面系统的web浏览器上运行良好:

Selenium-Selenium=newdefaultselenium(主机、端口、浏览器、baseurl);
selenium.get(urlPath);
selenium.type(用户名\字段,用户名);
selenium.type(密码\字段,密码);
selenium.单击(登录按钮);
但我希望能够在无头持续集成服务器上运行该测试,而不是在我的桌面系统上。我已将代码转换为使用WebDriver对象而不是Selenium对象。现在,它在连接到Selenium Grid 2服务器的远程系统上运行:

WebDriver-driver=新的RemoteWebDriver(新的URL(“http://10.0.0.29:4444/wd/hub(能力),;
获取(urlPath);
driver.findElement(By.name(username_字段)).sendKeys(username);
driver.findElement(By.name(password_字段)).sendKeys(password);
driver.findElement(By.className(login_按钮)).submit();
我希望其他想学习如何在Selenium 2中使用WebDriver的人不要像我读Selenium对象那样浪费时间,因为我认为Selenium对象是WebDriver的一部分。我目前的[n00b]建议是忽略任何提及Selenium对象的内容,只关注尽可能多地了解WebDriver对象。从SeleniumHQ.org上的WebDriver文档开始是一个很好的起点:

正如A.J.在回答中所建议的那样,还可以查看Selenium网格文档:


和PS:默认情况下,远程Selenium 2 Webdriver实例自动接受不受信任的SSL/TLS证书。不需要任何代码。

您使用webdriver支持的selenium而不是纯webdriver有什么原因吗?我使用WebDriverBackedSelenium的唯一原因是,这是我发现的唯一一种用FirefoxProfile对象实例化selenium对象的方法(因此我可以告诉它接受不受信任的证书)。我已经在SeleniumHQ.org上阅读了好几次文档,每次我都感到更加困惑。你有什么建议吗,Prashant?谢谢你,Prashant。你写的关于坚持普的事
 FirefoxProfile profile = new FirefoxProfile(); 
 profile.setAcceptUntrustedCertificates(true); 
 DesiredCapabilities caps = DesiredCapabilities.firefox(); 
 caps.setCapability(FirefoxDriver.PROFILE, profile);