C# WebBrowser 控件——在 AJAX 之后获取文档元素?

IT技术 c# javascript ajax browser
2021-02-17 07:26:20

我正在编写一个应用程序,它使用 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 :(
6个回答

我为我解决了这个问题。

关键是,为onPropertyChanged通过 ajax 调用填充的 div 元素的事件附加一个处理程序

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
}
嗨,我一直在尝试使用 youtube 评论来做到这一点,但我不知道这将如何工作。
2021-04-20 07:26:20
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);           
        }
    }
}
不错的解决方案。我只是为了好玩和简单的事情而尝试,这看起来很不错。
2021-04-24 07:26:20
这将继续呈现旧的 html。在 .Net 4.0 中尝试过
2021-05-06 07:26:20

您将需要为此使用 DOM。将 WebBrowser.Document.DomDocument 转换为 IHTMLDocument?。您将不得不导入一些 COM 接口或 Microsoft.mshtml 程序集。

查看http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx了解更多详细信息。

我也正在尝试这样做,您有没有找到解决方案?
2021-05-02 07:26:20
哎哟! 如果可能的话,我想避免这种情况,我想。我可以很好地使用 HtmlElement.DomElement COM 类型,但是 IHTMLDocument 是否会在 javascript 后具有现在更改的元素?
2021-05-09 07:26:20

我假设,由于您正在阅读从 Ajax 请求生成的内容,因此您需要用户将应用程序推进到加载相关数据的位置,然后运行代码来读取数据。

如果情况并非如此,您将需要自动执行此过程,生成点击事件以构建您有兴趣阅读的 DOM 节点。我通常使用 WebBrowser 控件执行此操作,并且倾向于在 Javascript 中编写该功能层并使用 .InvokeScript() 调用它。另一种方法是找到从 C# 触发 Ajax 功能的节点并手动触发它们的点击事件:

HtmlElement content = webMain.Document.GetElementById("content");
content.RaiseEvent("onclick");

上面脚本中需要注意的一个重要方面是,如果您接受并解决 HtmlElement 对象类型的限制,您可以在 C# 中天真地与 DOM 节点交互。

感谢您提供信息丰富的帖子,不幸的是,我的问题在于一旦 JavaScript 已经运行,页面上就有新元素需要与之交互或检查其中的值…… Document.x 似乎没有这些新元素后 javascript :(
2021-05-02 07:26:20
.Document 引用提供对 DOM 的实时访问,并且在初始加载后创建的元素与原始元素一样可访问。生成的元素是否有可能存在于框架中?你能分享出现问题的页面吗?
2021-05-13 07:26:20

如何运行 javascript 来为元素添加标题并将其显示在新窗口中?

我还没有测试过,但它可能有效。

(WebBrowser)w.Navigate("javascript:GetElementById('div').innerHtml;", true);

在新窗口中打开返回的 true 属性。(或者一个框架或者你可以找到更好的方法)

要捕获 NewWindow 事件,您需要引用 Windows/System32 文件夹中的 SHDocVw.dll。然后你可以像这样投射你的 WebBrowser Control:

SHDocVw.WebBrowser_V1 browser = (SHDocVw.WebBrowser_V1)(WebBrowser)w.ActiveXInstance;

您可以在存储响应后立即关闭它。祝你好运,让我知道进展如何。