新しいにおける当社のwebdriverを中に、セレンは、使用可能な最初のネイティブコンポーネントブラウザのバージョンを確認し、一致した場合します。そして、彼らは(ドライバーが実際には、このようなIEDriver、ChromeDriverとしてブラウザベンダー、である、彼らはすべてのwebdriverを実現ターゲットブラウザでのWebサービスのセットを開始 ワイヤプロトコルを。)、このWebサービスは、プロトコルがセレン独自のデザインを定義して使用しています、と呼ばれるwebdriverをワイヤプロトコルで。この合意は、ほぼ、クローズ、オープンを含め、何かをするためにブラウザを操作し最大化、最小化、要素、要素をクリックし、アップロードファイルを配置することができ、非常に強力である、などのように。
webdriverをWireプロトコルは、スタートはプロトコルWebサービスのポートベースのセットで起動しますかFirefoxDriver ChromeDriver、後に言うことですつまり、普遍的です。例えば、FirefoxDriver初期化が成功した後、デフォルトは、httpからになります:// localhostを:7055スタート、ChromeDriverはおそらくですhttpながら:// localhostを:46350などが挙げられます。次は、私たちのAPI呼び出しwebdriverをのいずれかが、我々は、コマンドを送信しComandExecutorの助けを必要とし、実際のポート上のWebサービスリッスンへのHTTPリクエストです。体内での私たちのHTTPリクエストでは、文字列になります私たちは、ブラウザが次の何かをしたいセレンを伝えるためにwebdriverをワイヤプロトコルJSON形式を指定しました。
その他の人気の理解:クライアント側スクリプト(Javaの、のpython、ルビー)は、ブラウザが直接Aの翻訳者としてWebサービスにそれが可能だったと通信することができないので、それはブラウザを識別できることをコードに変換されたクライアントコードを(のような置くことができますセッションを作成するためのJS)、テストスクリプトです。クライアント()、Webサービスへの安らかなHTTPリクエストのリクエストを送信することにより、セッションは、WebServiceがブラウザに渡されたスクリプトを知っているブラウザに翻訳、結果のブラウザの実装はに戻りましたWebサービス、Webサービスの結果は、いくつかのパッケージ(通常はJSON形式)を行うために戻って、次に、クライアントに返さ、ブラウザの操作が成功した戻り値を実行することができないが、に応じて決定されます
クロムドライバの説明については、公式サイトからの抜粋:
ChromeDriverは、3つの別々の部品で構成されています。ブラウザー自体(「クロム」)、セレンプロジェクト(「ドライバ」)と「クロム」と「運転者」との間のブリッジとして機能するクロムプロジェクトから実行ダウンロードによって提供される言語バインディングがあります。この実行ファイルは、「chromedriver」と呼ばれているが、我々は試してみて、混乱を減らすために、このページで「サーバー」としてそれを参照してくださいよ。
おそらく、我々は、ブラウザのように橋のクライアント(言語バインディング)の役割のためのクロムの実行可能ファイル(.exeファイル)をダウンロードしますが、Webサービス(ドライバ)のさらに確認の理解があることを意味しています。
具体例を挙げれば:
webdriverをダイバー=新しいFirefoxDriver();
driver.get( "http://google.com");
driver.get(「http://google.com」)の実装では、このコードは、クライアントがある場合には、当社のテストコードは、Webサービス(リモートサーバ)に次のリクエストを送信します。
POSTセッション/ 285b12e4-2b8a-4fe6-90e1-c35cba245956 / URL
post_data { "URL": "http://google.com"}
ポスト要求はlocalhostとして:ポート/ハブ/セッション/ SESSION_ID / URLアドレス、仕上げにブラウザの要求は、URLをジャンプします。
上記の要求が受け入れられるか、このWebサービスのインタフェースを達成することである場合は、WebサービスのURLは、応答に含まれるポストデータにジャンプして、次のように返します。
{ "名前": "GET"、 "セッションID": "285b12e4-2b8a-4fe6-90e1-c35cba245956"、 "ステータス":0、 "値": ""}
応答は、次の情報が含まれています
名前:メソッドの名前は、特定のURLに、表現のジャンプを取得され、ここで、Webサービスのエンドを実装しました。
セッションID:現在のセッションID。
ステータス:ステータスコード実行要求、ゼロ以外は全てOKではない心配を示し、0が存在し、正しく行われていない場合。
値:要求された値を返し、この値を返すことはnullで、タイトルのクライアントコールインタフェース場合、この値は、現在のページのタイトルでなければなりません。
クライアント要求が特定のページ要素を配置するために送信された場合は、応答の戻り値は次のようになります。
{ "名前": "findElement"、 "セッションID": "285b12e4-2b8a-4fe6-90e1-c35cba245956"、 "ステータス":0、 "値":{ "ELEMENT": "{2192893e-f260-44c4-bdf6- 7aad3c919739} "}}
名、セッションID、上記の例とステータス要求が戻り値素子であることを除いて、同様である:{2192893e-f260-44c4-bdf6-7aad3c919739}、IDがIDによってターゲット要素を表し、クライアントが送信できるようにサーバー側のクリックなどの対話を要求します。
次の図に示す様々なwebdriverをの動作原理
私たちは、webdriverをサブクラス異なるブラウザ、上記の図から、このような名前のwebdriver.xpiにFirefoxのアドオンの意志の必要性を実行しているなど、特定のネイティブブラウザのコンポーネントに依存する必要性を見ることができます。IEはその後、あなたは、Webサービスのネイティブブラウザを起動するには変換コマンドにdllファイルを使用する必要があります。また、図には、webdriverをワイヤプロトコルは、RESTfulなWebベースサービスのセットであることを示し
など好きなwebdriverをWireプロトコルの詳細については、あなたが公式のセレン読むことができ、このWebサービスは、物事を何ができるか知っているプロトコルのドキュメント、我々は見つけることができるセレンで、ソースコードをHttpCommandExecutor地図<文字列、するCommandInfoを維持し、このクラス、アイデアはURI 1つの状態として扱われるすべての残りの操作は、各状態の対応を置くことであるので>、単純なコマンド文字列のキーを代表する責任があり、対応するURLに変換されます。我々は、特定のURLでのRESTful WebサービスへのHTTPリクエストを送信するときに、実行する操作を解析することができるようになります。次のようにソースコードの傍受は、次のとおり
.put(NEW_SESSION、ポスト(" /セッション" )) .put(削除(、QUIT " :セッションID /セッション/ " )) .put(GET_CURRENT_WINDOW_HANDLE、取得(" /セッション/:セッションID / window_handle " )) .put(GET_WINDOW_HANDLES、取得(" /セッション/:セッションID / window_handles " )) .put(GET、POST(" /セッション/:セッションID / URL " )) // [アラートAPIはありまだ実験とすべきではない使用すること。 .put(GET_ALERTは、(取得" :セッションID /警告/セッション/ " )) .put(DISMISS_ALERT、ポスト(" /セッション/:セッションID / dismiss_alert " )) .put(ACCEPT_ALERT、ポスト(" /セッション/:セッションID / accept_alert " )) .put(GET_ALERT_TEXT、取得(" /セッション/:セッションID / alert_text " )) .put(SET_ALERT_VALUE、ポスト(" /セッション/:セッションID / alert_text "))
あなたは、実際のURLを相対パスで送信され見ることができ、主に接尾辞/セッション/:セッションIDは、webdriverを各ブラウザは、別のセッションIDが開始割り当てられていることを、この手段も始まるマルチスレッド何があるだろう時に互いに平行しません紛争と干渉。このURLのセッションID /要素、そしてそのようなIDやCSSやXPathの、各よるような発行されたHTTPリクエストの体内の特定のパラメータを添付:たとえば、最も一般的に我々APIのwebdriverを、ここgetWebElementは/に/セッション変換されますどのような値、はい。我々が受信して実行すると、この操作は、HTTPレスポンスを返します。コンテンツはJSONでは、そのようなので、上のテキスト、CSSセレクタ、タグ名、クラス名、およびなどWebElementが見られる様々な詳細は、返されます。以下は、私たちはHTTPレスポンスコードスニペットについて話している解決されます。
してみてください{ 応答 =新しいJsonToBeanConverter()変換(レスポンス。。クラス、responseAsText)。 }キャッチ(れるClassCastException E){ もし(responseAsText!= nullの&& "" .equals(responseAsText)){ // リモートサーバが死亡しましたが、すでにいくつかのヘッダーを設定しています。 // Firefoxのドライバの最後のウィンドウとき通常これが発生します //がされて、OS X.戻りヌルで閉じ戻り値がさ_should_ //無視されています。これがある ではないエレガントなソリューション。 リターンNULL; } (新しいWebDriverExceptionを投げる" 応答にテキストを変換できません:" + responseAsText、E); } // ...