WebBrowser control-ожидание загрузки страницы после отправки формы
Я новичок в c# и его концепциях, поэтому мне жаль, если этот вопрос немного глуп.
Я пытаюсь сделать некоторую автоматизацию, используя 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() );
Итак, чтобы объяснить это:
Я ищу кнопку со значением "Anzeigen", имитирую щелчок по ней, затем жду, пока загрузится новая страница, и делаю свои вычисления.
К сожалению, мои расчеты сделаны на старом содержимом HTML, потому что он не ждет загрузки страницы. Странно, если я вхожу в поток.Сон (5000); после для каждого цикла этот спящий режим выполняется до имитации щелчка, и вычисление также завершается неудачей.
Мне просто нужно какое-то синхронное поведение для этого клика, с использованием события.
Надеюсь, вы можете помочь мне с этим, извините за мой плохой английский
Править:
Решил ее вот так:
Переменная bool webbbrowserfinished = false внутри класса, если я хочу синхронное поведение, я делаю это так:
webbrowserfinished = false;
// do navigation here
while (!webbrowserfinished)
{
Application.DoEvents();
Thread.Sleep(100);
}
webbrowserfinished = false;
3 ответов:
Вы можете попробовать WebBrowser.DocumentCompleted Event Происходит, когда элемент управления WebBrowser завершает загрузку документа.
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!"); }
Ну, это не самое лучшее решение, но вы всегда можете запустить таймер, когда веб-браузер переходит, и установить
timer1.Tickна что-то вроде 3000, затем в рамках методаtimer1_TickВы можете сделать свои вычисления на новой странице, а затемtimer1.Stop();.Возможно, есть лучшее решение, использующее события, но я сам не слишком хорошо разбираюсь в веб-браузерах.
Вы можете использовать
Thread.sleep(5000), чтобы дождаться загрузки страницы, потому что если вы этого не сделаете, метод navigate загрузит новый документ в управление веб-браузером, но он не вызоветdocument_complete_event_handler
Comments