2013-03-08 68 views
0

后,我需要得到web浏览器的更新HTML它被用AJAX功能更新web浏览器的HTML阿贾克斯

例如更新后,我浏览到“Page1.asp的”,但“Page1.asp的”包括一个iframe从另一个页面加载内容。它还有一个jQoery功能,在xx秒后显示一个提交按钮。

我的问题是如何从webBrowser获取最新的html?

我尝试更新,但没有运气,

webBrowser.Update(); 

回答

0

使用WebBrowser.DocumentText()

From MSDN

此属性包含当前文档的文本,即使另一个文件已请求。如果您设置此属性的值,然后立即再次检索它,则检索到的值可能与WebBrowser控件没有时间加载新内容的值集不同。您可以在DocumentCompleted事件处理程序中检索新值。或者,您可以通过在循环中调用Thread.Sleep方法来阻止该线程,直到DocumentText属性返回最初设置为的值。

尝试在DocumentCompleted()事件处理函数内运行调用DocumentText()。如果你不能这样做,因为iFrame不会抛出这个事件,只需设置一个计时器并每隔几秒就检索一次文本。

1

好吧,它有点棘手的问题,你需要按照以下准则正确地实现你的目标。

  1. 您需要在窗体上创建一个计时器。用勾号将其绑定并给出大约500毫秒的时间间隔。
  2. 写这段代码在timer_tick事件:

    如果(browser.ReadyState == WebBrowserReadyState.Complete)

  3. 一旦你找到了,然后完成了准备状态您要查找的HTML元素,你认为会在完成ajax请求后更新。

你可以做到这一点的方法来检查任何元素:

 HtmlElementCollection forms = browser.Document.GetElementsByTagName("form"); 
     HtmlElement form = null; 
     foreach (HtmlElement el in forms) 
     { 
      string name = el.GetAttribute("name"); 
      if (name == "DATA") 
      { 
       form = el; 
       break; 
      } 
     } 

4)一旦你得到了你的元素你可能对你的工作开展。

更新:这里是计时器滴答代码,你可以按照你的需要扩展 确保您已设置您的Timer1.Inverval = 100(100毫秒)

private void Timer1_Tick(sender, args) 
    { 
     Application.DoEvents(); 

// make sure your are pulling right element id 
     HtmlElement cTag = webBrowser.Document.GetElementById("myelement");   

     if(cTag != null) // if elemnt is found than its fine. 
     { 
      cTag.SetAttribute("value", "Eugene"); 
      Timer1.Enabled = false; 
     } 
     else 
     { 
// dont worry, the ajax request is still in progress... just wait on it and move on for the next tick. 
     } 
     Application.DoEvents(); // you can call it at the end too. 
    } 
+0

,但这并没有解决框架问题? documentText仍未填充? – EGN 2013-03-09 05:06:12

+1

不可能!您必须启用计时器,并且在执行ajax浏览器仍然繁忙时查找浏览器状态为“完成”。您需要在计时器滴答声内调用App.DoEvents()函数,以便获得最新的Web浏览器声明。多德。我写了很多很多的刮板,我知道它的工作原理。 – KMX 2013-03-11 17:23:33

+0

让我告诉你一件事,documentText永远不会给你写最近的内容。您必须手动查找元素,然后选择其html,然后围绕它完成工作。 – KMX 2013-03-11 17:24:41