以 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 用法(即,使用 Selenium Core 中的 “browserbot” 或其他內建 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。神奇之處在於傳遞給 Selenium 實例的 “*webdriver” 瀏覽器名稱,以及在呼叫 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 日:封存其他 wiki 文章 (e75f49c8af3)