我需要在页面上执行 javascript 后访问 HTML 文档的 DOM。我有以下连接到 URL 并获取文档的代码。 问题是用 javascript 修改后它永远不会得到 DOM
public 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();
}
}
我希望有人能帮我解决这个问题
最佳答案
如果客户端脚本确实像您所说的那样在 IE7 中执行,则问题可能纯粹是时间问题。即使在文档加载完成后,您也无法确切地知道 何时 将执行 JS 脚本。在尝试访问 documentElement
之前等待 5 秒在理论上听起来是个好主意;实际上,该元素可能在此之前就已存在。或者,网络可能很慢,仅仅获取 jQuery 脚本本身就需要 5 秒。
我建议测试您要查找的元素是否存在(img
标记,视情况而定)。类似的东西
while (browser.Document.GetElementsByTagName("img").Count == 0) {
Application.DoEvents();
}
这样,您就不需要 Thread.Sleep
行。
关于c# - 使用 WebBrowser 访问 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42495828/