以 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 用法(即,使用 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 沙箱的限制。