使用 WebDriver 支持 Selenium
(之前位于: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 沙箱的限制。