cefsharp 执行 javascript

Posted

技术标签:

【中文标题】cefsharp 执行 javascript【英文标题】:cefsharp execute javascript 【发布时间】:2015-09-18 06:48:01 【问题描述】:

我想在 Windows 窗体中使用 CefSharp 执行 javascript 代码,但它不起作用。代码如下,没有显示消息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');");

【问题讨论】:

我用Nuget安装cefsharp,版本是41.0.0。 【参考方案1】:

在执行 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');");
  
;

【讨论】:

CefSharp 的下一个主要版本将在您的原始代码中抛出异常,以尝试自我记录,而不是默默地什么都不做。 更多详情请见github.com/cefsharp/CefSharp/wiki/… 最新见github.com/cefsharp/CefSharp/wiki/… 这里还有一个非常清晰的视频-> archive.org/details/…【参考方案2】:

我认为,在调用 html 中存在的 JavaScript 函数并传递输入参数的情况下,可以简单地使用 MainWindow 构造函数中的 Browser.LoadingStateChanged 事件来确保启动加载。此事件将在声明 HTML 文件的 Browser_Loaded 之后调用。以下是代码示例:

public MainWindow()
        
            InitializeComponent();

            //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.ExecuteScriptAsync("JavaScripFunctionName1", new object[]  arg1, arg2);
                
            ;
        

private void Browser_Loaded(object sender, RoutedEventArgs e)
        
            Browser.LoadHtml(File.ReadAllText(GetFilePath("YourHTMLFileName.html")));
        

但是,如果你想执行 JavaScript 代码并获得结果,你应该使用:

var result = await Browser.EvaluateScriptAsync("JavaScripFunctionName2", new object[]  );
MessageBox.Show(result.Result.ToString());

在 HTML 中:

<html>
<body>
    <script>
        function JavaScripFunctionName1(arg1, arg2)
        
            // something here
        

        function JavaScripFunctionName2()
        
            // something here
            return result;
                
    </script>
</body>
</html>

【讨论】:

以上是关于cefsharp 执行 javascript的主要内容,如果未能解决你的问题,请参考以下文章

C# 的cefsharp 里的ChromiumWebBrowser执行js

.Net(C#) CefSharp Chrome 浏览器控件后台执行Iframe中的Js代码的方法

cefsharp轮询执行js判断控件是不是已加载

等待页面加载 CefSharp

CefSharp 运行 JavaScript

CefSharp 与 JS 相互调用