我正在尝试创建一个程序,通过我们的缺陷跟踪系统的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. }
小智.. 31
这段代码对我很有帮助.也许它也适合你
wb.Navigate(url); while(wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show("Loaded");
作品.但CPU负载将在"同时"飙升 (2认同)
你可以使用Start-Sleep -Milliseconds 1000; 在while循环中避免CPU峰值,但Qintins DocumentCompleted回调更正确. (2认同)
Quintin Robi.. 28
尝试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"); }
此代码是否意味着在执行以下命令之前,Web浏览器将始终等待完成? (2认同)
小智.. 19
在不阻止UI线程的情况下执行此操作的最佳方法是使用.net 4.5中引入的Async和Await.
您可以将其粘贴到代码中,只需将浏览器更改为您的web浏览器名称即可.这样,你的线程等待加载页面,如果它没有准时,它会停止等待,你的代码继续运行:
private async Task PageLoad(int TimeOut) { TaskCompletionSourcePageLoaded = null; PageLoaded = new TaskCompletionSource (); int TimeElapsed = 0; Browser.DocumentCompleted += (s, e) => { if (Browser.ReadyState != WebBrowserReadyState.Complete) return; if (PageLoaded.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); } }
您可以像这样使用它,在异步方法中,或在按钮单击事件中,只需将其设为异步:
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. }
我相信:"if(Browser.Task.IsCompleted)返回; PageLoaded.SetResult(true);" 应该是"if(PageLoaded.Task.IsCompleted)return; PageLoaded.SetResult(true);" (5认同)
Charlino.. 12
查看WatiN项目:
灵感的Watir华廷的发展在2005年12月开始做类似的一种Web应用程序测试的可能的网络语言.从那时起,WatiN已经发展成为一个易于使用,功能丰富且稳定的框架.WatiN是用C#开发的,旨在为您提供一种使用.Net的Internet Explorer和FireFox自动化测试的简便方法.
小智.. 8
工作方法为我工作,除了Browser.Task.IsCompleted已改为PageLoaded.Task.IsCompleted.
对不起,我没有添加评论,这是因为我需要更高的声誉来添加评论.
这段代码对我很有帮助.也许它也适合你
wb.Navigate(url); while(wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show("Loaded");
尝试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"); }
在不阻止UI线程的情况下执行此操作的最佳方法是使用.net 4.5中引入的Async和Await.
您可以将其粘贴到代码中,只需将浏览器更改为您的web浏览器名称即可.这样,你的线程等待加载页面,如果它没有准时,它会停止等待,你的代码继续运行:
private async Task PageLoad(int TimeOut) { TaskCompletionSourcePageLoaded = null; PageLoaded = new TaskCompletionSource (); int TimeElapsed = 0; Browser.DocumentCompleted += (s, e) => { if (Browser.ReadyState != WebBrowserReadyState.Complete) return; if (PageLoaded.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); } }
您可以像这样使用它,在异步方法中,或在按钮单击事件中,只需将其设为异步:
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项目:
灵感的Watir华廷的发展在2005年12月开始做类似的一种Web应用程序测试的可能的网络语言.从那时起,WatiN已经发展成为一个易于使用,功能丰富且稳定的框架.WatiN是用C#开发的,旨在为您提供一种使用.Net的Internet Explorer和FireFox自动化测试的简便方法.
工作方法为我工作,除了Browser.Task.IsCompleted已改为PageLoaded.Task.IsCompleted.
对不起,我没有添加评论,这是因为我需要更高的声誉来添加评论.