C#如何在继续之前等待网页完成加载

我正在尝试创build一个程序,通过我们的缺陷跟踪系统的Web界面一次克隆多个错误。 如何在页面完全加载之前等待,然后继续?

//This is pseudo code, but this should give you an idea of what I'm trying to do. The //actual code uses multi-threading and all that good stuff :). foreach (string bug in bugs) { webBrowser.Navigate(new Uri(url)); webBrowser.Document.GetElementById("product").SetAttribute("value", product); webBrowser.Document.GetElementById("version").SetAttribute("value", version); webBrowser.Document.GetElementById("commit").InvokeMember("click"); //Need code to wait for page to load before continuing. } 

尝试DocumentCompleted事件

 webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted); void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { webBrowser.Document.GetElementById("product").SetAttribute("value", product); webBrowser.Document.GetElementById("version").SetAttribute("value", version); webBrowser.Document.GetElementById("commit").InvokeMember("click"); } 

这段代码对我很有帮助。 也许它也可能适合你

 wb.Navigate(url); while(wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show("Loaded"); 

在不阻塞UI线程的情况下完成此操作的最佳方法是使用.net 4.5中引入的Async和Await。
您可以将其粘贴到您的代码中,只需将浏览器更改为您的浏览器名称即可。 这样,你的线程就会等待页面加载,如果没有按时完成,它将停止等待,代码继续运行:

 private async Task PageLoad(int TimeOut) { TaskCompletionSource<bool> PageLoaded = null; PageLoaded = new TaskCompletionSource<bool>(); int TimeElapsed = 0; Browser.DocumentCompleted += (s, e) => { if (Browser.ReadyState != WebBrowserReadyState.Complete) return; if (Browser.Task.IsCompleted) return; PageLoaded.SetResult(true); }; // while (PageLoaded.Task.Status != TaskStatus.RanToCompletion) { await Task.Delay(10);//interval of 10 ms worked good for me TimeElapsed++; if (TimeElapsed >= TimeOut * 100) PageLoaded.TrySetResult(true); } } 

你可以像这样使用它,在asynchronous方法中,或者在一个button单击事件中,使它成为asynchronous:

 private async void Button1_Click(object sender, EventArgs e) { Browser.Navigate("www.example.com"); await PageLoad(10);//await for page to load, timeout 10 seconds. //your code will run after the page loaded or timeout. } 

检查WatiN项目 :

受到WatiN开发的Watir的启发,于2005年12月开始为.Net语言进行类似的Web应用程序testing。 此后,WatiN已经发展成为一个易于使用,function丰富和稳定的框架。 WatiN是在C#中开发的,旨在为您带来一个简单的方法,使用.Net通过Internet Explorer和FireFox自动执行testing。

任务方法为我工作,除了Browser.Task.IsCompleted已被改为PageLoaded.Task.IsCompleted。

对不起,我没有添加评论,这是因为我需要更高的声誉来添加评论。

请去Selenium( http://seleniumhq.org )或WatiN( http://watin.sourceforge.net )去保存一些工作。

idk为什么但是yuna和bnl代码在下面的情况下失败了;

第一个等待完成,但第二个与invokemember(“提交”)没有。 调用作品。 但是ReadyState.Complete在其完成之前像完成一样完成:

 wb.Navigate(url); while(wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show("ok this waits Complete"); //navigates to new page wb.Document.GetElementById("formId").InvokeMember("submit"); while(wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show("webBrowser havent navigated yet. it gave me previous page's html."); var html = wb.Document.GetElementsByTagName("HTML")[0].OuterHtml; 

如何解决这个不需要的情况;

  button1_click(){ wb.Navigate("site1.com"); waitWebBrowserToComplete(wb); wb.Document.GetElementById("input1").SetAttribute("Value", "hello"); //submit does navigation wb.Document.GetElementById("formid").InvokeMember("submit"); waitWebBrowserToComplete(wb); // this actually waits for document Compelete. worked for me. var processedHtml = wb.Document.GetElementsByTagName("HTML")[0].OuterHtml; var rawHtml = wb.DocumentText; } //instead of checking readState . we get state from DocumentCompleted Event via bool value bool webbrowserDocumentCompleted = false; public static void waitWebBrowserToComplete(WebBrowser wb) { while (!webbrowserDocumentCompleted ) { Application.DoEvents(); } webbrowserDocumentCompleted = false; } form_load(){ wb.DocumentCompleted += (o, e) => { webbrowserDocumentCompleted = true; }; } 

如果您使用的是InternetExplorer.Application COM对象,请检查ReadyState属性的值为4。

我认为WebBrowser控件的DocumentCompleted事件应该让你去需要的地方。

假设“提交”元素代表一个标准的表单提交button,那么你可以附加一个事件处理程序的WebBrowsers导航事件。

 while (true) {//ie is the WebBrowser object if (ie.ReadyState == tagREADYSTATE.READYSTATE_COMPLETE) { break; } Thread.Sleep(500); } 

我用这种方式来等待直到页面加载。

看了上面的一些答案之后,我发现了一个共同的缺陷。 您不能普遍使用上述任何解决scheme。 这是最好的方式去:

 private void let_Load(string url) { // Waits for page to load // If page doesn't load in 10 seconds, the while loop is exited with error Stopwatch s = new Stopwatch(); s.Start(); while (url != webbrowser1.Url.ToString()) { Application.DoEvents(); if (url == webbrowser1.Url.ToString()) break; if (s.Elapsed > TimeSpan.FromSeconds(9.9)) { richTextBox.Text = "Error: Page is unable to Load."; break; } } } 

现在你所要做的只是调用函数并传递需要加载的url! 此外,由于秒表,您的代码不会中断,如果您的网页从未加载或有某种input错误。 该代码将在10秒后自动停止循环。

 // Short Example webbrowser1.Navigate("http://twitter.com"); let_load("http://twitter.com"); 

快速提示:确保网页浏览器已经有一个url。 只需在属性中设置url,以便在运行应用程序时加载它。