c# - webBrowser1_DocumentCompleted 事件后单击按钮
问题描述
我有一个 C# 4.0 WinForms 应用程序,它有一个 WebBrowser 控件和 2 个按钮。
单击第一个按钮将 URL 发送到浏览器以导航到指定的网站。
单击第二个按钮会解析 webBrowser1.Document 的 OuterHtml,查找文件下载的“https://...”链接。
然后,该代码使用 webClient.DownloadFileAsync 拉取文件以供在应用程序中进一步使用。
如果 我手动单击这些按钮,上述代码将成功运行。
为了使最终用户自动化,我放置了第一个按钮的单击事件,即 btnDisplayWeb.PerformClick(); 在表单的 Form1_Load 事件中。这也有效,允许 webBrowser1 用所需的网站填充其文档。
但是,我无法以编程方式单击第二个按钮来获取文件下载的 Web 链接。
我试图将第二个按钮单击事件放在浏览器的 DocumentCompleted 事件中,如下所示。
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
btnMyUrl.PerformClick();
}
但是,根据我在 StackOverFlow 和其他网站上阅读的内容,可能会多次调用此特定事件,因此它会失败。
我也尝试循环几秒钟,甚至使用 Thread.Sleep(xxxx),但浏览器窗口无法填充,直到睡眠或计时器停止。
我尝试使用在下面显示的以下 StackOverFlow 站点上找到的建议。
如何在 C# 中使用 WebBrowser 控件 DocumentCompleted 事件?
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 的 OK 按钮。
在 DocumentCompleted 事件之后是否发生了另一个事件。或者,有人可以建议如何以编程方式关闭 MessageBox 吗?
如果这可以在代码中完成,那么我可以在该部分代码中执行第二个按钮的 buttonClick()。
解决方案
在发现添加 MessageBox 允许完成 webBrowser1.Document,并在 webBrowser_DocumentCompleted 事件中使用 webBrowser1.ReadyState 事件后,我需要做的就是找到一种以编程方式关闭 MessageBox 的方法。
在 StackOverFlow 上的进一步搜索在以下站点上发现了以下解决方案。
实现 AutoClosingMessageBox 并设置时间间隔,关闭 MessageBox 并允许我的按钮单击,即 btnMyUrl.PerformClick(); 成功解析 OuterHtml,现在代码可以正常工作。
希望如果其他人发现在 webBrowser_DocumentCompleted 事件中放置 MessageBox 可以完成文档;前面提到的 AutoClosingMessageBox 也会帮助他们。
推荐阅读
- python - 偏差缓解 AIF 360 DataFrame 值必须是数字
- vue.js - 类型上不存在属性“axios”
- react-router - 为什么我不能在路由器中使用查询字符串?
- node.js - 部署后的 Socket.io 和 heroku CORS 问题
- database - 当我在 tdengine 中使用表标签时,过滤策略在哪里运行?
- javascript - 如何使用 React 和 Axios 通过 JSON 获取正确的 API 信息
- ejs - Bootstrap 5 如何在网格中排列我的专辑
- python - 如何在画布 python tkinker 上自动调整按钮和文本的大小?
- reactjs - 添加搜索以选择 React Bootstrap React JS
- java - Spring Webflux Callable不适用于异步