いつも参考にさせて頂いてます。
書き込みは今回初めてです。
もし不適な表現がありましたら、ご指摘ください。
開発環境:Windows2000(SP4)
開発言語:VB6.0(SP5)
ブラウザ:IE5.5
今、上記の環境でブラウザ(HTML)に対する操作の記録&再生プログラムに挑戦しています。
'Webブラウザオブジェクト(イベント取得の為WithEvents)
Public WithEvents objWeb As SHDocVw.WebBrowser
'CreateObject
Set objWeb = CreateObject("InternetExplorer.Application")
とし、各イベントを拾う事で操作をスクリプトファイルとして出力し、
そのスクリプトをもとに操作を再現するというものです。
操作を記録し、再生する事は概ね成功しました。
が、ここでひとつ問題が発生したのです。
例えばINPUTエレメント(TYPE=BUTTON)の押下を再生した際、
そのボタンのonclickイベント内にmsgboxなどの処理がある場合、
そこで再生が止まってしまいます。
(そのメッセージボックスが消えない限りVBとして次のSTEPへ処理が移らない)
表示されたメッセージボックスに対しての処理自体は大体目処が立っているのですが、
VBが次のSTEPへ進めない以上、肝心のその処理の呼び出しようがない状況です。
どうにかこのmsgboxに束縛されず次のSTEPへ進める手段はないものでしょうか?
若しくはその他の回避策があれば良いのですが、、、。
又、記録対象となるWebページは不定であり、こちらでいじる事は原則出来ません。
ご助言、宜しくお願い致します。
下記は他の掲示板(つい先日閉鎖された)に投稿された内容です。
希望にそうものかどうかは分かりませんが。
元投稿者はここの掲示板でも何時も的確なフォローを書いて
下っている方です。 (無断引用で済みません)
ret = CreateObject("WScript.Shell").Popup("5秒後に消えます", 5, "タイトル", vbInformation Or vbYesNoCancel Or vbDefaultButton3)
If ret = -1 Then
'タイムアウト
ElseIf ret = vbYes Then
'[はい]
End If
>が、ここでひとつ問題が発生したのです。
>例えばINPUTエレメント(TYPE=BUTTON)の押下を再生した際、
>そのボタンのonclickイベント内にmsgboxなどの処理がある場合、
>そこで再生が止まってしまいます。
>(そのメッセージボックスが消えない限りVBとして次のSTEPへ処理が移らない)
>表示されたメッセージボックスに対しての処理自体は大体目処が立っているのですが、
>VBが次のSTEPへ進めない以上、肝心のその処理の呼び出しようがない状況です。
msgboxはIEのイベントで出るものですよね?
そうするとVB側から勝手にWSHのものに置き換えることは無理そうな気がしますが?
私が思いつくのは参考リンクのような、msgboxのハンドルを監視する方法ですが
もっとうまい方法があるかもしれません。
識者の皆様フォローお願いします!
http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_10926102.html
>マフユさん
素早い書き込みありがとうございます。
でも、今回の話はWEBコンテンツ内のSCRIPT等で出るメッセージボックスが
問題なので、教えて頂いた方法では解決できないのです。
でもこれはこれで今後役に立ちそうなのでメモさせて頂きます。
また何かあったら是非お願いします。
>IMAさん
おお、こんな海外サイトも活用しているのですか〜。
英語に苦戦しながら読んでみたのですが、
監視用のEXEを別に作成し、立ち上げておく形になるということでよいのでしょうか。
今は直ぐに試せない状況なので次週、試してみます。(まず理解しなくてはですが)
ただ、諸々の事情で極力ひとつのEXEで賄いたいところなのです。
お二方、どうも情報ありがとうございます。
又、今回のようなVBでWebの操作を行うのに参考になるおすすめのHPなどもあったら、教えて下さいね。
今回の件はVBだと難しいような気もしますが、VB使いとしては意地でもどうにかしてみたい!というところです。
GOMA こんにちは
上記の件ですが、私は以下の記載からIEの再生?はVBが実行していると考えました。
したがって、監視用のEXEを別に作成しなくても、上記のVB作成のEXEへ記載すれば
良いのではと考えました。
>(そのメッセージボックスが消えない限りVBとして次のSTEPへ処理が移らない)
>表示されたメッセージボックスに対しての処理自体は大体目処が立っているのですが、
>VBが次のSTEPへ進めない以上、肝心のその処理の呼び出しようがない状況です。
なお、例えばIEのMsgBoxがPopUpしたのを即閉じさせたいのなら、ShowChanges(h As Long)
の後の方に
'***!!! Change to your form and textbox name !!!***
Form1.Text1 = Form1.Text1 & s
> '取得したウインドウハンドルに終了要求のメッセージを送る
> Form1.Text1 = Form1.Text1 & vbCrLf & "PostMessage to MsgBox ""WM_QUIT""" & vbCrLf
> Call PostMessage(h, WM_QUIT, 0, 0)
などと記載すればよいでしょう。(PostMessage、WM_QUIT の宣言もお忘れなく)
MsgBox の内容によって異なる処理をしたいのであれば、Captionその他を解析して
処理を分岐させることになると思います。
返事遅くなってすみません。
ソースいじってたらいつのまにか動かなくなって、
現在復旧中です。(^^;
まだ断言はできませんが、なんとかいけそうな雰囲気です。
おふたかた、どうもありがとうございました!
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200412/04120024.txt
>りんさん
こちらの方へ追加発言すれば確か最上段へ上がるので、新規作成せずとも
良いですよ。
すみません、最終的な結果を報告すべきでした。
結論から言うと、自分の力量ではVBのみで解決はできませんでした。
結局どうしたかというと、VC++6.0で作成したWindowMessage監視exeを別途
用意し、操作記録時にブラウザのドキュメント以外の操作(今回のダイアログ等)
はそちらで記録しておき、最後にVBで記録したDOMによる記録とマージさせる、
としました。
再生時は同じくVC++6.0で作成したブラウザDocument以外の操作担当exeを用意し、
IEからダイアログが作成された場合それを検知し、記録時と同様のボタンを押下
させる、という流れです。
尚このVC++部分はそちらに詳しい別の人間が作成担当し、私はあまり詳しくは
ありません。
ここを見ている方でVBで解決できる方法がわかる方おりましたら、フォローを
宜しくお願い致します。
お役に立てずにすみません、、。
GOMAさん お久しぶりです。りんさん こんにちは
最初の質問の意味をとらえ違いしていたのかも知れませんが、私の使用する場面は
以下のような場合に用いています。
概要:
1.アクティブなIEを常に監視し、そのLocationUrlによりコンテキストメニューを
独自のものに置き換える。
2.その中に「選択範囲を翻訳」を言う機能があり、選択部分を外部の翻訳ソフトに
渡し、自動的に翻訳させる。
ここで私が困ったことは、翻訳ソフトの終了時に保存確認のMsgBoxが必ずPopUpし、
いちいちクリックしないと終了できないことです。( 煩わしい!)
→これを右上の×ボタンで即終了させたかったのです。
それで、以前紹介したサイトのコードでMsgBoxのPopUpを監視し、現れたら即「はい」
や「いいえ」をクリックさせることを考えました。
使い方は、サイトの例そのもの ですが、
VBのコードの中で
標準モジュールに、紹介サイト中頃の ----Bas module code---- 以下を、適当な名前
(例えばmWatchMsgBox)を付けて保存しておきます。Sub ShowChanges は適当に変更して下さい。
私の場合は、以下のようにしています。
Private Sub ShowChanges(h As Long)
Dim sTypePopUp As String, sCaptionPopUp As String, sCaptionParent As String
If FindWindowEx(h, 0, "Edit", "") Then
sTypePopUp = "InputBox or dialog"
Else
sTypePopUp = "MsgBox"
End If
sCaptionPopUp = GetWndText(h)
sCaptionParent = GetWndText(GetParent(h))
If sTypePopUp = "MsgBox" And InStr(sCaptionPopUp, "MsgBoxのキャプション") Then
Call PostMessage(h, WM_QUIT, 0, 0)
End If
End Sub
そして、私のソフトでは
'txtTranserは翻訳ソフトのFullPath, /t は起動オプション
rtn = Shell(txtTranser & " /t", vbNormalFocus)
SetTimer hWnd, NV_MYEVENT, 50, AddressOf TimerProc
で翻訳ソフトを起動後、タイマー監視しMsgBoxのPopUpされると、
上のShowChangesが呼び出され、MsgBoxにWM_QUITを送っています。
「はい」や「いいえ」をクリックするには、簡単に
SendKeys "{TAB}", True
SendKeys "{ENTER}", True
でやっています。
必要無くなれば、適当なところで
KillTimer hWnd, NV_MYEVENT
を入れておいて下さい。
-----------------------------------------------------------------------------------
MsgBoxのキャプションを判断することで、色々な場合分けも可能かとは思いますが、
サイトの内容を動的に判断し、それまでに行った処理を変更する場合などは、その判断ロジック
が必要で、それをGOMAさん が望んでおられたなら、的はずれな回答でした。 (^_^;)
皆様のご意見、大変参考になりました。ひとまず、アドバイスを踏まえてあれやこれやとやってみようと思います。自分の解決方法ができましたら、また載せますね。ありがとうございました。
編集 削除