将 "about:blank" 传递给 ChromiumWebBrowser 的构造函数时未创建 V8Context
V8Context not created when passing "about:blank" to ChromiumWebBrowser's constructor
重现这个的步骤非常简单。只需使用 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" 传递给构造函数,然后导航到我的自定义方案,反之亦然也 none 成功了)。
那么,是否可以让 CefSharp 创建上下文而无需导航到非本地页面或显示 DevTools?
您将不得不使用以下功能:
WebBrowser.GetMainFrame().ExecuteJavaScriptAsync(string code);
WebBrowser.GetMainFrame().EvaluateScriptAsync(string code);
这会绕过 V8Context
的常规检查。
来自 CefSharp 的更多信息,发现 here:
For frames that do not contain JavaScript then no V8Context will be created. Executing a script once the frame has loaded it's possible to create a V8Context.
You can use browser.GetMainFrame().ExecuteJavaScriptAsync(script)
or browser.GetMainFrame().EvaluateScriptAsync
to bypass these checks.
重现这个的步骤非常简单。只需使用 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" 传递给构造函数,然后导航到我的自定义方案,反之亦然也 none 成功了)。
那么,是否可以让 CefSharp 创建上下文而无需导航到非本地页面或显示 DevTools?
您将不得不使用以下功能:
WebBrowser.GetMainFrame().ExecuteJavaScriptAsync(string code);
WebBrowser.GetMainFrame().EvaluateScriptAsync(string code);
这会绕过 V8Context
的常规检查。
来自 CefSharp 的更多信息,发现 here:
For frames that do not contain JavaScript then no V8Context will be created. Executing a script once the frame has loaded it's possible to create a V8Context.
You can use
browser.GetMainFrame().ExecuteJavaScriptAsync(script)
orbrowser.GetMainFrame().EvaluateScriptAsync
to bypass these checks.