我是c#及其概念的新手,所以如果这个问题有点愚蠢,我很抱歉。 我尝试使用winforms webbrowser控件进行一些自动化
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”的按钮,模拟点击它,然后等到新页面被加载然后进行我的计算。 不幸的是,我的计算是在OLD HTML内容上完成的,因为它不等待页面加载。奇怪的是,如果我输入Thread.Sleep(5000);在foreach循环之后,在模拟点击之前执行此睡眠,并且计算也失败。
我只需要针对该点击进行一些同步行为,而不使用事件。
希望你能帮助我,抱歉我的英语不好
编辑: 解决它像这样: 类中的变量bool webbbrowserfinished = false,如果我想要同步行为,我这样做:
webbrowserfinished = false;
// do navigation here
while (!webbrowserfinished)
{
Application.DoEvents();
Thread.Sleep(100);
}
webbrowserfinished = false;
答案 0 :(得分:5)
您可以尝试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!");
}
答案 1 :(得分:0)
这不是最好的解决方案,但你可以随时在网络浏览器导航时启动计时器,并将timer1.Tick
设置为3000,然后在timer1_Tick
方法中你可以做到计算新页面,然后timer1.Stop();
。
使用事件可能有更好的解决方案,但我自己对网络浏览器不太满意。
答案 2 :(得分:0)
您可以使用Thread.sleep(5000)
等待您的网页加载,因为如果您不这样做,导航方法会将新文档加载到网络浏览器控件中但不会调用document_complete_event_handler