人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBSでクリックをする処理

VBSで下記のような処理をしたいのですがコードをご教授頂いてもよろしいでしょうか?

配列に下記の3つのURLが入っています。
MSN【http://jp.msn.com/】MSN天気【http://weather.jp.msn.com/】MSNスポーツ【http://topics.jp.msn.com/sports】
For eachで各要素をIEで開く→クリック処理→IEを閉じる というループをします

---クリック処理の部分の詳細は下記になります---

?現在開いているURLに「weather」が含まれる場合
URLに「regin」が含まれるリンクをソースから全て抽出しランダムにどれかをクリック
?現在開いているURLに「sports」が含まれる場合
URLに「sports」が含まれるリンクをソースから全て抽出しランダムにどれかをクリック
?現在開いているURLに何も含まれない場合
何もせずにIEを終了
?現在開いているURLの“HTMLソース”に「これはダメです」という文字列が含まれる場合
スクリプトを強制終了

※URLに移動するだけではなく、あくまでクリックになります。
※サイトが10秒経っても読み込み完了しなければ、完了してなくともクリック処理へと進みます。
読み込みが完了しない等でクリック先がない場合は、IEを閉じその回のループは終了します。

●質問者: ty2016
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● gong1971
●500ポイント ベストアンサー

※質問中の「regin」は「region」ですよね?修正してコードを組んでいます。
※強制終了は、元のurlとクリック後の両方で判断しました。

'# 初期設定
Dim open_url(2)
Dim find_url()

open_url(0) = "http://jp.msn.com/"
open_url(1) = "http://weather.jp.msn.com/"
open_url(2) = "http://topics.jp.msn.com/sports"

For Each temp_url In open_url
'# IE表示
Set IE = CreateObject( "InternetExplorer.Application" )
IE.Visible = true
IE.Navigate(temp_url)

'# IE待機処理
t = Timer + 10
Do Until (IE.busy = False) or (Timer > t)
Loop

'# 強制終了
If Instr(IE.document.body.innerHTML, "これはダメです") Then
MsgBox "強制終了"
WScript.quit
End If

'# キーワードの設定
kw = ""
If Instr(temp_url, "weather") Then
kw = "region"
ElseIf Instr(temp_url, "sports") Then
kw = "sports"
End if

If kw <> "" Then
j = 0
ReDim find_url(IE.Document.Links.length)
'# リンクのurlにキーワードが含まれるものを探す
For i = 0 to IE.Document.Links.length - 1
If Instr(IE.Document.Links(i).href, kw) Then
find_url(j) = i
j = j + 1
End If
Next

'# リンクのurlにキーワードが含まれるものをランダムに開く
Randomize
IE.Document.Links(find_url(Int(Rnd * j))).Click

'# IE待機処理
t = Timer + 10
Do Until (IE.busy = False) or (Timer > t)
Loop

'# 強制終了
If Instr(IE.document.body.innerHTML, "これはダメです") Then
MsgBox "強制終了"
WScript.quit
End If
End If

'# IE終了
IE.Quit
Set IE = nothing
Next

gong1971さんのコメント
['# 強制終了]の前に下記のコードを追加するといかがでしょうか? >|vb| If IE.document.body is Nothing Then WScript.quit End If ||< ※2箇所あります。 ※必要に応じて[WScript.quit]の前に ['# この3行は気にしないでください]の処理を入れてください。 また、「何らかのエラーが起きてもポップアップダイアログは絶対に表示させない」 との事なので、[MsgBox "強制終了"]は削除してください。(こちらも2箇所あります) 余談ですが、私も似たようなスクリプトを日常的に使っており、 同様のエラーが発生しています。 どうも、(IE.busy = False)の処理が正しく行われていないようです。 という訳で調べてみたところ、次のように書いた方が良いのかもしれません。 >|VB| Do Until (IE.busy = False) or (Timer > t) ||< ↓ >|VB| Do Until ((IE.busy = False) and (IE.readyState <> 4)) or (Timer > t) ||< ただ、これでもエラーは発生しました。 処理に多少時間が掛かっても良いようであれば、Sleepを入れるのも一つの手だと思います。 # はてな記法がうまくいかず、何度か書き直してしまいました。

ty2016さんのコメント
おかげさまで無事解決することができました。 >ただ、これでもエラーは発生しました。 処理に多少時間が掛かっても良いようであれば、Sleepを入れるのも一つの手だと思います。 との事でしたので、エラーの起きる21行目の前にSleepを入れると上手くいきました。 これだと全くエラーが発生しないですね。 この度はお手数おかけ致しました。

gong1971さんのコメント
以下、ご参考までに。 気になったので、その後も調べていたのですが、 ↓こんな情報がありました。こちらの方が確実のようですね。 ■ブラウザのビジー状態を判定するための,より良い方法 (WSHでIEを自動操作する際,COMのアプリケーションイベントを利用する) http://d.hatena.ne.jp/language_and_engineering/20100410/p1 ※ただ、私はまだ試していません。

質問者から

この度はご回答頂きありがとう御座います。
正常に動作致しましたが、4回に1度くらいの頻度で下記のエラーで止まってしまいます。
(天気予報かスポーツのところで発生します)

行:21
文字:2
エラー:オブジェクトがありません。:IE.document.body
コード:800A01A8
ソース:Microsoft VBScript実行時エラー

安定して動作させたいので、このエラーが起きないように解決できるでしょうか?


2 ● 亜美
●0ポイント

http://3rd.geocities.jp/kaito_extra/Source/MouseCtrl.html

こういうのですか・・?


亜美さんのコメント
ちがってたらホントすみません・・・;;
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ