一般に、ブラウザーを使用して Web ページを自動化しようとする場合、ユーザー イベントをシミュレートするには 2 つのオプションがあります。JavaScript を介してそれらをシミュレートするか、OS レベルのメカニズム (いわゆる「ネイティブ イベント」) を使用してマウスとキーボードのイベントをシミュレートすることができます。どちらのアプローチにも落とし穴があります。
JavaScript のみを使用してシミュレートされたイベントは、おそらく、自動化されているウィンドウが、システム フォーカスなしでバックグラウンドにとどまり、必要なタスクを実行することを可能にします。Selenium RC はこの方法を使用し、Selenium WebDriver は Firefox と IE でシミュレートされたイベントを使用する機能を提供します。ただし、このアプローチにはいくつかの欠点があります。シミュレートされたイベントは、必要な忠実度と精度に欠ける場合があります。たとえば、CSS:hover
疑似セレクターを介して機能するページの「ドロップダウン メニュー」は、JavaScript を介してトリガーすることはできないため、このような場合、このアプローチは失敗する運命にあります。また、JavaScript を使用しているため、JavaScript サンドボックスに制限されます。つまり、クロスドメイン フレームなどは厳密に範囲外になる可能性があります。
一方、ネイティブ イベントは、ユーザーの実際のマウスおよびキーボード操作をより厳密に表しています。一般に、Web ページ上で正しいイベントを正しい順序で発生させることができます。どの要素でどのイベントを発生させるかを推測する必要はありません。それらを使用することの欠点は、それらを正しく実装するには、自動化されているウィンドウがイベントを正しく受け取るためにシステム フォーカスを持っている必要があることです。SendMessage
Windows を使用している場合は、APIを使用してハッキングを試みることができますが、エラーが発生しやすく、動作が保証されていないため、これは間違った方法です。ネイティブ イベントを使用する正しい方法は、SendInput
API ですが、その API は入力をシステム フォーカスのあるウィンドウに送信します。WebDriver はデフォルトでネイティブ イベントを使用してユーザー入力をシミュレートしますが、デフォルトでは欠陥のあるSendMessage
アプローチになります。IE の場合、少なくとも、より正しいSendInput
アプローチを使用するオプションが提供されます。
フォアグラウンドでブラウザー ウィンドウを必要としないことに固執している場合は、ヘッドレス オプションを検討する必要があります。PhantomJSは優れたオプションであり、WebDriver にもそのためのドライバーがあるため、自動化コードを C# で記述できます。それ以外の場合は、上記で概説した他のアプローチのいずれかに制限されます。