在ajax之后更新webBrowser html

时间:2013-03-08 20:30:16

标签: c# ajax browser

我需要在AJB函数更新后获取webBrowser的更新html

例如,我导航到“page1.asp”,但“page1.asp”包含一个从另一个页面加载内容的iframe。它还有一个jQoery函数,在xx秒后显示一个Submit按钮。

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

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

webBrowser.Update();

2 个答案:

答案 0 :(得分:1)

这是一个有点棘手的问题,您需要正确遵循以下准则才能实现目标。

  1. 您需要在表单上创建一个计时器。用tick结合它,并给出约500毫秒的间隔。
  2. 在timer_tick事件中编写此代码:

    if(browser.ReadyState == WebBrowserReadyState.Complete)

  3. 一旦找到就绪状态已完成,那么您将查找在完成ajax请求后您认为将更新的html元素。

  4. 您可以这样检查任何元素:

            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.
        }
    

答案 1 :(得分:0)

使用WebBrowser.DocumentText()

From MSDN

  

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

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