C# WebBrowser Button Click, then go to another page

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-24 11:03:57

问题


I need to click an html button and navigate to another page. After click I need to wait for page loading, and go to the new page only when the old page loaded.

Here is the code, that click a button:

element = webBrowser1.Document.GetElementById("LoginButton");
element.InvokeMember("click");

webBrowser has got a IsBusy property, but it don`t works after button click:

element = webBrowser1.Document.GetElementById("LoginButton");
element.InvokeMember("click");
if(webBrowser1.IsBusy)
{
     MessageBox.Show("Busy"); // Nothing happens, but page is not full loaded.
}

If I add System.Threading.Thread.Sleep(1000) the page loads and I can go to next page, but page loading time on other computers can be more.

What can I do to load another page only after the previous page has loaded?

P.S: I am from Russia, so sorry for bad English.


回答1:


If your webpage has any javascript blocks, you won't be able to solve the problem using the WebBrowser control itself. You should wait for a document.ready event using javascript code and let know your C# program about it.

Previously, I made a javascript block that provides the webpage state. It looks like this:

var isBusy = true;
function getIsScriptBusy () {
   return isBusy;
}
// when loading is complete:
// isBusy = false;
// document.ready event, for example

and a C# code that waits for it to return true:

void WaitForCallback(int timeout) {
    Stopwatch w = new Stopwatch();
    w.Start();
    Wait(delegate() {
        return (string)Document.InvokeScript("getIsScriptBusy") != "false"
            && (w.ElapsedMilliseconds < timeout || Debugger.IsAttached);
    });
    if(w.ElapsedMilliseconds >= timeout && !Debugger.IsAttached)
        throw new Exception("Operation timed out.");
}
void Wait(WaitDelegate waitCondition) {
    int bRet;
    MSG msg = new MSG();
    while(waitCondition() && (bRet = GetMessage(ref msg, new HandleRef(null, IntPtr.Zero), 0, 0)) != 0) {
        if(bRet == -1) {
            // handle the error and possibly exit
        } else {
            TranslateMessage(ref msg);
            DispatchMessage(ref msg);
        }
        Thread.Sleep(0);
    }
}



回答2:


There are lots of events exposed by the WebBrowser control. You might try Navigated or DocumentCompleted.

Nick




回答3:


WebBrowser.Navigated is the browser event you are seeking.




回答4:


Use this , You might just be able to use this once

 br1.DocumentCompleted += br1_DocumentCompleted;
        Application.Run();

Call

void br1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        var br1 = sender as WebBrowser;
        if (br1.Url == e.Url)
        {
            Console.WriteLine("Natigated to {0}", e.Url);
            Application.ExitThread();   // Stops the thread
        }
    }

Replace br1 with your webbrowser name Hope this helps



来源:https://stackoverflow.com/questions/7904091/c-sharp-webbrowser-button-click-then-go-to-another-page

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!