2

我正在尝试使用 JUnit 实现一些 Selenium 2 Webdriver 测试。SeleniumHQ.org 和网络上的文档让我感到困惑,因为它似乎在 Selenium RC 和 Webdriver 之间来回跳跃。另外,我的Java不是很强大。几年前我上过一些课程,但没有用太多。我想让 JUnit 测试从无头 CI 服务器运行,并使用 Webdriver 在远程客户端系统上运行 Firefox。

根据我收集到的信息,我可以使用以下代码在本地系统上打开 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 证书?

4

3 回答 3

2

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

Webdriver wd = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());

http://localhost:4444/wd/hub是测试应发送到执行的集线器的 URL。当您开始测试时,集线器将查找已注册 Firefox 功能的远程节点。

我个人建议阅读http://code.google.com/p/selenium/wiki/Grid2而不是 seleniumhq.org 上的文档。据我所知,selenium 团队正在尝试更新 seleniumhq 文档。你也可以为它做贡献:)

于 2013-01-10T04:24:06.457 回答
2

首先,如果您仅将 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 的解决方案:

 FirefoxProfile profile = new FirefoxProfile(); 
 profile.setAcceptUntrustedCertificates(true); 
 DesiredCapabilities caps = DesiredCapabilities.firefox(); 
 caps.setCapability(FirefoxDriver.PROFILE, profile);

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

现在,如果这不起作用,我们可以写一个错误(或至少是一个功能请求)。

后编辑:我无法真正测试此解决方案,因为我没有现成的证书问题站点。所以在某种程度上,我会期待你的反馈以获得真实的画面...... :)

于 2013-01-10T07:03:30.313 回答
-1

当我问这个问题时,我不明白 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 对象。这两个工具之间似乎没有有用的交互。

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

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

selenium.get(urlPath);

selenium.type(username_field, username);
selenium.type(password_field, password);
selenium.click(login_button);

但我希望能够在无头持续集成服务器上运行该测试,而不是我的桌面系统。我已将代码转换为使用 WebDriver 对象而不是 Selenium 对象。现在它在连接到 Selenium Grid 2 服务器的远程系统上运行:

WebDriver driver = new RemoteWebDriver(new URL("http://10.0.0.29:4444/wd/hub"), capability);

driver.get(urlPath);

driver.findElement(By.name(username_field)).sendKeys(username);
driver.findElement(By.name(password_field)).sendKeys(password);
driver.findElement(By.className(login_button)).submit();

我希望其他想学习如何在 Selenium 2 中使用 WebDriver 的人不会像我阅读 Selenium 对象那样浪费时间,认为 Selenium 对象是 WebDriver 的一部分。我目前的 [n00b] 建议是忽略任何提及 Selenium 对象的内容,而只专注于尽可能多地了解 WebDriver 对象。SeleniumHQ.org 上的 WebDriver 文档是一个很好的起点:

正如 AJ 在他的回答中建议的那样,还请查看 Selenium Grid 文档:

PS:远程 Selenium 2 Webdriver 实例默认自动接受不受信任的 SSL/TLS 证书。无需代码。

于 2013-01-11T17:36:37.063 回答