CefSharp访问和操纵页面上的内容,可以以编程方式执行 JavaScript 并将其嵌入到页面中,并在触发JavaScript事件时接收回调。您可以使用CefSharp显示使用HTML5构建的嵌入式UI,或显示远程Web内容和Web应用程序。Google Chrome浏览器可以使用很多命令行(CommandLine)配置,有些更改功能的行为,而另一些则用于调试或试验。本文主要介绍.NET(C#)中, 使用CefSharp时一些常见的错误和获取 Javascript(js)方法返回的结果的方法及示例代码。

1、使用CefSharp常见错误

1) 下载CefSharp master zip code文件编译报错

下载地址https://codeload.github.com/cefsharp/CefSharp/zip/master
原因:可能由于编译路径存在中文导致。

2) 无法创建新的堆栈防护页面

可能是由于 进程“CefSharp.BrowserSubprocess.exe”没有正常结束掉,一直占用内存增加。

3) 结束浏览器后,CefSharp.BrowserSubprocess.exe进行无法结束

需要确保,创建浏览器的线程和调用Cef.ShutDown();的线程确保在同一个线程中进行操作。 如果是主线程创建。关闭程序后BrowserSubprocess进程可以直接退出。 如果是非主线程,需要在创建浏览器,即:把浏览器绑定到控件的线程,调用shutdown方法。

2、获取 Javascript(js)方法返回的结果

如果需要获取返回值的代码,使用 Task<JavascriptResponse> EvaluateScriptAsync(string script, TimeSpan? timeout) 方法。 JavaScript代码是异步执行的,因此使用.NET Task 类返回一个响应,其中包含错误消息,结果和一个成功(bool)标志。

/ Get Document Height  
var task = frame.EvaluateScriptAsync("(function() { var body = document.body, html = document.documentElement; return Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); })();", null);
task.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
}
}, TaskScheduler.FromCurrentSynchronizationContext());

或者

browser.LoadingStateChanged += OnLoadingStateChanged;
//A very basic example
private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs args)
{
	//Wait for the Page to finish loading
	if (args.IsLoading == false)
	{
		//Reccomended to use an anon closure
		const string script = @"(function()
    					{
	    					return 1 + 1;
    					})();";
		browser.EvaluateScriptAsync(script).ContinueWith(x =>
		{
			var response = x.Result;
			if (response.Success && response.Result != null)
			{
				var onePlusOne = (int)response.Result;
				//Do something here (To interact with the UI you must call BeginInvoke)
			}      
		});
	}
}

Notes

1) 脚本是在 Frame 级别执行,永远页面至少有一个Frame( MainFrame )
2) 只能返回一般的值(如int,bool,string等) - 不能返回自己定义的复杂(用户定义)类型。因为不能将随机的JavaScript对象暴露给.NET ,至少现在还不能,但可以将要返回到.NET代码的Javascript对象转换为JSON对象,使用 JSON.toStringify() 方法转化为JSON字符串,并将该字符串返回到您的.NET代码。然后,可以将该字符串反序化(JSON.NET).NET对象。有关更多信息,请参阅此MSDN链接。 (https://msdn.microsoft.com/library/cc836459(v=vs.94).aspx)

相关文档:

https://github.com/cefsharp/CefSharp/wiki/Quick-Start

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

.NET(C#) cefsharp 设置浏览器默认语言和userAgent及示例代码

.NET(C#) CefSharp CommandLine开关参数配置和读取网页源代码方法及示例代码

.NET(C#) CefSharp 下载获取页面中指定的文件图片视频等内容(.jpg、.js等)

.NET(C#) CefSharp 处理设置读取网站页面请求中的Cookie

.NET(C#) CefSharp 执行JS(JavaScript)代码及资源清理方法