System.Windows.Forms.WebBrowser 等待页面完全加载

2023-12-14

我一直在尝试很多不同的解决方案wait and async。似乎没什么作用。我无法找到实际上完全等待页面完全加载的解决方案。所有代码都在等待一段时间,但直到页面加载完毕,我在下一个过程中收到错误。

我如何将示例代码设置为等待模式,直到Document.GetElementById("quickFind_text_0")页面上已找到元素?

这是我的代码:

    private void button7_Click(object sender, EventArgs e)
    {

        webBrowser1.Navigate("https://company.crm4.dynamics.com/main.aspx?app=d365default&pagetype=entitylist&etn=opportunity");

        webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").SetAttribute("value", "Airbus");

        webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").InnerText = "Airbus";

        //Thread.Sleep(2000);

        HtmlElement fbLink = webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("mainContent").Document.GetElementById("quickFind_button_0"); ;
        fbLink.InvokeMember("click");
    }

附:我必须这样做“两次”,否则它不起作用:

    webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").SetAttribute("value", "Airbus");

    webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").InnerText = "Airbus";

在 VBA 中,这是有效的:

    While .Busy
        DoEvents

    Wend
    While .ReadyState <> 4
        DoEvents
    Wend

在 C# 中可以做同样的事情吗?


EDIT:

我的完整代码如下。由于某种原因,async/await 不起作用。

System.NullReferenceException HResult=0x80004003 消息=对象 未设置对对象实例的引用。来源=v.0.0.01
StackTrace:位于 v._0._0._01.Browser.d__7.MoveNext() 在 C:\Users\PC\source\repos\v.0.0.01\v.0.0.01\Browser.cs 中:第 69 行

这是我的代码:

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace v.0._0._01
{

    public static class WebBrowserExtensions
    {
        public static Task<Uri> DocumentCompletedAsync(this WebBrowser wb)
        {
            var tcs = new TaskCompletionSource<Uri>();
            WebBrowserDocumentCompletedEventHandler handler = null;
            handler = (_, e) =>
            {
                wb.DocumentCompleted -= handler;
                tcs.TrySetResult(e.Url);
            };
            wb.DocumentCompleted += handler;
            return tcs.Task;
        }
    }

    public partial class Browser : Form
    {

        public Browser()
        {
            InitializeComponent();
        }

        private async void button7_Click(object sender, EventArgs e)
        {

            webBrowser1.Navigate("https://company.crm4.dynamics.com/main.aspx?app=d365default&pagetype=entitylist&etn=opportunity");
            await webBrowser1.DocumentCompletedAsync(); // async magic
            HtmlElement fbLink = webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("mainContent").Document.GetElementById("quickFind_button_0"); ;
            fbLink.InvokeMember("click");

        }

    }

}

现在我也注意到了quickFind_text_0 and quickFind_button_0总是以相同的单词开头,但数字会像这样变化quickFind_text_1 and quickFind_button_1 or quickFind_text_2 and quickFind_button_2。但是,通过手动单击,一切都可以使用quickFind_text_0 and quickFind_button_0.


这是一个扩展方法,方便等待DocumentCompleted event:

public static class WebBrowserExtensions
{
    public static Task<Uri> DocumentCompletedAsync(this WebBrowser wb)
    {
        var tcs = new TaskCompletionSource<Uri>();
        WebBrowserDocumentCompletedEventHandler handler = null;
        handler = (_, e) =>
        {
            wb.DocumentCompleted -= handler;
            tcs.TrySetResult(e.Url);
        };
        wb.DocumentCompleted += handler;
        return tcs.Task;
    }
}

它可以这样使用:

private async void button1_Click(object sender, EventArgs e)
{

    webBrowser1.Navigate("https://company.crm4.dynamics.com/main.aspx");
    await webBrowser1.DocumentCompletedAsync(); // async magic
    HtmlElement fbLink = webBrowser1.Document.GetElementById("quickFind_button_0");
    fbLink.InvokeMember("click");
}

之后的行await将在页面加载完成后运行。


Update:这是等待特定元素出现在页面中的另一种扩展方法:

public static async Task<HtmlElement> WaitForElementAsync(this WebBrowser wb,
    string elementId, int timeout = 30000, int interval = 500)
{
    var stopwatch = Stopwatch.StartNew();
    while (true)
    {
        try
        {
            var element = wb.Document.GetElementById(elementId);
            if (element != null) return element;
        }
        catch { }
        if (stopwatch.ElapsedMilliseconds > timeout) throw new TimeoutException();
        await Task.Delay(interval);
    }
}

例如,可以在调用使用 XMLHttpRequest 修改页面的单击事件后使用它:

someButton.InvokeMember("click");
var mainContentElement = await webBrowser1.WaitForElementAsync("mainContent", 5000);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Windows.Forms.WebBrowser 等待页面完全加载 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler

随机推荐

  • 在基于打字稿的设置上运行续集播种机时出错

    我想在我的express api上使用sequelize播种机和迁移 目前所有模型都是使用打字稿编写的续集打字稿 我尝试使用打字稿添加我的第一个种子文件 但运行时出现错误 20221028050116 feeds ts播种文件 use st
  • xsd:choice 的 minOccurs 和 maxOccurs 的含义?

    有什么区别
  • Python 3 中具有列表理解的多行用户输入

    这里完全是 Python 新手 我正在使用 Python 3 解决 CodeAbbey 的问题 我希望得到帮助来缩短用户输入的代码 假设我想从用户那里获取以下输入 3 2 3 4 5 6 7 第一行是案例数 接下来的每一行都是案例本身 有
  • 如何在条形图中显示每个条形的条形值?

    需要查看条形图中的条代表的精确值 而不是 Y 轴上的近似值 这怎么可能做到呢 谢谢阅读 在 iReport 3 7 6 中 您只需选中 BarPlot 属性下的 显示标签 框即可 在之前的版本 3 1 4 中 我必须创建一个 ChartCu
  • Python - 英语翻译器

    用 Python 编写程序将英语单词和 或短语翻译成其他语言的最佳方法是什么 AJAX Language API 这是一个非常困难的问题 语言非常非常very复杂的 想想你必须做的所有事情 解析这个短语 弄清楚这些词的意思 然后翻译它们 这
  • 如何禁用 NSURLConnection 中的 keepalive?

    有什么办法可以强制NSURL连接不重复使用当前的持久连接但要创建一个新的 我正在努力保护自己免受这个已知的影响iOS8 保活错误 如果 iOS 8 收到带有 Keep Alive 标头的 HTTP 响应 它会保留此标头 连接稍后重用 应该如
  • 查找包含带有标签的子任务的家长问题

    我有一个 JIRA 项目 我的一些任务包含标签为 needDesign 的子任务 是否可以找到包含具有该标签的子任务的所有父任务 我使用ondemand jira版本 Jira JQL 并非不提供开箱即用的功能 但是有许多扩展 JQL 的附
  • javafx平台runlater返回结果

    我正在开发 JavaFX 应用程序 在我的场景中是显示在 JavaFX 中创建的密码提示 该提示需要带有两个选项的密码OK and Cancel 我已返回用户输入的密码 我的显示密码对话框的类别是 public static String
  • 如何在不使用 ++ 或 + 或其他算术运算符的情况下将两个数字相加

    如何在不使用 或 或任何其他算术运算符的情况下将两个数字相加 这是很久以前在一次校园面试中被问到的问题 不管怎样 今天有人问了一个关于一些位操作的问题 并在回答中给出了一个漂亮的指南斯坦福有点玩弄 这是我前段时间为了好玩而写的 它使用一个二
  • jquery®ex 的电话号码格式

    我需要验证任何输入 val 并将其转换为电话号码格式 即 input 呃 f375g25123435s67我需要转换成 375 25 1234567 keyup function newval this val replace D g ne
  • 为我的网站编写
    标记的正确方法,以提供我们公司的联系方式

    我正在使用 asp net mvc 5 构建一个网站 我想提供我们公司的联系方式 如电话 电子邮件 邮政地址等 所以我使用了
  • 如何将 NSString 初始化为带双引号的文本[重复]

    这个问题在这里已经有答案了 我想将 NSString 初始化为带双引号的 头发 可能吗 有什么帮助吗 但 NSString str hai 我想将其转换为 hai 而不直接初始化 有什么帮助吗 如果您想转换现有字符串 请使用以下命令 NSS
  • 将 R 中二项式 glm 的 cbind() 格式转换为具有单独行的数据帧

    按照此处的示例 R中二项式glm的输入格式 我有一个数据集y cbind success failure 每行代表一种治疗 我的问题是 如何将每个观察值转换为 二进制 格式 例如 每个观察值 y 0 或 1 工作示例在这里 df1 lt d
  • 使用 Retrofit 和 Gson 解析 JSON 数组响应

    这是来自 Web 服务的 JSONArray 响应 sponsors leg id NYL000067 type primary name AUBRY leg id NYL000171 type cosponsor name PERRY l
  • 如何修复 java.lang.NoSuchMethodError: sun.security.ssl.SSLSessionImpl

    应用程序通过读取jsf形式的参数来发送信件 我不明白为什么以及如何修复它 因为当您从开发环境运行时 一切正常 当我将应用程序放在 VPS 服务器上时 我收到下一个错误堆栈 尽管应用程序根据需要在本地主机上运行 StandardWrapper
  • 防止SQL注入的好方法有哪些? [复制]

    这个问题在这里已经有答案了 我必须为我的在职培训公司编写一个应用程序管理系统 前端将用 C 完成 后端将用 SQL 完成 我以前从未做过这种规模的项目 在学校里我们只学过有关 SQL 的基础课程 不知何故 我们的老师完全没有讨论SQL注入
  • 难道真的不能写一个在windows中隐藏密码的php cli密码提示吗?

    我花了几个小时试图找到一种在 php 中编写跨平台密码提示的方法 该提示隐藏用户输入的密码 虽然这可以通过使用 stty echo 在 Unix 环境中轻松完成 但我尝试了各种 passthru 和 system 调用方法来使 Window
  • Java-PLSQL-从java调用记录表

    PLSQL 包过程声明 TYPE custom type IS TABLE OF single rec type TYPE single rec type IS RECORD id name etc Problem 但custom type
  • 通过 Google Apps 脚本在日历上创建带有附件的活动

    我找不到向我的日历活动添加附件的方法 我希望应该有一个像下面的代码片段这样的简单方法 function createNewEvent var file DriveApp getFileById 1eqaThzYmTbZzP my file
  • System.Windows.Forms.WebBrowser 等待页面完全加载

    我一直在尝试很多不同的解决方案wait and async 似乎没什么作用 我无法找到实际上完全等待页面完全加载的解决方案 所有代码都在等待一段时间 但直到页面加载完毕 我在下一个过程中收到错误 我如何将示例代码设置为等待模式 直到Docu