Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cefsharp execute javascript

Tags:

I want to execute JavaScript code by using CefSharp in Windows Forms, but it does not work. The code is as following, and the message test is not shown. Did I miss something?

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');"); 
like image 253
Pei-Chun Tsai Avatar asked Jul 01 '15 08:07

Pei-Chun Tsai


1 Answers

You must wait for the browser to have sufficiently loaded before executing JavaScript. It's tempting to start trying to access the DOM in OnFrameLoadStart, whilst the V8Context will have been created and you will be able to execute a script the DOM will not have finished loading. If you need to access the DOM at its earliest possible point, subscribe to DOMContentLoaded.

Some examples of executing JavaScript are below.

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');");   } }; 
like image 116
amaitland Avatar answered Sep 28 '22 19:09

amaitland