VB6 IEオブジェクトで読み込み完了まで待たせる

解決


m  2005-10-18 19:09:08  No: 126382

VB6

IEオブジェクトで読み込み完了まで待たせるのに以下のコードで待たせてますが、
ちゃんと読み込み完了まで待ってくれません。

どのようにすれば確実に待たすことができますか?

Do While IE.ReadyState <> READYSTATE_COMPLETE
    DoEvents
    Sleep 1
Loop


nano  2005-10-18 19:25:52  No: 126383

>Sleep 1
これだと1ミリ秒(1/1000秒)しか止まってくれません。
試しにSleep 1000(1秒)くらいにしてみては?


m  2005-10-18 19:34:05  No: 126384

コードとしてはこれでいいのでしょうか?
Sleep 1000 で確実に待たせますか?
確実に待たしたいのですが、他に方法はありませんでしょうか?


魔界の仮面弁士  2005-10-18 19:46:33  No: 126385

VBはイベント駆動型の言語です。
ループで待機させるのではなく、イベントを使いましょう。

ページ遷移の完了を判断するのであれば、NavigateComplete2 イベント、
Documentプロパティへの読み込み完了なら、DocumentComplete イベントです。


nano  2005-10-18 19:51:01  No: 126386

>mさま
適切な回答が出来なくてスミマセンでした。

>魔界の仮面弁士さま
フォローありがとうございました。


m  2005-10-19 00:55:37  No: 126387

NavigateComplete2, DocumentComplete 等のイベントではじめは待たす処理を
してたのですが、このイベントがうまくおきなかったのでループ処理を加えました。


Dental  2005-10-19 07:49:01  No: 126388

はて。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 でも
起きるのかなど、具体的な状況も添えて質問された方がよろしいのでは。


m  2005-10-20 18:41:01  No: 126389

>「うまくおきなかった」というのは、具体的にはどういった状況ですか?
そのページにはテキストとボタンがあり(Postしている)ボタンをVBからをクリックさせてます。ボタンを押すとページが変わり、DocumentComplete イベントが起きますが(コードは以下を参照)、ボタンをクリックする前のタイトルが取られてしまいます。なぜでしょうか?

Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    strHtmlTitle = IE.Document.Title
End Sub


魔界の仮面弁士  2005-10-20 19:02:25  No: 126390

少し確認させてください。

> ボタンをクリックする前のタイトルが取られてしまいます。
イベント引数 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


m  2005-10-20 19:29:03  No: 126391

書き忘れていましたが、そのページは https://〜 のセキュリティページです。

>イベント引数 URL の内容はどうなっていますか?
前のページのURLになってます。

>また、そのページにフレームセットやインラインフレームはありませんか?
ありません。

>あと、その時の IE.document.documentElement.outerHTML はどうでしょう。
前のページの物を指し続けています。

>それと、イベント発生を無視して、十分な時間をおいた後に、タイトルを
>取得した場合には、望むべき結果が得られているのでしょうか?
ちゃんとそのページのタイトルがとれます。

>「そのページ」がどのページかわからないので
これはこたえられませんが・・・


m  2005-10-20 20:09:46  No: 126392

コードはこんな感じです。

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


m  2005-10-20 20:22:50  No: 126393

これならうまくいきました。

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


名無し  2005-10-20 21:26:53  No: 126394

別にいいけど、Sleepいらなくね?


魔界の仮面弁士  2005-10-20 21:33:22  No: 126395

>>「そのページ」がどのページかわからないので
> これはこたえられませんが・・・
了解です。

> 書き忘れていましたが、そのページは 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 が発生するはずだが、それは発生しない。

という状況でしょうか?

> これならうまくいきました。
なにはともあれ、解決されたようで何よりです。


m  2005-10-20 23:23:57  No: 126396

ありがとうございます。

状況としては、

1. 送信前ページの URL に対する DocumentComplete が発生。
2. プログラムから submit 処理を行い、データを POST する。
3. この後、送信後ページの URL に対する DocumentComplete が
    発生するはずだが、それは発生しない。
4. 処理をとめてBody部を取得するときちんとそのページのものが取得される。

です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加