3

我是 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”的按钮,模拟点击它,然后等到新页面加载并然后进行我的计算。不幸的是,我的计算是在旧 HTML 内容上完成的,因为它没有等待页面加载。奇怪的是,如果我输入 Thread.Sleep(5000); 在 foreach 循环之后,在模拟点击之前执行此睡眠,并且计算也失败。

我只需要该点击的一些同步行为,而不使用事件。

希望你能帮助我,对不起我的英语不好

编辑:像这样解决它:变量 bool webbbrowserfinished = false 在类内,如果我想要同步行为,我这样做:

   webbrowserfinished = false;
   // do navigation here

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

3 回答 3

5

您可以尝试WebBrowser.DocumentCompleted 事件 在 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!");
}
于 2012-09-27T18:04:28.893 回答
0

好吧,这不是最好的解决方案,但是您始终可以在 Web 浏览器导航时启动一个计时器,并将其设置timer1.Tick为 3000 之类的值,然后在该timer1_Tick方法中您可以在新页面上进行计算,然后timer1.Stop();.

使用事件可能有更好的解决方案,但我自己对网络浏览器不太擅长。

于 2012-09-27T17:19:25.160 回答
0

您可以使用Thread.sleep(5000)等待页面加载,因为如果您不这样做,则导航方法会将新文档加载到 Web 浏览器控件中,但不会调用document_complete_event_handler

于 2016-01-19T09:06:37.940 回答