后,我需要得到web浏览器的更新HTML它被用AJAX功能更新web浏览器的HTML阿贾克斯
例如更新后,我浏览到“Page1.asp的”,但“Page1.asp的”包括一个iframe从另一个页面加载内容。它还有一个jQoery功能,在xx秒后显示一个提交按钮。
我的问题是如何从webBrowser获取最新的html?
我尝试更新,但没有运气,
webBrowser.Update();
后,我需要得到web浏览器的更新HTML它被用AJAX功能更新web浏览器的HTML阿贾克斯
例如更新后,我浏览到“Page1.asp的”,但“Page1.asp的”包括一个iframe从另一个页面加载内容。它还有一个jQoery功能,在xx秒后显示一个提交按钮。
我的问题是如何从webBrowser获取最新的html?
我尝试更新,但没有运气,
webBrowser.Update();
使用WebBrowser.DocumentText()
。
此属性包含当前文档的文本,即使另一个文件已请求。如果您设置此属性的值,然后立即再次检索它,则检索到的值可能与WebBrowser控件没有时间加载新内容的值集不同。您可以在DocumentCompleted事件处理程序中检索新值。或者,您可以通过在循环中调用Thread.Sleep方法来阻止该线程,直到DocumentText属性返回最初设置为的值。
尝试在DocumentCompleted()事件处理函数内运行调用DocumentText()。如果你不能这样做,因为iFrame不会抛出这个事件,只需设置一个计时器并每隔几秒就检索一次文本。
好吧,它有点棘手的问题,你需要按照以下准则正确地实现你的目标。
写这段代码在timer_tick事件:
如果(browser.ReadyState == WebBrowserReadyState.Complete)
一旦你找到了,然后完成了准备状态您要查找的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.
}
,但这并没有解决框架问题? documentText仍未填充? – EGN 2013-03-09 05:06:12
不可能!您必须启用计时器,并且在执行ajax浏览器仍然繁忙时查找浏览器状态为“完成”。您需要在计时器滴答声内调用App.DoEvents()函数,以便获得最新的Web浏览器声明。多德。我写了很多很多的刮板,我知道它的工作原理。 – KMX 2013-03-11 17:23:33
让我告诉你一件事,documentText永远不会给你写最近的内容。您必须手动查找元素,然后选择其html,然后围绕它完成工作。 – KMX 2013-03-11 17:24:41