我需要在页面上执行javascript后访问HTML文档的DOM。我有以下代码连接到URL并获取文档。 问题是它在用javascript
修改后永远不会得到DOMpublic class CustomBrowser
{
public CustomBrowser()
{
//
// TODO: Add constructor logic here
//
}
protected string _url;
string html = "";
WebBrowser browser;
public string GetWebpage(string url)
{
_url = url;
// WebBrowser is an ActiveX control that must be run in a
// single-threaded apartment so create a thread to create the
// control and generate the thumbnail
Thread thread = new Thread(new ThreadStart(GetWebPageWorker));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
string s = html;
return s;
}
protected void GetWebPageWorker()
{
browser = new WebBrowser();
// browser.ClientSize = new Size(_width, _height);
browser.ScrollBarsEnabled = false;
browser.ScriptErrorsSuppressed = true;
//browser.DocumentCompleted += browser_DocumentCompleted;
browser.Navigate(_url);
// Wait for control to load page
while (browser.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
Thread.Sleep(5000);
var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)browser.Document.DomDocument;
html = documentAsIHtmlDocument3.documentElement.outerHTML;
browser.Dispose();
}
}
我希望有人可以帮我解决这个问题
答案 0 :(得分:3)
如果客户端脚本确实正如您所说的那样在IE7中执行,那么问题可能只是时间问题。即使文档的加载完成后,您也无法确切地知道何时将执行JS脚本。在尝试达到documentElement
之前等待5秒听起来像理论上的好主意;在实践中,元素可能存在于此之前。或者,网络可能很慢,仅仅提取jQuery脚本需要5秒钟。
我建议测试你正在寻找的元素是否存在(img
标签,视情况而定)。
while (browser.Document.GetElementsByTagName("img").Count == 0) {
Application.DoEvents();
}
这样,您就不需要Thread.Sleep
行。
答案 1 :(得分:2)
我看不到这里执行的js,但我想你可以找到确切更新的元素并将on事件处理程序附加到onprpertychange事件时,就像这里给出的解决方案一样: C# WebBrowser control -- Get Document Elements After AJAX?
如果js按类而不是想法翻转元素,那么你可以从这里借用逻辑: How to select a class by GetElementByClass and click on it programmically
答案 2 :(得分:1)
检查IE7中页面的呈现方式。我想你缺少的标签是jQuery添加的,页面上的jQuery 2.2.4版本不支持IE7。我认为WebBrowser类确实包含了IE7,即使你的PC上有更新版本的IE。
如果您拥有该页面,请尝试添加jQuery migrate插件。