我正在编写一个使用WebBrowser控件的应用程序来查看可以通过添加新内容/元素的AJAX更改的Web内容。 我似乎无法以任何方式尝试新的元素。 BrowserCtl.DocumentText没有最新的页面,当然它也不在“查看源代码”中。
有没有办法使用此控件获取此新数据? :( 请帮忙。谢谢!
IE:
Browser.Navigate("www.somewebpagewithAJAX.com");
//Code that waits for browser to finish...
...
//WebBrowser control has loaded content and AJAX has loaded new content
// (is visible at runtime on form) but can't see them in Browser.Document.All
// or Browser.DocumentText :(
答案 0 :(得分:17)
我为我解决了这个问题。
关键是,为通过ajax调用填充的div元素的onPropertyChanged
事件附加处理程序。
HtmlElement target = webBrowser.Document.GetElementById("div_populated_by_ajax");
if (target != null)
{
target.AttachEventHandler("onpropertychange", handler);
}
最后,
private void handler(Object sender, EventArgs e)
{
HtmlElement div = webBrowser.Document.GetElementById("div_populated_by_ajax");
if (div == null) return;
String contentLoaded = div.InnerHtml; // get the content loaded via ajax
}
答案 1 :(得分:5)
using System;
using System.Windows.Forms;
namespace WebBrowserDemo
{
class Program
{
public const string TestUrl = "http://www.w3schools.com/Ajax/tryit_view.asp?filename=tryajax_first";
[STAThread]
static void Main(string[] args)
{
WebBrowser wb = new WebBrowser();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
wb.Navigate(TestUrl);
while (wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
Console.WriteLine("\nPress any key to continue...");
Console.ReadKey(true);
}
static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender;
HtmlElement document = wb.Document.GetElementsByTagName("html")[0];
HtmlElement button = wb.Document.GetElementsByTagName("button")[0];
Console.WriteLine(document.OuterHtml + "\n");
button.InvokeMember("Click");
Console.WriteLine(document.OuterHtml);
}
}
}
答案 2 :(得分:3)
您需要使用DOM。将WebBrowser.Document.DomDocument转换为IHTMLDocument?。您必须导入一些COM接口或Microsoft.mshtml程序集。
有关详细信息,请查看http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx。
答案 3 :(得分:2)
我认为,由于您正在阅读从Ajax请求生成的内容,您需要用户将应用程序升级到加载相关数据的位置,此时您将运行代码来读取数据。
如果情况并非如此,则需要自动化此过程,生成点击事件,构建您有兴趣阅读的DOM节点。我通常使用WebBrowser控件执行此操作,并倾向于在Javascript中编写该层功能并使用.InvokeScript()调用它。另一种方法是找到从C#激活Ajax功能的节点并手动触发它们的点击事件:
HtmlElement content = webMain.Document.GetElementById("content");
content.RaiseEvent("onclick");
在上面的脚本中需要注意的一个重要方面是,如果您接受并解决HtmlElement对象类型的限制,您可以在C#中天真地与DOM节点进行交互。
答案 4 :(得分:0)
如何运行javascript来标题元素并在新窗口中显示?
我没有测试过,但它可能有用。
(WebBrowser)w.Navigate("javascript:GetElementById('div').innerHtml;", true);
在新窗口中打开返回的true属性。 (或者框架或者你可以找到更好的方法)
要捕获NewWindow事件,您需要引用Windows / System32文件夹中的SHDocVw.dll。然后你可以像这样投射你的WebBrowser控件:
SHDocVw.WebBrowser_V1 browser = (SHDocVw.WebBrowser_V1)(WebBrowser)w.ActiveXInstance;
存储响应后,您可以立即关闭它。祝你好运,让我知道它是怎么回事。
答案 5 :(得分:0)
信息不在WebBrowser.DocumentText中吗? http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documenttext.aspx
答案 6 :(得分:-1)
你控制网页吗?
如果有,这是一篇博文,解释了如何: http://www.palladiumconsulting.com/blog/sebastian/2007/04/ultimate-intranet-toy.html
如果没有,可能有一个解决方案,但我无法帮助你,抱歉。