2015年6月6日土曜日

C#でIEを自動制御しよう (6) ページの読み込み完了まで待機する

■ページの読み込み完了まで待機する

さて、続いて、IEに表示されたページ内のボタンやテキストボックスなどの各要素を操作、と進みたいところなのですが、ここで一旦寄り道をします。ページ内の各要素を操作するにあたっては、ページ内の各要素が表示され終わっている(読み込みが完了している)必要があります。

 「ちょっと何を言っているか分からない。」という方向けに、説明を補足すると…。InternetExplorerオブジェクトのNavigateメソッドを実行すると、非同期にページの読み込みが実行されます。このため、ページの読み込みが始まるとともに、プログラムは、Navigateメソッドの次のステップに進みます。次のステップでページ内の各要素を操作する場合、ページの読み込みが完了していない状態では、ページの各要素は必ずしも存在しないため、存在しない要素を操作しようとして例外が発生する可能性があります。(というより、昨今のPCは処理が速いので、高確率でこの例外が発生します。)
 
 というわけで、ページの読み込みが完了するまで待つようなメソッドが必要になります。読み込みの完了を検出する方法は色々あるのですが、自分は下記のような拡張メソッドを定義して使っています。BusyプロパティとReadyStateプロパティの状態を確認する、という最も手軽な方法を使っています。

サンプルコード


補足説明

引数は省略可能です。引数に数値を指定すると、指定した数値分(ミリ秒)、一旦停止します。うまく完了まで待機できないときの応急処置に使うと良いのではないでしょうか。(例えば、引数に5000を指定すると、5秒待機するので、たいていのページはその間に読み込みが完了します。その場しのぎの対応で良い場合は、これで十分かなと思います。)

 余談になりますが、上記Waitメソッドでは上手く完了待ちができない場合(動的にjavascriptなどでページが書き換えられているような場合)、目的とするページの状態に含まれる要素を調査し、当該要素が出現するまでループさせるのが、確実かつお手軽です。