mshtmlでフレームのコンテンツを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/324231

  •  11-07-2019
  •  | 
  •  

質問

問題は次のとおりです。

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ブラウザーコントロールによって解析された後、フレームソースの要求が問題となり、ダウンロードされます。

達成しようとしていることを説明してもらえますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top