Internet Explorer ドライバーの内部構造

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

クライアントコードからドライバへ

W3C WebDriver プロトコルを使用して、ローカルの HTTP サーバーインスタンスと通信します。これにより、言語固有のコードの実装が大幅に簡素化され、JNActypespinvokeDL などのネイティブコードインターオペテクノロジーを使用して呼び出す必要のある C++ DLL へのエントリポイントの数を最小限に抑えます。

メモリ管理

IE ドライバーは、COM オブジェクトへのスマートポインタの実装を利用するために、Active Template Library (ATL) を利用しています。これにより、COM オブジェクトの参照カウントとクリーンアップがはるかに簡単になります。

保護モードの設定変更が必要な理由

Windows Vista の IE 7 では、ブラウジング時に基盤となる Windows OS をある程度保護する保護モードの概念が導入されました。問題は、COM 経由で IE のインスタンスを操作し、保護モードへの移行または保護モードからの移行を引き起こすページに移動すると、IE は別のブラウザセッションを作成する必要があることです。これにより、以前のセッションの COM オブジェクトが孤立し、制御できなくなります。

IE 7 では、これは通常、新しいトップレベルのブラウザウィンドウとして現れます。IE 8 では、新しい IExplore.exe プロセスが作成されますが、通常 (常にではありません!) 既存の IE トップレベルフレームウィンドウにシームレスにアタッチされます。IE を外部から (WebBrowser コントロールを使用するのではなく) 駆動するブラウザ自動化フレームワークは、これらの問題に遭遇します。

この問題を回避するために、IE を操作するには、すべてのゾーンで同じ保護モード設定にする必要があります。すべてのゾーンでオンであるか、すべてのゾーンでオフである限り、ブラウザオブジェクトを無効にする可能性のある異なる保護モードゾーンへの移行を防ぐことができます。また、ユーザーは UAC をオンにしたまま実行し、すべてのゾーンで保護モードを「オン」に設定すると、ブラウザで安全に実行し続けることができます。

以前のリリースの IE ドライバーでは、ユーザーの保護モード設定が正しく設定されていない場合、IE が起動し、HTTP リクエストがタイムアウトするまでプロセスがハングしていました。これは、何を設定する必要があるかを示すものが何もなかったため、最適ではありませんでした。安全側に倒して、ユーザーの保護モード設定は変更しません。ただし、現在のバージョンでは、保護モード設定が適切に設定されていることを確認し、設定されていない場合はエラー応答を返します。

キーボードとマウスの入力

主要ファイル: interactions.cpp

キーボードとマウスの入力をシミュレートする方法は 2 つあります。1 つ目の方法は、webdriver の一部で使用されている方法で、DOM 上のイベントを合成することです。これにはいくつかの欠点があります。各ブラウザ (およびブラウザのバージョン) には独自の癖があるため、これらのそれぞれをモデル化することは大変な作業であり、完全に正しく行うことは不可能です (たとえば、window.selection がどうあるべきかを判断するのは難しく、これは一部のブラウザでは読み取り専用プロパティです)。代替アプローチは、OS レベルでキーボードとマウスの入力を合成することです。理想的には、ユーザーからフォーカスを奪うことなく (長時間実行される webdriver テストが実行されている間、ユーザーは自分のコンピュータで他のことを行う傾向があるため)。

これを行うためのコードは interactions.cpp にあります。ここで注目すべき重要な点は、PostMessage を使用して、IE インスタンスのメッセージキューにウィンドウイベントをプッシュすることです。特に入力は興味深いものです。「keydown」メッセージと「keyup」メッセージのみを送信します。「keypress」イベントは、必要に応じて IE の内部イベント処理によって作成されます。キープレスイベントが常に生成されるとは限らないため (たとえば、すべての文字が印刷可能であるとは限らず、デフォルトのイベントバブリングがキャンセルされた場合、リスナーはキープレスイベントを認識しません)、キーダウンの後に「プローブ」イベントを送信します。これが処理されたことを確認したら、キープレスイベントが処理されるイベントのスタックにあること、およびキーアップイベントを送信しても安全であることがわかります。これが行われなかった場合、イベントが間違った順序で発生する可能性があり、これは間違いなく最適ではありません。

InternetExplorerDriver の作業

現在、InternetExplorerDriver 用にすべての言語 (Java、C#、Python、および Ruby) で実行されるテストがあるため、クライアント側からどの言語で作業するのが快適であっても、ネイティブコードへの変更をテストできるはずです。C++ コードの作業には、Visual Studio 2010 Professional 以降が必要です。残念ながら、ドライバーの C++ コードは COM オブジェクトの操作の苦痛を軽減するために ATL を使用しており、ATL は Visual C++ 2010 Express Edition には付属していません。Eclipse を使用している場合、修正とテストのプロセスは次のとおりです。

  1. VS で C++ コードを編集します。
  2. コードをビルドして、コンパイルされることを確認します。
  3. テストを実行する準備ができたら、完全なリビルドを実行します。これにより、作成された DLL が適切な場所にコピーされ、Eclipse で使用できるようになります。
  4. Eclipse (または Idea などの他の IDE) をロードします。
  5. SingleTestSuiteusingDriver(IE) になるように編集します。
  6. 「webdriver-internet-explorer」プロジェクトを使用する JUnit 実行構成を作成します。これを行わないと、テストはまったく機能せず、コンソールにやや不可解なエラーメッセージが表示されます。

基本的なセットアップが完了したら、コードの作業をすぐに開始できます。Visual Studio を使用してコードを実行するプロセスにアタッチできます (デバッグメニューから [プロセスにアタッチ...] を選択します)。

最終更新日: 2022年1月10日: More wiki (#907) [deploy site] (adcf706a1ad)