Internet Explorer Driver Internals
More detailed information on the IE Driver.
This documentation previously located on the wiki
InternetExplorerDriver
は、WebDriverのワイヤプロトコルを実装するスタンドアロンサーバーです。
このドライバーは、IE11およびWindows10でテストされています。
古いバージョンのIEおよびWindowsで動作する可能性がありますが、これはサポートされていません。
ドライバーは、32ビットおよび64ビットバージョンのブラウザーの実行をサポートします。
ブラウザの起動に使用する"ビット数"を決定する方法の選択は、起動するIEDriverServer.exeのバージョンによって異なります。
32ビットバージョンの IEDriverServer.exe
を起動すると、32ビットバージョンのIEが起動します。
同様に、64ビットバージョンのIEDriverServer.exeを起動すると、64ビットバージョンのIEが起動します。
InternetExplorerDriverを使用する前にインストーラーを実行する必要はありませんが、いくつかの設定が必要になります。 スタンドアロンサーバーの実行可能ファイルは、ダウンロード ページからダウンロードして、 PATHに配置する必要があります。
スタンドアロンの実行可能ファイルとして、IEドライバーの動作はさまざまなコマンドライン引数を使用して変更できます。
これらのコマンドライン引数の値を設定するには、使用している言語バインディングのドキュメントを参照する必要があります。
サポートされているコマンドラインスイッチについて、以下の表で説明します。
すべての-<switch>
、–<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.driver |
IEドライバーバイナリの場所 |
webdriver.ie.driver.host |
IEドライバーがリッスンするホストアダプターのIPアドレスを指定します。 |
webdriver.ie.driver.loglevel |
ロギングメッセージを出力するレベルを指定します。 有効な値は、FATAL、ERROR、WARN、INFO、DEBUG、およびTRACEです。 デフォルトはFATALです。 |
webdriver.ie.driver.logfile |
ログファイルのフルパスとファイル名を指定します。 |
webdriver.ie.driver.silent |
IEドライバーの起動時に診断出力を抑制します。 |
webdriver.ie.driver.extractpath |
サーバーが使用するサポートファイルの抽出に使用されるディレクトリへのフルパスを指定します。 指定しない場合、デフォルトでTEMPディレクトリになります。 |
IEDriverServer
実行可能ファイルをダウンロードして、PATHに配置する必要があります。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
サブキーは存在する場合と存在しない場合があり、存在しない場合は作成する必要があることに注意してください。iexplore.exe
という名前のDWORD値を作成します。InternetExplorerDriver
はWindows専用であるため、いわゆる"ネイティブ"またはOSレベルのイベントを使用して、ブラウザーでマウスとキーボードの操作を実行しようとします。
これは、同じ操作でシミュレートされたJavaScriptイベントを使用するのとは対照的です。
ネイティブイベントを使用する利点は、JavaScriptサンドボックスに依存せず、ブラウザー内での適切なJavaScriptイベントの伝播を保証することです。
ただし、現在、IEブラウザウィンドウにフォーカスがない場合や、要素にカーソルを合わせようとした場合のマウスイベントにはいくつかの問題があります。
課題は、ウィンドウにフォーカスがない場合、IE自体がIEブラウザウィンドウ( WM\_MOUSEDOWN
および WM\_MOUSEUP
)に送信するWindowsメッセージを完全に尊重していないように見えることです。
具体的には、クリックされている要素はその周りにフォーカスウィンドウを受け取りますが、クリックは要素によって処理されません。
間違いなく、メッセージを送信するべきではありません。
むしろ、 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ドライバーは、 click()
Automation Atomを使用してこの1つのシナリオを処理します。
これは、基本的に要素の .selected
プロパティを設定し、JavaScriptでonChangeイベントをシミュレートします。
ただし、これは、 <select>
要素のonChangeイベントに alert()
、 confirm()
、または prompt()
を呼び出すJavaScriptコードが含まれている場合、モーダルダイアログが手動で閉じられるまでWebElementの click()
メソッドの呼び出しがハングすることを意味します。 WebDriverコードのみを使用したこの動作の既知の回避策はありません。
同様に、WebElementの submit()
メソッドを介してHTMLフォームを送信すると、同じ効果が得られるシナリオがいくつかあります。
これは、ドライバーがフォームでJavaScriptの submit()
関数を呼び出し、
JavaScriptの alert()
、 confirm()
、または prompt()
関数を呼び出す onSubmit イベントハンドラーがある場合に発生する可能性があります。
この制限は、issue 3508(Google Code)として登録されています。
InternetExplorerDriver
の複数のインスタンスIEDriverServer.exe
を作成すると、 InternetExplorerDriver
の複数のインスタンスを同時に作成して使用できるようになります。
ただし、この機能はほとんどテストされておらず、Cookieやウィンドウフォーカスなどに問題がある可能性があります。
IEドライバーの複数のインスタンスを使用しようとして、そのような問題が発生した場合は、RemoteWebDriver
と仮想マシンの使用を検討してください。
InternetExplorerの複数のインスタンス間で共有されるCookie(および別のセッションアイテム)の問題には、2つの解決策があります。
1つ目は、InternetExplorerをプライベートモードで起動することです。
その後、InternetExplorerはクリーンなセッションデータで開始され、終了時に変更されたセッションデータを保存しません。
これを行うには、2つの特定の機能をドライバーに渡す必要があります。
つまり、 true
値を持つ ie.forceCreateProcessApi
と -private
値を持つ ie.browserCommandLineSwitches
です。
InternetExplorer 8以降でのみ機能することに注意してください。
また、Windowsレジストリ HKLM_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Main
パスには、値が 0
のキーTabProcGrowth
が含まれている必要があります。
2つ目は、InternetExplorerの起動中にセッションをクリーンアップすることです。
このためには、 true
の値を持つ特定の ie.ensureCleanSession
capabilityをドライバーに渡す必要があります。
これにより、手動で開始されたものを含め、InternetExplorerの実行中のすべてのインスタンスのキャッシュがクリアされます。
IEDriverServer.exe
をリモートで実行するIEDriverServer.exe
によって起動されたHTTPサーバーは、ローカルマシンからの接続のみを受け入れるようにアクセス制御リストを設定し、リモートマシンからの着信接続を禁止します。
現在、これはソースコードを IEDriverServer.exe
に変更せずに変更することはできません。
リモートマシンでInternetExplorerドライバーを実行するには、Javaスタンドアロンリモートサーバーを、言語バインディングに相当するRemoteWebDriverと組み合わせて使用します。
IEDriverServer.exe
を実行するIEDriverServer.exeをWindowsサービスアプリケーションの一部として使用しようとすることは、明示的にサポートされていません。
サービスプロセス、およびそれらによって生成されるプロセスには、通常のユーザーコンテキストで実行されるプロセスとは大きく異なる要件があります。
IEDriverServer.exe
は、その環境では明示的にテストされておらず、サービスプロセスでの使用が禁止されていることが文書化されているWindowsAPI呼び出しが含まれています。
サービスプロセスの下で実行しているときにIEドライバーを動作させることは可能かもしれませんが、その環境で問題が発生したユーザーは、独自の解決策を探す必要があります。
More detailed information on the IE Driver.
Want to support the Selenium project? Learn more or view the full list of sponsors.