MD6*_*380 28 c# webbrowser-control
我正在尝试创建一个程序,通过我们的缺陷跟踪系统的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.
}
Run Code Online (Sandbox Code Playgroud)
小智 31
这段代码对我很有帮助.也许它也适合你
wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
MessageBox.Show("Loaded");
Run Code Online (Sandbox Code Playgroud)
Qui*_*son 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");
}
Run Code Online (Sandbox Code Playgroud)
小智 19
在不阻止UI线程的情况下执行此操作的最佳方法是使用.net 4.5中引入的Async和Await.
您可以将其粘贴到代码中,只需将浏览器更改为您的web浏览器名称即可.这样,你的线程等待加载页面,如果它没有准时,它会停止等待,你的代码继续运行:
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 (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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以像这样使用它,在异步方法中,或在按钮单击事件中,只需将其设为异步:
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.
}
Run Code Online (Sandbox Code Playgroud)
小智 8
工作方法为我工作,除了Browser.Task.IsCompleted已改为PageLoaded.Task.IsCompleted.
对不起,我没有添加评论,这是因为我需要更高的声誉来添加评论.