2012-09-27 44 views
3

我是新来的C#及其概念,所以我很抱歉,如果这个问题是一种愚蠢的。 我尝试使用的WinForms WebBrowser控件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()); 

所以做一些automatation,来解释它: 进出口寻找值为“Anzeigen”按钮,模拟就可以了一下,然后等到新页然后加载并做我的计算。 不幸的是,我的计算是在旧的HTML内容上完成的,因为它没有等待页面加载。奇怪的是,如果我输入一个Thread.Sleep(5000);在foreach循环之后,在模拟点击之前执行该睡眠,并且计算也失败。

我只是需要一些同步行为,没有使用事件。

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

编辑: 解决这样的: 变量BOOL webbbrowserfinished里面的类=假,如果我想要同步的行为,我不喜欢这样:

webbrowserfinished = false; 
    // do navigation here 

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

为什么不你想使用事件吗? –

+0

这是不可能的,国际海事组织。我使用了web浏览器控件_a lot_,包括[编辑模式](http://www.codeproject.com/Articles/43954/ZetaHtmlEditControl)。我从来没有找到同步解决方案,因为我确实认为加载只是异步进行的。 –

回答

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!"); 
} 
+0

不幸的是,他说“没有使用事件”。 –

+0

哎呀对不起,读了 –

+0

我的事件的问题是,我不得不一遍又一遍地做这个。我去一个新的页面,做数学,去一个新的一页,做数学,去一个新的页面....我认为这不能解决优雅的事件,纠正我,如果我错了 –

0

那么它是不是最好的解决方案,但是当网络浏览器导航你总是可以启动一个定时器,并设置timer1.Tick成类似3000,那么timer1_Tick方法中,你可以做在你的计算新页面,然后timer1.Stop();

使用事件可能有更好的解决方案,但我对自己的Web浏览器不太满意。

+0

这似乎也使用事件;-) –

0

您可以使用Thread.sleep(5000)等待你的页面加载,因为如果你不这样做,导航方法将加载一个新文档到Web浏览器的控制,但它不会叫document_complete_event_handler