はじめまして。
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に値を入れましたがダメでした・・・
ドキュメントのロード完了までの待機はいいとして。
frameset ページに Navigate した場合、Document の frames プロパティで各フレーム要素が持っている Window のコレクションが手に入ります。
このコレクションからは名前またはインデックスを引数にした item メソッドでウィンドウのオブジェクトが手に入り、そこから document を参照できます。
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
すいません。
フレーム内すべてのページが表示してから次の処理に進むでもいいです。
宜しくお願い致します。
読み込みが完了したかどうかを、延々と ReadyState プロパティに
問い合わせ続けるのは避けてください。DocumentComplete イベントで
読み込み完了を通知してもらう方が効率が良い筈です。
で、DocumentComplete イベントもまた、フレームの数だけ発生しますが、
イベント引数を見ることで、それぞれを判断できるかと思います。
魔界の仮面弁士さんご教授有難う御座います。
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
> 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 に初期値をセット(あるいはリセット)する箇所が無いのは気になりますが。
それと、今回は発生回数だけで良いのかも知れませんが、ページによっては
イベント引数もチェックした方が良い事もあるかと思います。
(自動的に他のページに遷移するようなサイトだと、イベント発生回数が増加するため)
魔界の仮面弁士さん
わざわざ丁寧に教えて頂いて本当にご教授有難う御座います。
お蔭様で少しWebBrowserを理解できました。
本当に感謝致します。(涙)
実際試しましたところ問題なく動作致しました。
frame_cntの初期化はココには記載しませんでしたが最初に記述してあります。
ただ、リセットを追加しておりませんでしたので追加致しました。
>> それと、今回は発生回数だけで良いのかも知れませんが、ページによっては
>> イベント引数もチェックした方が良い事もあるかと思います。
>> (自動的に他のページに遷移するようなサイトだと、イベント発生回数が増加するため)
こちらも今後の為に勉強しておきます。
また何かありましたら是非こちらに記載させて頂きますので、今後とも宜しくお願い致します。
これで解決とさせて頂きます。
Hongliangさん、魔界の仮面弁士さん、この度は本当に有難う御座いました。
有難う御座いました。
ツイート | ![]() |