mshtmlでフレームのコンテンツを取得するにはどうすればよいですか?
質問
問題は次のとおりです。
IEに WebBrowser.OnNavigateComplete2
イベントに反応するフックがあり、ドキュメントのコンテンツを解析して正確な情報を取得します。
そのドキュメントにはフレームが含まれているため、 HTMLDocument.frames
を調べます。それぞれについて、document.body.outerHTMLプロパティを調べてコンテンツを確認します。
問題は、探している文字列は決して表示されないのに対し、フィナーレページに表示されることです。だから、私は間違った場所を見ていますか?ページが完全にロードされたときに表示される場合は、ある時点でダウンロードされていますよね?しかし、どのオブジェクトを見るべきですか?
ところで、それが重要かどうかはわかりませんが、検索しているページはASP.NETアプリケーションからのものです。
public void OnNavigateComplete2(object pDisp, ref object url)
{
document = (HTMLDocument)webBrowser.Document;
mshtml.FramesCollection frames = document.frames;
for (int i = 0; i < frames.length; i++)
{
object refIdx = i;
IHTMLWindow2 frame = (IHTMLWindow2)frames.item(ref refIdx);
string frameContent = frame.document.body.outerHTML;
}
}
ご協力ありがとうございます。
@rams このイベントはページごとに何度も起動されるため、探しているフレームをキャッチできなくても、フレームがロードされるたびに発生するものと考えました。そうでない場合、フレームのコンテンツをキャッチするイベントはどうなりますか?
やりたいことは、正確なフレームの正確な情報を検出して保存することです。後で、フレームの解析から得た情報が必要なユーザーアクションによってトリガーされるWebページが読み込まれます。
解決
コンテンツを探しているフレームの名前/ IDを知っていますか?その場合、navigateComplete2イベントで、フレームへの参照を取得できますか
iFrame frm = document.frames(<your frame id>);
int readyState=0;
while(frm.readystate !=4){
// do nothing. be careful to not create an endless loop
}
if(frm.readyState==4){
// get your content now
}
HTH
他のヒント
何らかのスレッドを使用していますか?別のスレッドでブラウザを実行すると、本当に混乱します。 STAThreadで実行して、正しい結果が得られるかどうかを確認してください。
文字列が表示されない理由は、フレームが原因です。 Webブラウザーコントロールは、メインドキュメントを読み込んだ後にドキュメントナビゲーション完了イベントを発生させます。この時点では、フレームはまだソースを要求していません。ドキュメントがWebブラウザーコントロールによって解析された後、フレームソースの要求が問題となり、ダウンロードされます。
達成しようとしていることを説明してもらえますか?