将“about:blank”传递给ChromiumWebBrowser的构造函数时,未创建V8Context

问题描述 投票:2回答:1

重现这一点的步骤非常简单。只需使用nuget下载最新版本的CefSharp.WinForms(57.0.0),然后在表单中添加一个按钮和此代码:

public partial class Form1 : Form
{
    ChromiumWebBrowser WebBrowser;

    public Form1()
    {
        InitializeComponent();
        WebBrowser = new ChromiumWebBrowser("about:blank");
        panel1.Controls.Add(WebBrowser);
        WebBrowser.Dock = DockStyle.Fill;
    }

    private void testButton_Click(object sender, EventArgs e)
    {
        MessageBox.Show(WebBrowser.CanExecuteJavascriptInMainFrame.ToString());
    }
}

然后运行应用程序,等待几秒钟以确保已加载“about:blank”并按下testButton。消息框将显示False。事实上,如果我尝试使用EvaluateScriptAsync,我会得到一个异常,告诉我尚未创建上下文。

解决这个问题的一种方法是调用ShowDevTools,它似乎以某种方式强制创建一个上下文。另一种解决方案是导航到非本地页面,例如Google。在这种情况下,即使我回到“about:blank”,我也可以运行脚本。我尝试使用在CefSettings.RegisterScheme注册的自定义方案,但导航到我的自定义页面仍然没有创建上下文(我尝试将“about:blank”传递给构造函数,然后导航到我的自定义方案,反之亦然,没有工作)。

那么,是否可以让CefSharp创建上下文而无需导航到非本地页面或显示DevTools?

c# chromium-embedded cefsharp
1个回答
1
投票

您必须使用以下功能:

WebBrowser.GetMainFrame().ExecuteJavaScriptAsync(string code);

WebBrowser.GetMainFrame().EvaluateScriptAsync(string code);

这绕过了V8Context的常规检查。

来自CefSharp的更多信息,发现here

对于不包含JavaScript的帧,则不会创建V8Context。帧加载后执行脚本可以创建V8Context。

您可以使用browser.GetMainFrame().ExecuteJavaScriptAsync(script)browser.GetMainFrame().EvaluateScriptAsync绕过这些检查。

© www.soinside.com 2019 - 2024. All rights reserved.