UWSCスクリプトのCLKITEMやIESETDATAでボタンやリンクをクリックした後のBUSYWAIT処理は重要。
UWSCスクリプトでウェブサイトの自動化をする際に、「サイトを開く」「CLKITEMでリンクをクリックする」「IESETDATAでボタンをクリックする」等の画面遷移が想定される場合、「BUSYWAIT処理」を入れるのが普通です。
要はサイトの読み込みが終了するまで次の処理を待つというものです。
UWSCのスクリプトを扱うサイトなどでも、基本的な処理として紹介されていることが多いです。
しかし、実用性を考えた場合、一般的なBUSYWAIT処理では不十分であることが多いです。
例えば、以下のようなケースで、問題が発生することがあります。
新しいバージョンのIEでうまくウェイトできない。
IE11にて画面更新後にCOM操作ができない(エラーが発生する)。
ポイントサイト等から開く広告ページにポップアップが入る。
「COM操作ができなくなる」問題などは、よく検索されているようですし、UWSCを使う人は、皆さん躓くところなんでしょうね。
IE11向けに最適化したUWSCスクリプトのBUSYWAIT処理。「ページからのメッセージ」などのポップアップも対策済。
上記に対応するために、私はBUSYWAITを以下のように設定しています。
DEF_DLLを入れている点と、メッセージが出てもClkItemで「OK」ボタン等で閉じている点がポイントです。ポイントサイトとかの場合、結構出ますからね。
下記をダブルクリックしたあと、コピーしてそのまま利用していただけます。(*^-^*)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | DEF_DLLSendMessageA(Hwnd,Long,Long,Dword):bool:user32 CONSTWM_ACTIVATE=$06 PROCEDUREBUSYWAIT(IE) SLEEP(0.5) ClkItem(GetID("Windows","#32770",1),"OK") ClkItem(GetID("Windows","#32770",1),"このページから移動") ClkItem(GetID("Windows","#32770",1),"プログラムを終了します") ClkItem(GetID("Windows","#32770",1),"プログラムを再起動します") ClkItem(GetID("ページからのメッセージ","#32770",1),"OK") ClkItem(GetID("ページからのメッセージ","#32770",1),"このページから移動") ClkItem(GetID("ページからのメッセージ","#32770",1),"プログラムを終了します") ClkItem(GetID("ページからのメッセージ","#32770",1),"プログラムを再起動します") CONSTTIME_OUT=60 tm=Gettime() TRY REPEAT SLEEP(1) ifbGettime()-tm>TIME_OUT break endif UNTIL(!IE.BUSY)AND(IE.READYSTATE=4) EXCEPT SLEEP(2) EXIT ENDTRY SendMessageA(IE.Hwnd,WM_ACTIVATE,0,0) SLEEP(0.5) FEND |
ただし、逆に下位のIEなどをご利用の場合は、上記だと動かない場合もあるのでご注意ください。
PC操作自動化のポイント。サイト巡回スクリプトは利用用途に応じて基本的な処理は共通化しよう。
UWSCスクリプトでサイト巡回自動化を行う場合、こういった基本的な処理をどのようにするかという点は、結構大事になってくるところです。
利用用途などを鑑みて、最初に良く考えておきたいところですね。
PC操作自動化のポイントは、このような基本処理を最初に設計して、共通化しておくことです。
以下の記事で共通化についても触れているので、合わせて読んでいただけると幸いです。

UWSCの共通処理は、別ファイルにクラス化しておくと非常に便利ですよ。
共通処理は別ファイルに部品化しておくと、実装やメンテナンスが効率化できます。UWSCでスクリプトを作成すると「.UWS」形式のファイルを作成するかと思います。通常は、目的とする全ての処理をこの「.UWS」のファイルに記述します。なので、「1...

UWSCのプログラム時、画面を閉じる処理を共通化しておくと非常に便利です。
「IEでウィンドウ(画面)を閉じる処理」はよくあるパターンなので、共通化すると便利ですね。ウェブサイトを操作するプログラムなどを作ると、画面(ウインドウ)を閉じる処理を記述することは頻繁にあります。もちろん、IEでセオリー通りにブラウザを起...