有很多这类问题,我无法找到解决问题的方法。
我有一个网页,在网页加载后调用Ajax并且它将加载一个包含数据的表,可能需要2秒。
我想要该表中的数据。
当我尝试使用文档文本访问表时它没有表HTML。它仍然具有在Ajax调用之前加载的初始HTML。
webBrowser1.Update(); //Didn't work
然后我尝试了这不起作用
private void Timer_Tick(object sender, EventArgs e) //Interval of 5000
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
HtmlElement element = webBrowser1.Document.GetElementById("tableType3");
if (element != null)
{
String webbrowsercontent = element.InnerHtml;
timer.Stop();
}
}
}
然后我尝试了这不起作用
private void WaitTillPageLoadsCompletly(WebBrowser webBrControl)
{
WebBrowserReadyState loadStatus;
int waittime = 20000;
int counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
{
break;
}
counter++;
}
counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if (loadStatus == WebBrowserReadyState.Complete && webBrControl.IsBusy != true)
{
break;
}
counter++;
}
}
在调试中,我看到WebBrowser1.Document.NativeHtmlDocument2中的表内容因内部类而无法访问。
有没有其他方法可以解决我的问题。
答案 0 :(得分:1)
您是否尝试过收听Ajax onpropertychange
事件?
我最近访问了一个网站,该网站教授如何在onpropertychange
中处理Ajax组件webBrowser1_DocumentCompleted
事件。
以下代码,我希望这会引领您的解决方案。
(这里的想法是获取由AJAX生成的webBrowser1.Document.GetElementById("abc");
动态内容,并展示如何等待onpropertychange
中的webBrowser1_DocumentCompleted
事件
HTML代码
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$.ajaxSetup({
cache: false
});
var aa = function() {
$.get("ajax.php", function(data) {
$("#abc").html(data);
});
};
$(function() {
aa();
setInterval(aa, 2000);
});
</script>
</head>
<body>
<div id="abc"></div>
</body>
</html>
<强> ajax.php 强>
<?php
echo date("H:i:s");
C#代码
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://127.0.0.1/test.html");
}
private void handlerAbc(Object sender, EventArgs e)
{
HtmlElement elm = webBrowser1.Document.GetElementById("abc");
if (elm == null) return;
Console.WriteLine("elm.InnerHtml(handlerAbc):" + elm.InnerHtml);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
/* Get the original HTML (method 1)*/
System.IO.StreamReader getReader = new System.IO.StreamReader(webBrowser1.DocumentStream, System.Text.Encoding.Default);
string htmlA = getReader.ReadToEnd(); // htmlA can only extract original HTML
/* Get the original HTML (method 2)*/
string htmlB = webBrowser1.DocumentText; // htmlB can only extract original HTML
/* You can use the following method to extract the 'onChanged' AJAX content*/
HtmlElement elm = webBrowser1.Document.GetElementById("abc"); // Get "abc" element by ID
Console.WriteLine("elm.InnerHtml(DocumentCompleted):" + elm.InnerHtml);
if (elm != null)
{
// Listen on 'abc' onpropertychange event
elm.AttachEventHandler("onpropertychange", new EventHandler(handlerAbc));
}
}
<强>结果:强>
elm.InnerHtml(DocumentCompleted):
elm.InnerHtml(handlerAbc):06:32:36
elm.InnerHtml(handlerAbc):06:32:38
elm.InnerHtml(handlerAbc):06:32:40
答案 1 :(得分:0)
我使用OpenWebKitSharp解决了js呈现的Html内容的问题。如果您可以更改库,只需转到此链接查看解决方案:Get final HTML content after javascript finished by Open Webkit Sharp