【问题标题】:C# using webbrowser documenttext, document stays nullC# 使用 webbrowser 文档文本,文档保持为空
【发布时间】:2013-11-08 07:27:47
【问题描述】:

我希望标题足够清楚,但我会尽力解释......

我正在使用 C# Winforms (dotnet 4.5)。

问题是我正在创建一个 WebBrowser 控件并尝试使用wb.DocumentText 设置内容。但是当我尝试遍历元素时,它说文档是空的(null)

这是我的代码:

WebBrowser wb = new WebBrowser();
wb.DocumentText = leMessage;

HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in elems)
{
    // Do Some Stuff
}

leMessage 包含一个 HTML 时事通讯消息,其中有一些标签。

我已经尝试过这个:wb.Document.Body.InnerHtml = leMessage;,但这也没有用...

我错过了什么或做错了什么?

【问题讨论】:

    标签: c# winforms null webbrowser-control elements


    【解决方案1】:

    你需要在事件webBrowser1_DocumentCompleted被触发后循环元素。因此你需要在你的代码中包含它

    webBrowser1.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
    
    private void webBrowser1_DocumentCompleted(object sender,WebBrowserDocumentCompletedEventArgs e)
    {
       //here you can to loop your elements     
    }
    

    【讨论】:

    • 好的,谢谢。我会尝试实现它(它在一个循环中,所以它有点复杂)
    【解决方案2】:

    试试这个:

    WebBrowser wb;
    private void Form1_Load(object sender, EventArgs e)
    {
        wb = new WebBrowser();
        wb.DocumentCompleted += wb_DocumentCompleted;
        wb.DocumentText = "<html><body><a href='#'>Test</a></body></html>";
    }
    
    void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElementCollection elems = ((WebBrowser)sender)
            .Document.GetElementsByTagName("a");
        foreach (HtmlElement elem in elems)
        {
            // Do Some Stuff
        }
    }
    

    【讨论】:

    • 好的,谢谢。我会尝试实现它(它在一个循环中,所以有点复杂)
    【解决方案3】:

    WebBrowser.DocumentText 是异步的。您需要先处理DocumentComplete,然后才能访问 DOM,并继续发送 Windows 消息。 Here's a complete example 的网页抓取,使用 async/await 保持方便的线性代码流。只需更改导航部分:

    await NavigateAsync(ct, () => this.webBrowser.DocumentText = leMessage), timeout);
    HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
    

    这样你就可以循环执行。简而言之:

    using System;
    using System.Diagnostics;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WinformsApp2
    {
        public partial class MainForm : Form
        {
            public MainForm()
            {
                InitializeComponent();
            }
    
            const string leMessage = "<a href='http://example.com'>Go there</a>";
    
            private async void MainForm_Load(object sender, EventArgs e)
            {
                var wb = new WebBrowser();
    
                TaskCompletionSource<bool> tcs = null;
                WebBrowserDocumentCompletedEventHandler documentCompletedHandler = (sender2, e2) => tcs.TrySetResult(true);
    
                for (int i = 0; i < 3; i++)
                {
                    tcs = new TaskCompletionSource<bool>();
                    wb.DocumentCompleted += documentCompletedHandler;
                    try {
                        wb.DocumentText = leMessage;
                        await tcs.Task;
                    }
                    finally {
                        wb.DocumentCompleted -= documentCompletedHandler;
                    }
                    HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
                    foreach (HtmlElement elem in elems)
                    {
                        Debug.Print(elem.OuterHtml);
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 哇,非常感谢你!先生,您救了我的命!再次感谢:D
    • @Mathlight,很高兴它有帮助。 async/await 很开心,不是吗? :)
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多