Jo Nsc
Jo Nsc

Reputation: 33

WebBrowser control - wait for page loading after submit form

I am new to c# and its concepts, so i am sorry if this question is kind of dumb. I try to do some automatation using the winforms webbrowser control

elements = webBrowser1.Document.GetElementsByTagName("input");
foreach (HtmlElement element in elements)
{
    if (element.GetAttribute("value") == "Anzeigen")
    element.InvokeMember("click");
}

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

// do some math on recived html
// ......

// show results
MessageBox.Show(numPlanets.ToString() );

So, to explain it: Im looking for a Button with the value "Anzeigen", simulate a click on it, then wait till NEW page is loaded and do my calculations then. Unfortunately my calculations are done on the OLD HTML content, because its not waiting for the page to load. Strangely if i enter an Thread.Sleep(5000); after the foreach loop, this Sleep is executed BEFORE the click is simulated, and the calculation fails also.

I just need some synchronous behavior for that click, withouth using an event.

Hope u can help me with that, sorry for my bad english

EDIT: Solved it like this: Variable bool webbbrowserfinished = false inside the class, if i want synchronous behavior, i do it like this:

   webbrowserfinished = false;
   // do navigation here

   while (!webbrowserfinished)
   {
      Application.DoEvents();
      Thread.Sleep(100);
   }
   webbrowserfinished = false;

Upvotes: 3

Views: 11443

Answers (3)

Aniket Pathare
Aniket Pathare

Reputation: 1

You can use Thread.sleep(5000) to wait for your page to load, because if you don't, the navigate method will load a new doc into web browser control but it will not call document_complete_event_handler

Upvotes: 0

Conor
Conor

Reputation: 3

Well it isn't the best of solutions but you could always start a timer when the web browser navigates, and set timer1.Tick to something like 3000, then within the timer1_Tick method you can do your calculations on the new page, and then timer1.Stop();.

There is probably a better solution using events but I'm not too good with web browsers myself.

Upvotes: 0

Arjun Shetty
Arjun Shetty

Reputation: 1585

You can try WebBrowser.DocumentCompleted Event Occurs when the WebBrowser control finishes loading a document.

private void Form1_Load(object sender, EventArgs e)
{
   webBrowser1.Navigate("google.com");
   webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   MessageBox.Show("Completed Now!");
}

Upvotes: 5

Related Questions