Internet Explorer ドライバの内部
IE ドライバに関するより詳細な情報。
このドキュメントは以前は 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 に配置する必要があります。
スタンドアロンの実行可能ファイルとして、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.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
サブキーは存在する場合と存在しない場合があり、存在しない場合は作成する必要があることに注意してください。重要: このキー内に、値が 0 の iexplore.exe
という名前の DWORD 値を作成します。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.forceCreateProcessApi
に true
値、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 スタンドアロンリモートサーバを使用します。
IEDriverServer.exe
を実行するWindows サービスアプリケーションの一部として IEDriverServer.exe を使用しようとすることは、明示的にサポートされていません。サービスプロセスとそれらによって生成されたプロセスには、通常のユーザコンテキストで実行されるプロセスとは大きく異なる要件があります。IEDriverServer.exe
はその環境では明示的にテストされておらず、サービスプロセスで使用することが禁止されていると文書化されている Windows API 呼び出しが含まれています。サービスプロセス下で実行中に IE ドライバを動作させることが可能であるかもしれませんが、その環境で問題が発生したユーザは、独自の解決策を探す必要があります。
IE ドライバに関するより詳細な情報。
詳細またはスポンサーの完全なリストをご覧ください。