使用 WebDriver 支持 Selenium

Selenium 2 的 Java 和 .NET 版本提供了原始 Selenium API 的实现

(之前位于:https://github.com/SeleniumHQ/selenium/wiki/Selenium-Emulation

使用 WebDriver 支持 Selenium

WebDriver 的 Java 和 .NET 版本提供了现有 Selenium API 的实现。在 Java 中,它是这样使用的

// You may use any WebDriver implementation. Firefox is used here as an example
WebDriver driver = new FirefoxDriver();

// A "base url", used by selenium to resolve relative URLs
String baseUrl = "http://www.google.com";

// Create the Selenium implementation
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

// Perform actions with selenium
selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");

// And get the underlying WebDriver implementation back. This will refer to the
// same WebDriver instance as the "driver" variable above.
WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getUnderlyingWebDriver();

优点

  • 允许 WebDriver 和 Selenium 并存。
  • 为从现有 Selenium API 到 WebDriver 的托管迁移提供了一种简单的机制。
  • 不需要运行独立的 Selenium RC 服务器

缺点

  • 不实现每个方法
    • 但我们很乐意收到反馈!
  • 也模拟 Selenium Core
    • 因此,更高级的 Selenium 用法(即使用“browserbot”或其他来自 Selenium Core 的内置 Javascript 方法)可能需要改进
  • 由于底层实现差异,某些方法可能较慢
  • 不支持 Selenium 的“用户扩展”(,user-extensions.js)

注意事项

使用给定的 Driver 创建 WebDriverBackedSelenium 实例后,不必调用 start() - 因为 Driver 的创建已经启动了会话。在测试结束时,应调用 stop() 而不是 Driver 的 quit() 方法。

这更类似于 WebDriver 的行为 - 因为创建 Driver 实例会启动会话,但必须通过调用 quit() 显式终止它。

使用 RemoteWebDriver 支持 Selenium

从 2.19 版本开始,WebDriverBackedSelenium 可以用于 WebDriver 和 Selenium 支持的任何语言。

例如,在 Python 中

driver = RemoteWebDriver(desired_capabilities = DesiredCapabilities.FIREFOX)
selenium = DefaultSelenium('localhost', '4444', '*webdriver', 'http://www.google.com')
selenium.start(driver = driver)

如果您保留对您创建的原始 WebDriver 和 Selenium 对象的引用,您甚至可以互换使用这两个 API。诀窍是将“*webdriver”浏览器名称传递给 Selenium 实例,并且在调用 start() 时传递 WebDriver 实例。

在 DefaultSelenium 没有 start(driver) 的语言中,您可以通过将 WebDriver 会话 ID 提供给 Selenium 对象,将 WebDriver 和 Selenium 对象连接在一起。

例如,在 C# 中


RemoteWebDriver driver = new RemoteWebDriver(DesiredCapabilities.Firefox());
string sessionId = (string) driver.Capabilities.GetCapability("webdriver.remote.sessionid");
DefaultSelenium selenium = new DefaultSelenium("localhost", 4444, "*webdriver", "http://www.google.com");
selenium.Start("webdriver.remote.sessionid=" + sessionId);

使用 Selenium 支持 WebDriver

WebDriver 不像 Selenium 那样支持那么多浏览器,因此为了在仍然使用 webdriver API 的同时提供这种支持,您可以利用 SeleneseCommandExecutor。它是这样完成的

Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName("safari");
CommandExecutor executor = new SeleneseCommandExecutor("http:localhost:4444/", "http://www.google.com/", capabilities);
WebDriver driver = new RemoteWebDriver(executor, capabilities);

目前这种方法存在一些主要限制,特别是 findElements 没有按预期工作。此外,由于我们使用 Selenium Core 来处理驱动浏览器的繁重工作,因此您会受到 Javascript 沙箱的限制。

最后修改于 2022 年 1 月 12 日:存档其他维基文章 (e75f49c8af3)