























在前面的文章中,我介绍过CEFSharp,
CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。
CEFSharp就是CEF的C#移植版本。
CEFSharp提供了一个headless(无头模式)版本。
所谓无头模式(Headless Mode),就是浏览器不显示 GUI 界面,后台完整运行渲染引擎与 JS 引擎,适合服务器 / 自动化场景。
这里提供了一个CefSharp.OffScreen包,基础使用步骤如下:
1、创建一个控制台项目,nuget安装CefSharp.OffScreen包

注意:截止最新稳定版 147.0.100,CEFSharp.OffScreen.NETCore包仅支持.NET 6.0-windows版本,后续 不知道会不会支持.NET 6.0以上版本
2、项目属性 → 首选 32 位 / 64 位一致

3、 设置为 STA 线程
1 class Program 2 { 3 [STAThread] 4 static async Task Main(string[] args) 5 { 6 7 } 8 }
4、基础使用代码如下
private static void BindBrowserEvent()
{
// 页面加载完成
_browser.LoadCompleted += (s, e) =>
{
Console.WriteLine($"页面加载完成:{e.Url} 状态:{e.HttpStatusCode}");
};
// 渲染画面回调(每一帧都会触发)
_browser.Paint += (s, e) =>
{
// e.Bitmap 就是当前网页截图
if (e.Bitmap != null)
{
// 只保存一次,避免频繁保存
static bool saved = false;
if (!saved)
{
e.Bitmap.Save("网页截图.png");
saved = true;
Console.WriteLine("截图已保存");
}
}
};
// JS控制台日志捕获
_browser.ConsoleMessage += (s, e) =>
{
Console.WriteLine($"JS日志:{e.Message}");
};
}
/// <summary>
/// 等待页面加载完成
/// </summary>
private static Task LoadUrlAsync(string url)
{
var tcs = new TaskCompletionSource<bool>();
void LoadComplete(object sender, LoadCompletedEventArgs e)
{
_browser.LoadCompleted -= LoadComplete;
tcs.SetResult(true);
}
_browser.LoadCompleted += LoadComplete;
_browser.Load(url);
return tcs.Task;
}
private static async Task RunAllDemoFunc()
{
// 1. 执行JS获取返回值
var jsResult = await _browser.EvaluateScriptAsync("document.title");
if (jsResult.Success)
{
Console.WriteLine("网页标题:" + jsResult.Result);
}
// 2. 点击页面元素(坐标点击)
// x,y 网页相对坐标
_browser.BrowserHost.SendMouseClickEvent(
x: 120, y: 120,
mouseButtonType: MouseButtonType.Left,
mouseUp: false, clickCount: 1);
await Task.Delay(200);
_browser.BrowserHost.SendMouseClickEvent(
120, 120, MouseButtonType.Left, true, 1);
// 3. 输入键盘内容
_browser.BrowserHost.SendKeyEvent(KeyEventType.KeyDown, (int)Keys.H);
_browser.BrowserHost.SendKeyEvent(KeyEventType.Char, 'H');
_browser.BrowserHost.SendKeyEvent(KeyEventType.KeyUp, (int)Keys.H);
// 4. 网页后退/前进/刷新
_browser.Back();
_browser.Forward();
_browser.Reload();
// 5. 导出网页为PDF
var pdfSettings = new PdfPrintSettings
{
Landscape = false,
PrintBackground = true
};
await _browser.PrintToPdfAsync("网页导出.pdf", pdfSettings);
Console.WriteLine("PDF导出完成");
// 6. 设置Cookie
var cookieManager = Cef.GetGlobalCookieManager();
cookieManager.SetCookie("https://baidu.com", new Cookie
{
Name = "testCookie",
Value = "123456",
Domain = ".baidu.com"
});
// 7. 获取当前URL
Console.WriteLine("当前地址:" + _browser.Address);
}
[STAThread],否则渲染卡死、无画面ChromiumWebBrowser 一定要Dispose(),最后Cef.Shutdown()CefSharp.OffScreen 112+ 版本[STAThread]
static void ScreenshotDemo()
{
var settings = new CefSettings { DisableGpu = true };
Cef.Initialize(settings);
using var browser = new ChromiumWebBrowser("https://www.qq.com", 1024, 768);
browser.LoadCompleted += (s, e) =>
{
Task.Delay(1000).Wait();
};
browser.Paint += (s, e) =>
{
e.Bitmap?.Save("QQ截图.jpg");
Console.WriteLine("截图完成");
};
System.Threading.Thread.Sleep(3000);
browser.Dispose();
Cef.Shutdown();
}
EvaluateScriptAsync 执行 JSSendMouseClickEvent 模拟点击SendKeyEvent 模拟键盘PrintToPdfAsync 导出 PDFLoadHtml 直接加载本地 HTMLZoomLevel 网页缩放https://www.cnblogs.com/zhaotianff/p/13528507.html
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。