VB6
IEオブジェクトで読み込み完了まで待たせるのに以下のコードで待たせてますが、
ちゃんと読み込み完了まで待ってくれません。
どのようにすれば確実に待たすことができますか?
Do While IE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Sleep 1
Loop
>Sleep 1
これだと1ミリ秒(1/1000秒)しか止まってくれません。
試しにSleep 1000(1秒)くらいにしてみては?
コードとしてはこれでいいのでしょうか?
Sleep 1000 で確実に待たせますか?
確実に待たしたいのですが、他に方法はありませんでしょうか?
VBはイベント駆動型の言語です。
ループで待機させるのではなく、イベントを使いましょう。
ページ遷移の完了を判断するのであれば、NavigateComplete2 イベント、
Documentプロパティへの読み込み完了なら、DocumentComplete イベントです。
>mさま
適切な回答が出来なくてスミマセンでした。
>魔界の仮面弁士さま
フォローありがとうございました。
NavigateComplete2, DocumentComplete 等のイベントではじめは待たす処理を
してたのですが、このイベントがうまくおきなかったのでループ処理を加えました。
はて。DocumentComplete を使うのが、一般的な手法だと思うのですが。
http://support.microsoft.com/kb/246247/ja
http://support.microsoft.com/kb/180366/en-us
> このイベントがうまくおきなかったので
それは不思議ですね。
「うまくおきなかった」というのは、具体的にはどういった状況ですか?
たとえば、非表示のときにイベントが発生しない、という話であれば、
それはループで取得する方法でも、同じ結果になるかと思います。
http://support.microsoft.com/kb/259935/en-us
で、最初の質問にしても、「ちゃんと読み込み完了まで待ってくれません」
という部分が、若干曖昧だと思います。
ロード中にループを抜けてしまうのか、それとも、ロードが完了しても
ループを抜けてくれないのか、あるいは、エラーになってしまうのか、
また、ReadyState が返す値がどのように変化しているのか、そして、
特定の URL だけで発生するのか、常に発生するのか、他の PC でも
起きるのかなど、具体的な状況も添えて質問された方がよろしいのでは。
>「うまくおきなかった」というのは、具体的にはどういった状況ですか?
そのページにはテキストとボタンがあり(Postしている)ボタンをVBからをクリックさせてます。ボタンを押すとページが変わり、DocumentComplete イベントが起きますが(コードは以下を参照)、ボタンをクリックする前のタイトルが取られてしまいます。なぜでしょうか?
Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
strHtmlTitle = IE.Document.Title
End Sub
少し確認させてください。
> ボタンをクリックする前のタイトルが取られてしまいます。
イベント引数 URL の内容はどうなっていますか?
また、そのページにフレームセットやインラインフレームはありませんか?
あと、その時の IE.document.documentElement.outerHTML はどうでしょう。
前のページの物を指し続けていますか? それとも、ページ遷移後の物ですか?
あるいは、そのいずれでもない内容ですか?
それと、イベント発生を無視して、十分な時間をおいた後に、タイトルを
取得した場合には、望むべき結果が得られているのでしょうか?
> そのページにはテキストとボタンがあり(Postしている)
「そのページ」がどのページかわからないので、とりあえず
http://openlab.ring.gr.jp/k16/htmllint/htmllint.html
を使ってテストしてみましたが、こちらでは正常に、POST後のタイトル
"Check result of Another HTML-lint"を取得する事ができました。
Private Sub Command1_Click()
Dim doc As Object
Set doc = IE.Document
doc.Forms(0).MethodData.Checked = True
doc.Forms(0).submit
End Sub
Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Debug.Print URL, IE.Document.Title, IE.Document.getElementsByTagName("TITLE")(0).innerText
End Sub
書き忘れていましたが、そのページは https://〜 のセキュリティページです。
>イベント引数 URL の内容はどうなっていますか?
前のページのURLになってます。
>また、そのページにフレームセットやインラインフレームはありませんか?
ありません。
>あと、その時の IE.document.documentElement.outerHTML はどうでしょう。
前のページの物を指し続けています。
>それと、イベント発生を無視して、十分な時間をおいた後に、タイトルを
>取得した場合には、望むべき結果が得られているのでしょうか?
ちゃんとそのページのタイトルがとれます。
>「そのページ」がどのページかわからないので
これはこたえられませんが・・・
コードはこんな感じです。
Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
p_Title = IE.Document.Title
End Sub
Private Sub Test()
IE.Navigate2 "https://〜"
IE.Visible = True
Do While p_Title = ""
DoEvents
Sleep 1
Loop
If p_Title = "ERROR" Then
Exit Sub
Else
p_Title = ""
End If
IE.Document.All("SUBMIT").Click
Do While p_Title = ""
DoEvents
Sleep 1
Loop
If p_Title = "OK" Then
Debug.Print "OK"
End If
End Sub
これならうまくいきました。
Private Sub Test()
IE.Navigate2 "https://〜"
IE.Visible = True
Do While p_Title = ""
DoEvents
Sleep 1
Loop
If p_Title = "ERROR" Then
Exit Sub
Else
p_Title = ""
End If
IE.Document.All("SUBMIT").Click
Do While p_Title = ""
DoEvents
Sleep 1
Loop
' *************************
' 以下のコードを追加
Do While IE.Busy = True Or IE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Sleep 1
Loop
p_Title = IE.Document.Title
' *************************
If p_Title = "OK" Then
Debug.Print "OK"
End If
End Sub
別にいいけど、Sleepいらなくね?
>>「そのページ」がどのページかわからないので
> これはこたえられませんが・・・
了解です。
> 書き忘れていましたが、そのページは https://〜 のセキュリティページです。
こちらでも SSLサイトで試してみましたが、現象を確認できませんでした。
>>イベント引数 URL の内容はどうなっていますか?
>前のページのURLになってます。
であれば、前のページのタイトルになるでしょうね……。
確認したいのですが、現在の処理としては、
1. 送信前ページの URL に対する DocumentComplete が発生。
2. プログラムから submit 処理を行い、データを POST する。
3. この後、送信後ページの URL に対する DocumentComplete が
発生するはずだが、それは発生しない。
4. 代わりに、送信前ページの URL に対する DocumentComplete が
再度発生してしまう。
という状況なのでしょうか? それとも、
1. 送信前ページの URL に対する DocumentComplete が発生するのを
待たずに submit 処理を行い、データを POST する。
2. データを POST した後で、送信前ページの URL に対する
DocumentComplete が発生してしまう。
3. データを POST した後で、送信後ページの URL に対する
DocumentComplete が発生するはずだが、それは発生しない。
という状況でしょうか?
> これならうまくいきました。
なにはともあれ、解決されたようで何よりです。
ありがとうございます。
状況としては、
1. 送信前ページの URL に対する DocumentComplete が発生。
2. プログラムから submit 処理を行い、データを POST する。
3. この後、送信後ページの URL に対する DocumentComplete が
発生するはずだが、それは発生しない。
4. 処理をとめてBody部を取得するときちんとそのページのものが取得される。
です。
ツイート | ![]() |