WebDriver-自動化テスト利器分析
15226 ワード
SeleniumのWebDriverに初めて触れたのは、Webプロジェクトでした.このプロジェクトは、機能テストに使用されます.Firefoxのページの内容が自動的に埋め込まれ、自動的にジャンプしているのを見たとき、本当に不思議な感じがしました.この時間の勉強を通して、私が学んだWebDriverに関する知識をまとめることができると思います.
Seleniumはブラウザ自動化操作フレームワークです.Seleniumは主に3つのツールで構成されています.最初のツールSeleniumIDEは、Firefoxの拡張プラグインであり、ユーザーの録画と訪問テストをサポートします.録音/訪問モードには限界があり、多くのユーザーには適していないため、2番目のツールであるSelenium WebDriverは、より多くの制御権をサポートし、標準的なソフトウェア開発の実践に合致するアプリケーションを作成するために、さまざまな言語環境のAPIを提供しています.最後のツールであるSeleniumGridは、エンジニアがSelenium APIを使用して、一連のマシンに分散されたブラウザインスタンスを制御し、より多くのテストを同時に実行することをサポートします.プロジェクト内では、IDE、WebDriver、Gridと呼ばれています.
ここでは主に2つ目のツール:WebDriverを紹介します.
公式サイトでは、WebDriver is a clean、fast framework for automated testing of webappsと紹介されています.しかし、自動化テストに限らず、他の用途にも使えると思います.
WebDriverは各ブラウザに対して開発され,被測定Webアプリケーションに埋め込まれたJavaScriptに取って代わった.ブラウザとの緊密な統合は、JavaScriptセキュリティモデルによる制限を回避するために、より高度なテストの作成をサポートします.WebDriverは、ブラウザ・ベンダーのサポートに加えて、オペレーティング・システム・レベルの呼び出しを使用してユーザー入力をシミュレートします.WebDriverは、Firefox(FirefoxDriver)、IE(InternetExplorerDriver)、Opera(OperaDriver)、Chrome(ChromeDriver)をサポートします.Android(Android Driver)とiPhone(iPhone)のモバイルアプリケーションテストもサポートしています.また、HtmlUnitベースのインタフェースレス実装も含まれており、HtmlUnitDriverと呼ばれる.WebDriver APIはPython、Ruby、Java、C#からアクセスでき、開発者がお気に入りのプログラミング言語を使用してテストを作成することをサポートします.
まず、WebDriverのJARパッケージをプロジェクトのCLASSSPATHに追加する必要があります.Downloadはhttp://code.google.com/p/selenium/downloads/listを通過することができます.
mavenを使用してプロジェクトを構築する場合はpom.xmlファイルに次の依存項目を追加すればいいです.
そして、それを使うことができます.WebDriverのAPIは「Best Fit」の原則に従い、良好なユーザー体験性と柔軟性を維持する間に最適なバランスを見つけます.
次の例はHtmlUnitDriverを使用します.HtmlUnitDriverはメモリでこのコードを実行するだけで、実際のページはポップアップされません.
Firefoxブラウザを使用したい場合.WebDriver driver=new FirefoxDriver()を使用するだけです.あなたのFirefoxがデフォルトの場所にインストールされていることを前提とします.
オペレーティングシステム
Firefoxのデフォルトのインストール場所
Linux
firefox (found using “which”)
Mac
/Applications/Firefox.app/Contents/MacOS/firefox
Windows
%PROGRAMFILES%\Mozilla Firefox\firefox.exe
FireFoxが指定された場所にインストールされていない場合は、「webdriver.firefox.bin」を設定できます.
環境変数の値を指定します.Javaでは、次のコードを使用できます.
Chromeブラウザを使うなら比較的面倒です.まずChromeDriver(ダウンロード先:http://code.google.com/p/chromedriver/downloads/list).このプログラムはChromeチームが提供しており、WebDriverとChromeブラウザをリンクする橋と見なすことができます.ChromeDriverを起動すると、Urlとリスニングポートが得られます.WebDriver=newRemoteWebDriver(url,DesiredCapabilities.chrome()を使用してChromeWebDriverを作成して操作します.もちろん、サブスレッドでChromeDriverを起動し、WebDriverに設定することができます.
WebDriverはW 3 Cの標準であり、Seleniumが主宰している.
特定のプロトコル基準は、http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Referenceから参照することができる.
このプロトコルから,WebDriverがブラウザとのインタラクションを実現できるのは,ブラウザがこれらのプロトコルを実現したからであることが分かる.このプロトコルはJOSNを用いてHTTPを介して伝送される.
その実装には、クラシックなClient-Serverモードが使用されています.クライアントはrequsetを送信し、サーバ側はresponseを返します.
私たちはいくつかの概念を明確にした.
Client
WebDriverAPIのマシンを呼び出します.
Server
ブラウザを実行するマシン.FirefoxブラウザはWebDriverの通信プロトコルを直接実現し、ChromeとIEはChromeDriverとInternetExplorerDriverを通じて実現した.
Session
サーバ側はブラウザのセッションを維持する必要があり,クライアントからのリクエストヘッダにはセッション情報が含まれており,サーバ側は対応するブラウザページを実行する.
WebElement
これはWebDriverAPIのオブジェクトで、ページ上のDOM要素を表します.
実際の例を挙げると、次のコードの役割は「コマンド」firefoxがgoogleホームページにジャンプすることです.
postによるlocalhostのリクエスト:port/hub/session/session_id/urlアドレスは、ブラウザにurlのジャンプ操作を完了するように要求します.
上記のリクエストが受け入れられる場合、またはremote serverがこのインタフェースを実装している場合、remote serverはpost dataに含まれるurlにジャンプし、次のresponseを返します.
このresponseには、次の情報が含まれています. name:remote server側の実装方法の名前.ここでgetは、指定urlにジャンプすることを示す. sessionId:現在のsessionのid; status:実行を要求するステータスコードは、0以外は正しく実行されていないことを示し、ここでは0であり、すべてokが心配してはいけないことを示している. value:要求された戻り値.ここで戻り値は空であり、clientがtitleインタフェースを呼び出すと、その値は現在のページのtitleであるべきである. クライアントが送信要求が特定のページ要素を特定する場合、responseの戻り値は、 である可能性がある.
これは今日ここまでです.後で新しいものがあってから補充します.
SeleniumとWebDriverとは?
Seleniumはブラウザ自動化操作フレームワークです.Seleniumは主に3つのツールで構成されています.最初のツールSeleniumIDEは、Firefoxの拡張プラグインであり、ユーザーの録画と訪問テストをサポートします.録音/訪問モードには限界があり、多くのユーザーには適していないため、2番目のツールであるSelenium WebDriverは、より多くの制御権をサポートし、標準的なソフトウェア開発の実践に合致するアプリケーションを作成するために、さまざまな言語環境のAPIを提供しています.最後のツールであるSeleniumGridは、エンジニアがSelenium APIを使用して、一連のマシンに分散されたブラウザインスタンスを制御し、より多くのテストを同時に実行することをサポートします.プロジェクト内では、IDE、WebDriver、Gridと呼ばれています.
ここでは主に2つ目のツール:WebDriverを紹介します.
公式サイトでは、WebDriver is a clean、fast framework for automated testing of webappsと紹介されています.しかし、自動化テストに限らず、他の用途にも使えると思います.
WebDriverは各ブラウザに対して開発され,被測定Webアプリケーションに埋め込まれたJavaScriptに取って代わった.ブラウザとの緊密な統合は、JavaScriptセキュリティモデルによる制限を回避するために、より高度なテストの作成をサポートします.WebDriverは、ブラウザ・ベンダーのサポートに加えて、オペレーティング・システム・レベルの呼び出しを使用してユーザー入力をシミュレートします.WebDriverは、Firefox(FirefoxDriver)、IE(InternetExplorerDriver)、Opera(OperaDriver)、Chrome(ChromeDriver)をサポートします.Android(Android Driver)とiPhone(iPhone)のモバイルアプリケーションテストもサポートしています.また、HtmlUnitベースのインタフェースレス実装も含まれており、HtmlUnitDriverと呼ばれる.WebDriver APIはPython、Ruby、Java、C#からアクセスでき、開発者がお気に入りのプログラミング言語を使用してテストを作成することをサポートします.
使用方法
まず、WebDriverのJARパッケージをプロジェクトのCLASSSPATHに追加する必要があります.Downloadはhttp://code.google.com/p/selenium/downloads/listを通過することができます.
mavenを使用してプロジェクトを構築する場合はpom.xmlファイルに次の依存項目を追加すればいいです.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.25.0</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>2.25.0</version> </dependency>
そして、それを使うことができます.WebDriverのAPIは「Best Fit」の原則に従い、良好なユーザー体験性と柔軟性を維持する間に最適なバランスを見つけます.
次の例はHtmlUnitDriverを使用します.HtmlUnitDriverはメモリでこのコードを実行するだけで、実際のページはポップアップされません.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
packageorg.openqa.selenium.example; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.htmlunit.HtmlUnitDriver; public class Example { public static void main(String[] args) { // Create a new instance of the html unit driver // Notice that the remainder of the code relies onthe interface, // not the implementation. WebDriver driver = new HtmlUnitDriver(); // And now use this to visit Google driver.get("http://www.google.com"); // Find the text input element by its name WebElement element = driver.findElement(By.name("q")); // Enter something to search for element.sendKeys("Cheese!"); // Now submit the form. WebDriver will find theform for us from the element element.submit(); // Check the title of the page System.out.println("Page title is: " +driver.getTitle()); } }
Firefoxブラウザを使用したい場合.WebDriver driver=new FirefoxDriver()を使用するだけです.あなたのFirefoxがデフォルトの場所にインストールされていることを前提とします.
オペレーティングシステム
Firefoxのデフォルトのインストール場所
Linux
firefox (found using “which”)
Mac
/Applications/Firefox.app/Contents/MacOS/firefox
Windows
%PROGRAMFILES%\Mozilla Firefox\firefox.exe
FireFoxが指定された場所にインストールされていない場合は、「webdriver.firefox.bin」を設定できます.
環境変数の値を指定します.Javaでは、次のコードを使用できます.
1
System.setProperty("webdriver.firefox.bin","thelocation of Firefox");
Chromeブラウザを使うなら比較的面倒です.まずChromeDriver(ダウンロード先:http://code.google.com/p/chromedriver/downloads/list).このプログラムはChromeチームが提供しており、WebDriverとChromeブラウザをリンクする橋と見なすことができます.ChromeDriverを起動すると、Urlとリスニングポートが得られます.WebDriver=newRemoteWebDriver(url,DesiredCapabilities.chrome()を使用してChromeWebDriverを作成して操作します.もちろん、サブスレッドでChromeDriverを起動し、WebDriverに設定することができます.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
File file = new File(your chromedriverfile path); ChromeDriverService service = newChromeDriverService.Builder().usingChromeDriverExecutable(file).usingAnyFreePort().build(); service.start(); WebDriver webDriver = new ChromeDriver(service); …… …… …… service.stop();
WebDriverの働き方
WebDriverはW 3 Cの標準であり、Seleniumが主宰している.
特定のプロトコル基準は、http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Referenceから参照することができる.
このプロトコルから,WebDriverがブラウザとのインタラクションを実現できるのは,ブラウザがこれらのプロトコルを実現したからであることが分かる.このプロトコルはJOSNを用いてHTTPを介して伝送される.
その実装には、クラシックなClient-Serverモードが使用されています.クライアントはrequsetを送信し、サーバ側はresponseを返します.
私たちはいくつかの概念を明確にした.
Client
WebDriverAPIのマシンを呼び出します.
Server
ブラウザを実行するマシン.FirefoxブラウザはWebDriverの通信プロトコルを直接実現し、ChromeとIEはChromeDriverとInternetExplorerDriverを通じて実現した.
Session
サーバ側はブラウザのセッションを維持する必要があり,クライアントからのリクエストヘッダにはセッション情報が含まれており,サーバ側は対応するブラウザページを実行する.
WebElement
これはWebDriverAPIのオブジェクトで、ページ上のDOM要素を表します.
実際の例を挙げると、次のコードの役割は「コマンド」firefoxがgoogleホームページにジャンプすることです.
1
2
3
4
WebDriver driver = new FirefoxDriver(); // Driver driver.get("http://www.google.com");
driver.get("http://www.google.com")
というコードを実行すると、client、すなわち、私たちのテストコードはremote server
に次のような要求を送信します.POSTsession/285b12e4-2b8a-4fe6-90e1-c35cba245956/url post_data{"url":"http://google.com"}
postによるlocalhostのリクエスト:port/hub/session/session_id/urlアドレスは、ブラウザにurlのジャンプ操作を完了するように要求します.
上記のリクエストが受け入れられる場合、またはremote serverがこのインタフェースを実装している場合、remote serverはpost dataに含まれるurlにジャンプし、次のresponseを返します.
{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}
このresponseには、次の情報が含まれています.
{"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}
name,sessionId,status
は、上記の例とあまり差がなく、この要求の戻り値がELEMENT:{2192893 e−f 260−44 c 4−bdf 6−7 aad 3 c 919739}であることを区別し、要素に位置決めされたidを表し、このidによりclickのような要求をサーバ側と対話させることができる.これは今日ここまでです.後で新しいものがあってから補充します.