如何确保 ExecuteScriptAsync 在 CefSharp 中执行

how to be sure that ExecuteScriptAsync is executed in CefSharp

我在 Windows Forms C# 应用程序中使用 CefSharp 组件。

我在 chromium 浏览器中加载我的页面,加载后,我使用 ExecuteScriptAsync 单击其中的一个按钮并关闭表单。

代码执行正常,但由于这种情况发生得很快,我如何确定页面中的按钮是否真的被点击了?

这是我的代码:

private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs args)
{
    if (!args.IsLoading)
    {
        chromeBrowser.ExecuteScriptAsync("document.getElementById('myButton').click();");
        form1.Close();
    }
}

谢谢。

正如文档中已经提到的,当您使用 ExecuteScriptAsync 时,脚本将异步执行,因此该方法 returns 在脚本实际执行之前。

而不是 ExecuteScriptAsync 立即 returns,使用 EvaluateScriptAsync 并等待呼叫。

如果您使用 EvaluateScriptAsync,脚本将异步执行,并且方法 returns 是一个封装脚本响应的任务。

例子

  1. 创建一个 Windows 表单应用程序。

  2. 使用配置管理器或从调试工具栏将配置设置为 x64 或 x86

  3. 安装 CefSharp.WinForms NuGet 包。

  4. 使用以下代码处理表单的Load事件:

    ChromiumWebBrowser browser;
    private void Form1_Load(object sender, EventArgs e)
    {
        browser = new ChromiumWebBrowser("http://www.google.com");
        browser.LoadingStateChanged += async (obj, args) =>
        {
            if (!args.IsLoading)
            {
                await browser.EvaluateScriptAsync("alert(Math.sin(Math.PI/2));");
                this.Invoke(new Action(() =>
                {
                    this.Close();
                }));
            }
        };
        this.Controls.Add(browser);
    }
    

    确保包括使用:

    using CefSharp;
    using CefSharp.WinForms;
    
  5. 运行 应用程序,您会看到表单将在显示警报后关闭,但是如果您使用 ExecuteScriptAsync,表单将立即关闭,您可以看不到警报。