在 webBrowser1_DocumentCompleted 事件

问题描述

我有一个 C# 4.0 WinForms 应用程序,它有一个 Webbrowser 控件和 2 个按钮。

点击第一个按钮会向浏览器发送一个 URL 以导航到指定的网站。

点击第二个按钮解析 webbrowser1.Document 的 OuterHtml,寻找“https://...”链接以进行文件下载。

然后,代码使用 webClient.DownloadFileAsync 拉取文件以在应用程序中进一步使用。

以上代码成功运行,if 我手动点击这些按钮

为了为最终用户自动执行此操作,我放置了第一个按钮的点击事件,即 btndisplayWeb.PerformClick();在窗体的 Form1_Load 事件中。这也有效,允许 webbrowser1 使用所需的网站填充其文档。

但是,我无法以编程方式点击第二个按钮来获取文件下载的网络链接

我尝试将第二个按钮的点击事件放置在浏览器的 DocumentCompleted 事件中,如下所示。

private void webbrowser1_DocumentCompleted(object sender,WebbrowserDocumentCompletedEventArgs e)
{
    btnMyUrl.PerformClick();
}

但是,根据我在 StackOverFlow 和其他网站上阅读的内容,这个特定事件可能被多次调用,因此它失败了。

我也尝试过循环数秒,甚至使用 Thread.Sleep(xxxx),但浏览器窗口无法填充,直到睡眠或计时器停止。

我尝试使用以下 StackOverFlow 站点上的建议。

How to use WebBrowser control DocumentCompleted event in C#?

private void webbrowser_DocumentCompleted(object sender,WebbrowserDocumentCompletedEventArgs e)
{
    string url = e.Url.ToString();
    if (!(url.StartsWith("http://") || url.StartsWith("https://")))
    {
        // in AJAX
    }

    if (e.Url.AbsolutePath != this.webbrowser.Url.AbsolutePath)
    {
        // IFRAME 
    }
    else
    {
        // REAL DOCUMENT COMPLETE
    }
}

但是,在解析 OuterHtml 时,前两部分没有返回任何内容,而在第三部分中,会返回其他元素,而不是文件下载所需的“https://...”链接

有趣的是,如果我使用了一个webbrowser1.ReadyState事件,如下图,并且在DocumentCompleted里面放了一个MessageBox,这样好像可以让浏览器文档完成,因为点击OK按钮后,解析成功了。

if (webbrowser1.ReadyState == WebbrowserReadyState.Complete)
{
    MessageBox.Show("waiting","CHECKING");
    btnMyUrl.PerformClick();
}

但是,我很难找到一种方法来单击 MessageBox 的“确定”按钮。

在 DocumentCompleted 事件之后是否发生了另一个事件。 或者,有人可以建议如何以编程方式关闭 MessageBox 吗?

如果这可以在代码中完成,那么我可以在该部分代码中执行第二个按钮的 buttonClick()。

解决方法

在发现添加一个MessageBox可以让webBrowser1.Document完成后,在webBrowser_DocumentCompleted事件中使用webBrowser1.ReadyState事件后,我需要做的就是找到一种以编程方式关闭MessageBox的方法。

在 StackOverFlow 上进一步搜索发现以下站点上的以下解决方案。

Blue Prism

实现 AutoClosingMessageBox 并设置时间间隔,关闭 MessageBox 并允许我的按钮单击,即 btnMyUrl.PerformClick();成功解析 OuterHtml,现在代码可以正常工作了。

希望如果其他人发现在 webBrowser_DocumentCompleted 事件中放置 MessageBox 可以使文档完成;前面提到的 AutoClosingMessageBox 也会帮助他们。