IE ドライバサーバ

Internet Explorer Driver は、WebDriver 仕様を実装するスタンドアロンサーバです。

このドキュメントは以前は wiki 上 にありました

InternetExplorerDriver は、WebDriver のワイヤープロトコルを実装するスタンドアロンサーバです。このドライバは、IE 11 および Windows 10 でテストされています。古いバージョンの IE および Windows でも動作する可能性がありますが、サポートされていません。

ドライバは、32 ビット版と 64 ビット版のブラウザの実行をサポートしています。ブラウザの起動時にどちらの「ビット数」を使用するかを決定する方法の選択は、起動する IEDriverServer.exe のバージョンによって異なります。32 ビット版の IEDriverServer.exe を起動すると、32 ビット版の IE が起動します。同様に、64 ビット版の IEDriverServer.exe を起動すると、64 ビット版の IE が起動します。

インストール

InternetExplorerDriver を使用する前にインストーラを実行する必要はありませんが、いくつかの設定が必要です。スタンドアロンサーバ実行可能ファイルは、ダウンロードページからダウンロードし、PATH に配置する必要があります。

長所

  • 実際のブラウザで実行され、JavaScript をサポートしています

短所

  • 当然ながら、InternetExplorerDriver は Windows でのみ動作します!
  • 比較的遅い(それでもかなり軽快ですが :)

コマンドラインスイッチ

スタンドアロンの実行可能ファイルとして、IE ドライバの動作はさまざまなコマンドライン引数によって変更できます。これらのコマンドライン引数の値を設定するには、使用している言語バインディングのドキュメントを参照する必要があります。サポートされているコマンドラインスイッチは、以下の表で説明されています。すべての -<switch>、–<switch> および /<switch> がサポートされています。

スイッチ意味
–port=<portNumber>IE ドライバの HTTP サーバが言語バインディングからのコマンドをリッスンするポートを指定します。デフォルトは 5555 です。
–host=<hostAdapterIPAddress>IE ドライバの HTTP サーバが言語バインディングからのコマンドをリッスンするホストアダプタの IP アドレスを指定します。デフォルトは 127.0.0.1 です。
–log-level=<logLevel>ログメッセージが出力されるレベルを指定します。有効な値は、FATAL、ERROR、WARN、INFO、DEBUG、および TRACE です。デフォルトは FATAL です。
–log-file=<logFile>ログファイルのフルパスとファイル名を指定します。デフォルトは stdout です。
–extract-path=<path>サーバで使用されるサポートファイルの展開に使用するディレクトリへのフルパスを指定します。指定しない場合のデフォルトは TEMP ディレクトリです。
–silentサーバ起動時の診断出力を抑制します。

重要なシステムプロパティ

次のシステムプロパティ(Java コードで System.getProperty() を使用して読み取り、System.setProperty() を使用して設定するか、「-DpropertyName=value」コマンドラインフラグ)は、InternetExplorerDriver によって使用されます

プロパティ意味
webdriver.ie.driverIE ドライババイナリの場所。
webdriver.ie.driver.hostIE ドライバがリッスンするホストアダプタの IP アドレスを指定します。
webdriver.ie.driver.loglevelログメッセージが出力されるレベルを指定します。有効な値は、FATAL、ERROR、WARN、INFO、DEBUG、および TRACE です。デフォルトは FATAL です。
webdriver.ie.driver.logfileログファイルのフルパスとファイル名を指定します。
webdriver.ie.driver.silentIE ドライバの起動時に診断出力を抑制します。
webdriver.ie.driver.extractpathサーバで使用されるサポートファイルの展開に使用するディレクトリへのフルパスを指定します。指定しない場合のデフォルトは TEMP ディレクトリです。

必須設定

  • IEDriverServer 実行可能ファイルは、ダウンロードしてPATH に配置する必要があります。
  • Windows Vista、Windows 7、または Windows 10 の IE 7 以降では、各ゾーンの保護モード設定を同じ値に設定する必要があります。値はオンまたはオフにすることができますが、すべてのゾーンで同じである必要があります。保護モード設定を設定するには、[ツール] メニューから [インターネットオプション...] を選択し、[セキュリティ] タブをクリックします。各ゾーンには、タブの下部に [保護モードを有効にする] というラベルの付いたチェックボックスがあります。
  • さらに、IE 10 以降では、[拡張保護モード] を無効にする必要があります。このオプションは、[インターネットオプション] ダイアログの [詳細設定] タブにあります。
  • ネイティブマウスイベントが正しい座標に設定されるように、ブラウザのズームレベルを 100% に設定する必要があります。
  • Windows 10 の場合、ディスプレイ設定で [テキスト、アプリ、その他の項目のサイズを変更する] を 100% に設定する必要もあります。
  • IE 11 のみ の場合、ドライバが作成する Internet Explorer のインスタンスへの接続を維持できるように、ターゲットコンピュータでレジストリエントリを設定する必要があります。32 ビット Windows インストールの場合、レジストリエディタで調べる必要があるキーは HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE です。64 ビット Windows インストールの場合、キーは HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE です。FEATURE_BFCACHE サブキーは存在する場合と存在しない場合があり、存在しない場合は作成する必要があることに注意してください。重要: このキー内に、値が 0 の iexplore.exe という名前の DWORD 値を作成します。

ネイティブイベントと Internet Explorer

InternetExplorerDriver は Windows 専用であるため、いわゆる「ネイティブ」または OS レベルのイベントを使用して、ブラウザでマウスとキーボード操作を実行しようとします。これは、同じ操作にシミュレートされた JavaScript イベントを使用することとは対照的です。ネイティブイベントを使用する利点は、JavaScript サンドボックスに依存せず、ブラウザ内での適切な JavaScript イベントの伝播を保証することです。ただし、現在、IE ブラウザウィンドウがフォーカスを持っていない場合や、要素の上にカーソルを合わせようとした場合に、マウスイベントにいくつかの問題があります。

ブラウザのフォーカス

問題は、ウィンドウがフォーカスを持っていない場合、IE 自体が IE ブラウザウィンドウに送信する Windows メッセージ (WM\_MOUSEDOWN および WM\_MOUSEUP) を完全に尊重していないように見えることです。具体的には、クリックされた要素は周囲にフォーカスウィンドウを受け取りますが、クリックは要素によって処理されません。おそらく、メッセージを送信するべきではありません。むしろ、SendInput() API を使用する必要がありますが、その API はウィンドウがフォーカスを持っていることを明示的に要求します。WebDriver プロジェクトには、2 つの相反する目標があります。

まず、可能な限りユーザをエミュレートするように努めています。これは、JavaScript を使用してイベントをシミュレートするのではなく、ネイティブイベントを使用することを意味します。

次に、自動化されているブラウザウィンドウのフォーカスを必要としないようにしたいと考えています。これは、ブラウザウィンドウをフォアグラウンドに強制するだけでは最適ではないことを意味します。

追加の考慮事項は、複数の WebDriver インスタンスの下で複数の IE インスタンスが実行されている可能性です。これは、そのような「ウィンドウをフォアグラウンドに移動する」ソリューションは、IE ドライバの C++ コード内の何らかの同期構造(mutex?)でラップする必要があることを意味します。それでも、たとえば、ユーザがドライバが IE をフォアグラウンドに移動してからネイティブイベントを実行するまでの間に別のウィンドウをフォアグラウンドに移動した場合、このコードは競合状態の影響を受けやすくなります。

ドライバの要件と、これら 2 つの相反する目標に優先順位を付ける方法に関する議論は、現在も進行中です。現在の一般的な考え方は、後者よりも前者を優先し、IE ドライバを使用している間はマシンを他のタスクに使用できなくなることを文書化することです。ただし、その決定は最終決定ではなく、それを実装するコードはかなり複雑になる可能性があります。

要素のホバー

要素の上にカーソルを合わせようとしていて、物理マウスカーソルが IE ブラウザウィンドウの境界内にある場合、ホバーは機能しません。より具体的には、ホバーはほんの一瞬だけ機能するように見え、その後、要素は以前の状態に戻ります。これが発生する理由の一般的な理論は、IE がイベントループ中に何らかのヒットテストを実行しているため、物理カーソルがウィンドウ境界内にある場合に物理マウスの位置に応答することです。WebDriver 開発チームは、この IE の動作に対する回避策を見つけることができませんでした。

<option> 要素のクリックまたはフォームと alert() の送信

IE ドライバがネイティブイベントを使用して要素と対話しない場所が 2 つあります。これは、<select> 要素内の <option> 要素をクリックする場合です。通常の状況では、IE ドライバは、通常は JavaScript getBoundingClientRect() メソッドから返される要素の位置とサイズに基づいてクリックする場所を計算します。ただし、<option> 要素の場合、getBoundingClientRect() は位置とサイズがゼロの長方形を返します。IE ドライバは、この 1 つのシナリオを、基本的に要素の .selected プロパティを設定し、JavaScript で onChange イベントをシミュレートする click() Automation Atom を使用して処理します。ただし、これは、<select> 要素の onChange イベントに alert()confirm()、または prompt() を呼び出す JavaScript コードが含まれている場合、WebElement の click() メソッドを呼び出すと、モーダルダイアログが手動で閉じられるまでハングすることを意味します。WebDriver コードのみを使用してこの動作を回避する既知の回避策はありません。

同様に、WebElement の submit() メソッドを介して HTML フォームを送信する場合、同じ効果があるシナリオがいくつかあります。これは、ドライバがフォームで JavaScript submit() 関数を呼び出し、onSubmit イベントハンドラが JavaScript alert()confirm()、または prompt() 関数を呼び出す場合に発生する可能性があります。

この制限は、issue 3508(Google Code 上)としてファイルされています。

InternetExplorerDriver の複数インスタンス

IEDriverServer.exe の作成により、InternetExplorerDriver の複数の同時インスタンスを作成して使用することが可能になるはずです。ただし、この機能はほとんどテストされておらず、Cookie、ウィンドウフォーカスなどに問題がある可能性があります。IE ドライバの複数のインスタンスを使用しようとしてそのような問題が発生した場合は、RemoteWebDriver と仮想マシンの使用を検討してください。

InternetExplorer の複数のインスタンス間で共有される Cookie (および他のセッション項目) の問題には、2 つの解決策があります。

1 つ目は、InternetExplorer をプライベートモードで起動することです。その後、InternetExplorer はクリーンなセッションデータで起動され、終了時に変更されたセッションデータを保存しません。これを行うには、ドライバに 2 つの特定の機能を渡す必要があります。ie.forceCreateProcessApitrue 値、ie.browserCommandLineSwitches-private 値です。InternetExplorer 8 以降でのみ動作し、Windows レジストリ HKLM_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Main パスに TabProcGrowth キーが 0 値で含まれている必要があることに注意してください。

2 つ目は、InternetExplorer の起動中にセッションをクリアすることです。これを行うには、特定の ie.ensureCleanSession 機能を true 値でドライバに渡す必要があります。これにより、手動で起動したものを含め、実行中のすべての InternetExplorer インスタンスのキャッシュがクリアされます。

IEDriverServer.exe をリモートで実行する

IEDriverServer.exe によって起動された HTTP サーバは、ローカルマシンからの接続のみを受け入れるようにアクセスコントロールリストを設定し、リモートマシンからの着信接続を許可しません。現時点では、IEDriverServer.exe のソースコードを変更せずにこれを変更することはできません。リモートマシンで Internet Explorer ドライバを実行するには、言語バインディングの RemoteWebDriver に相当するものと組み合わせて Java スタンドアロンリモートサーバを使用します。

Windows サービス下で IEDriverServer.exe を実行する

Windows サービスアプリケーションの一部として IEDriverServer.exe を使用しようとすることは、明示的にサポートされていません。サービスプロセスとそれらによって生成されたプロセスには、通常のユーザコンテキストで実行されるプロセスとは大きく異なる要件があります。IEDriverServer.exe はその環境では明示的にテストされておらず、サービスプロセスで使用することが禁止されていると文書化されている Windows API 呼び出しが含まれています。サービスプロセス下で実行中に IE ドライバを動作させることが可能であるかもしれませんが、その環境で問題が発生したユーザは、独自の解決策を探す必要があります。


Internet Explorer ドライバの内部

IE ドライバに関するより詳細な情報。