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)をサポートしていません。
注記
特定のドライバでWebDriverBackedSelenium
インスタンスを作成した後、start()
を呼び出す必要はありません。ドライバの作成によってセッションがすでに開始されているためです。テストの最後に、ドライバのquit()
メソッドの代わりにstop()
を呼び出す必要があります。
これはWebDriverの動作とより類似しています。ドライバインスタンスの作成がセッションを開始しますが、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オブジェクトへの参照を保持していれば、2つのAPIを交互に使用することもできます。魔法は、Seleniumインスタンスに渡される「*webdriver
」ブラウザ名と、start()
を呼び出すときにWebDriverインスタンスを渡すことです。
DefaultSeleniumにstart(driver)
がない言語では、WebDriverオブジェクトとSeleniumオブジェクトを自分で接続できます。WebDriverセッションIDを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サンドボックスによって制限されます。