WebBrowserについて

解決


ブラウザ  2009-10-21 21:26:50  No: 142686  IP: 192.*.*.*

はじめまして。
vb6でWebBrowserを使用し、フレームで切り分けられたページのソースを取得したいと思っております。

<FRAMESET border=0 frameSpacing=0 rows=50,*,10 frameBorder=0>
<FRAME name=me src="***" scrolling=no>
<FRAMESET border=0 frameSpacing=0 frameBorder=0 cols=240,*>
<FRAME name=le src="***">
<FRAME name=de src="***"></FRAMESET>
<FRAME name=co src="***" noResize scrolling=no></FRAMESET>

というフレームで出来たページがあるんですが、これのname=deの部分のページをHTMLソースで取得したいです。(body以下)
今現在では大元は取得できてるのですがその部分が取得出来ません。
どなたかご教授頂ければ幸いです。
宜しくお願い致します。

一応、PGは
↓↓↓↓↓

WebBrowser.Navigate URL
RichTextBox = WebBrowser.Document.body.outerhtml

これでrichに値を入れましたがダメでした・・・

編集 削除
Hongliang  2009-10-22 13:45:15  No: 142687  IP: 192.*.*.*

ドキュメントのロード完了までの待機はいいとして。

frameset ページに Navigate した場合、Document の frames プロパティで各フレーム要素が持っている Window のコレクションが手に入ります。
このコレクションからは名前またはインデックスを引数にした item メソッドでウィンドウのオブジェクトが手に入り、そこから document を参照できます。

編集 削除
ブラウザ  2009-10-22 14:08:20  No: 142688  IP: 192.*.*.*

Hongliangさんご教授有難う御座います。
一応いろいろ調べて

RichTextBox = WebBrowser.Document.frames("de").Document.body.outerhtml

これでいけました。
ただ、フレーム全体のうちどれか一つでもページ表示が完了するとCompleteされてしまいます。
今回取得したページ(name=de)が完了したらCompleteとし、次の処理へいきたいのですがどのようにしたら宜しいでしょうか??
再度ご教授頂ければ幸いです。
宜しくお願い致します。

WebBrowser.Navigate URL

'ここでフレームのどれか一つでもページ表示が完了すると次の処理にいってしまい困ってます。name=deのページが完了すると次の処理にいきたいです。
With WebBrowser
    Do While .ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Loop
End With

RichTextBox = WebBrowser.Document.frames("de").Document.body.outerhtml

編集 削除
ブラウザ  2009-10-22 14:28:35  No: 142689  IP: 192.*.*.*

すいません。
フレーム内すべてのページが表示してから次の処理に進むでもいいです。
宜しくお願い致します。

編集 削除
魔界の仮面弁士  2009-10-22 15:59:09  No: 142690  IP: 192.*.*.*

読み込みが完了したかどうかを、延々と ReadyState プロパティに
問い合わせ続けるのは避けてください。DocumentComplete イベントで
読み込み完了を通知してもらう方が効率が良い筈です。


で、DocumentComplete イベントもまた、フレームの数だけ発生しますが、
イベント引数を見ることで、それぞれを判断できるかと思います。

編集 削除
ブラウザ  2009-10-22 16:15:57  No: 142691  IP: 192.*.*.*

魔界の仮面弁士さんご教授有難う御座います。
ReadyStateに延々はよくないのですね。
知りませんでした・・・
すごく参考になります。
それで早速DocumentCompleteに変更してみました。
下記でいけるかと思っております。
もし不備があればご教授頂ければ幸いです。
宜しくお願い致します。

WbFlag = True

WebBrowser.Navigate URL

Private Sub WebBrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant)

    If WbFlag = True Then
        frame_cnt = frame_cnt + 1
        If frame_cnt = 4 Then
            RichTextBox = WebBrowser.Document.frames("de").Document.body.outerhtml
        End If
    End If

End Sub

編集 削除
魔界の仮面弁士  2009-10-22 17:04:39  No: 142692  IP: 192.*.*.*

> ReadyStateに延々はよくないのですね。
> 知りませんでした・・・

WebBrowser の場合に限らず、基本的に、DoEvents ループでの待機は避けてください。
ループ待機させる代わりに、イベント駆動型のコーディングを採用しましょう。


例えば、「チェックボックスが on になったらメッセージを表示する」という時に

    Do Until Check1.Value = vbChecked
      DoEvents
    Loop
    MsgBox "CheckBox が on になった"

なんていうループ待機のコードは書きませんよね。通常は、

  Private Sub Check1_Click()
    If Check1.Value = vbChecked Then
      MsgBox "CheckBox が on になった"
    End If
  End Sub

のようにイベントで処理するかと思いますが、それと同じことです。


> もし不備があればご教授頂ければ幸いです。
流れとしては、そのような方法で良いかと思います。
frame_cnt に初期値をセット(あるいはリセット)する箇所が無いのは気になりますが。

それと、今回は発生回数だけで良いのかも知れませんが、ページによっては
イベント引数もチェックした方が良い事もあるかと思います。
(自動的に他のページに遷移するようなサイトだと、イベント発生回数が増加するため)

編集 削除
ブラウザ  2009-10-22 17:21:34  No: 142693  IP: 192.*.*.*

魔界の仮面弁士さん
わざわざ丁寧に教えて頂いて本当にご教授有難う御座います。
お蔭様で少しWebBrowserを理解できました。
本当に感謝致します。(涙)
実際試しましたところ問題なく動作致しました。

frame_cntの初期化はココには記載しませんでしたが最初に記述してあります。
ただ、リセットを追加しておりませんでしたので追加致しました。

>> それと、今回は発生回数だけで良いのかも知れませんが、ページによっては
>> イベント引数もチェックした方が良い事もあるかと思います。
>> (自動的に他のページに遷移するようなサイトだと、イベント発生回数が増加するため)

こちらも今後の為に勉強しておきます。
また何かありましたら是非こちらに記載させて頂きますので、今後とも宜しくお願い致します。
これで解決とさせて頂きます。
Hongliangさん、魔界の仮面弁士さん、この度は本当に有難う御座いました。

編集 削除
ブラウザ  2009-10-22 17:22:09  No: 142694  IP: 192.*.*.*

有難う御座いました。

編集 削除