この質問を書き始める前に、私は、IFRAMEがWebページ上に存在する場合は、各文書が完了した後、DocumentCompletedイベントが(その後、もう一度解雇になるだろうという、問題C#でWebBrowserコントロールDocumentCompletedイベントを使用するには?
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
次解決するためにしてしようとしていました)。プログラムが完了していないDOMからデータを読み取ろうとしていて、自然に失敗した可能性が高いです。
しかし、この質問を書いて、突然ながらモンスター「場合何が私にインスピレーションを得た、と私は私が解決しようとしたことが、問題をfix'ed。 Googleでこれを失敗したので、ここに投稿するといいと思いました。
private int iframe_counter = 1; // needs to be 1, to pass DCF test
public bool isLazyMan = default(bool);
/// <summary>
/// LOCK to stop inspecting DOM before DCF
/// </summary>
public void waitPolice() {
while (isLazyMan) Application.DoEvents();
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
if(!e.TargetFrameName.Equals(""))
iframe_counter --;
isLazyMan = true;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
if (!((WebBrowser)sender).Document.Url.Equals(e.Url))
iframe_counter++;
if (((WebBrowser)sender).Document.Window.Frames.Count <= iframe_counter) {//DCF test
DocumentCompletedFully((WebBrowser)sender,e);
isLazyMan = false;
}
}
private void DocumentCompletedFully(WebBrowser sender, WebBrowserDocumentCompletedEventArgs e){
//code here
}
今のところ、少なくとも5mのハックが正常に機能しているようです。
GoogleまたはMSDNのクエリに実際に失敗していますが、見つけられません。 「C#でWebcrowser Control DocumentCompletedイベントを使用する方法は?」
備考: Webcontrolについて多くのことを学んだ後、私はFuNKYのことを見つけました。
ドキュメントが完了したことを検出したとしても、ほとんどの場合、それは永遠に残ることはありません。ページの更新は、フレームリフレッシュ、ajaxのようなリクエストまたはサーバーサイドのプッシュ(非同期通信をサポートするいくつかのコントロールが必要で、htmlまたはJavaScript interopを持つ)などのいくつかの方法で行うことができます。また、一部のiframeはロードされませんので、永遠にそれらを待つのは最善の方法ではありません。
私が使用して終了:
if (e.Url != wb.Url)
DocumentCompletedイベントでのIsBusyプロパティの状態は? – AMissico
IsBusyは、最初のフレームが準備完了次第、falseを返します。 – Margus
あなたのコードは複数の通常のフレームでは機能しません。 –