cefsharp执行javascript

Pei*_*sai 15 javascript c# chromium-embedded cefsharp

我想JavaScript通过CefSharp在Windows窗体中使用来执行代码,但它不起作用.代码如下,并且test不显示消息.我错过了什么?

var browser = new ChromiumWebBrowser("http://localhost:50056/simple.aspx");
browser.Name = "Simple Page";
browser.Dock = DockStyle.Fill;            
this.Controls.Add(browser);
browser.ExecuteScriptAsync("alert('test');");
Run Code Online (Sandbox Code Playgroud)

ama*_*and 22

在执行JavaScript之前,您必须等待浏览器充分加载.开始尝试访问OnFrameLoadStart中的DOM很有诱惑力,而V8Context已经创建,您将能够执行DOM未完成加载的脚本.如果你需要尽可能早地访问DOM,那么订阅DOMContentLoaded,下面是一些执行JavaScript的例子

browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();

public class RenderProcessMessageHandler : IRenderProcessMessageHandler
{
  // Wait for the underlying JavaScript Context to be created. This is only called for the main frame.
  // If the page has no JavaScript, no context will be created.
  void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
  {
    const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";

    frame.ExecuteJavaScriptAsync(script);
  }
}

//Wait for the page to finish loading (all resources will have been loaded, rendering is likely still happening)
browser.LoadingStateChanged += (sender, args) =>
{
  //Wait for the Page to finish loading
  if (args.IsLoading == false)
  {
    browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");
  }
}

//Wait for the MainFrame to finish loading
browser.FrameLoadEnd += (sender, args) =>
{
  //Wait for the MainFrame to finish loading
  if(args.Frame.IsMain)
  {
    args.Frame.ExecuteJavaScriptAsync("alert('MainFrame finished loading');");
  }
};
Run Code Online (Sandbox Code Playgroud)

  • `CefSharp`的下一个主要版本将使用您的原始代码抛出异常,以尝试自我记录而不是默默无所事事. (4认同)
  • https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#CallJS中的更多详细信息 (2认同)