Playwright是C#网页截图更优选择,因启动快、免装浏览器、无头渲染精准;需用WaitForLoadStateAsync确保加载完成,SetViewportSizeAsync设视口,FullPage=true截长图但耗内存,仅支持png/jpeg格式。

Playwright 截图最简可行方案
Playwright 是目前 C# 做网页截图更推荐的选择:启动快、无需外部浏览器安装、支持无头渲染且截图精度高。关键在于 Page.ScreenshotAsync() 的调用时机和参数控制。
- 必须等页面加载完成再截图,推荐用
await page.WaitForLoadStateAsync("networkidle"),比WaitForTimeoutAsync(2000)更可靠 -
FullPage参数设为true可截长图,但内存占用明显上升,动态内容(如懒加载)可能未触发 - 截图前建议显式设置视口:
await page.SetViewportSizeAsync(1920, 1080),否则默认尺寸可能过小导致布局错乱 - 导出格式仅支持
"png"(默认)和"jpeg",Quality参数仅对 jpeg 生效
using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true });
var page = await browser.NewPageAsync();
await page.GotoAsync("https://example.com");
await page.WaitForLoadStateAsync("networkidle");
await page.ScreenshotAsync(new PageScreenshotOptions { Path = "screenshot.png", FullPage = true });
Selenium 截图常见失败原因
Selenium 在 C# 中截图容易卡在“白屏”或只截到空白页,根本原因是驱动未同步页面渲染状态。它不自动等待 DOM 就绪,也不处理 JS 懒加载。
-
driver.GetScreenshot().SaveAsFile()必须在driver.Manage().Window.Maximize()之后调用,否则窗口太小会截不到主体内容 - 不能依赖
Thread.Sleep()等待,应改用WebDriverWait+ExpectedConditions.ElementIsVisible()锁定关键元素 - ChromeDriver 需匹配 Chrome 版本,否则
OpenQA.Selenium.WebDriverException: unknown error: cannot determine loading status频发 - 截长图需滚动+拼接,Selenium 原生不支持
FullPage,得手动计算高度、分段截图再合成(非常易错)
Playwright vs Selenium:关键参数与性能差异
两者 API 表面相似,但底层行为差异直接影响截图成功率。
- 超时控制:
Page.ScreenshotAsync()默认 30 秒超时;Selenium 的GetScreenshot()不带超时,依赖整个 driver 超时设置 - 缩放影响:Playwright 默认禁用缩放(
IgnoreHttpsErrors = true可绕过证书问题);Selenium 若页面有transform: scale(),截图会模糊或偏移 - CPU 占用:Playwright 启动单个 Chromium 实例即可并发多页;Selenium 每个
ChromeDriver实例独占一个浏览器进程,批量截图时内存飙升更快 - Linux 服务器部署:Playwright 自带二进制,
dotnet publish后直接运行;Selenium 必须额外部署匹配的chromedriver并确保DISPLAY或使用Xvfb
截图后处理:文件大小与清晰度取舍
生成的 PNG 文件常远大于预期,尤其含大量文字或抗锯齿图形时。这不是代码错误,而是渲染引擎默认行为。
- Playwright 截图无法直接压缩 PNG,但可先保存为
jpeg(Quality = 85是视觉与体积平衡点) - 若必须用 PNG 且需减小体积,截图后用
System.Drawing或ImageSharp二次压缩——但注意 .NET 6+ Linux 下System.Drawing有兼容性风险 - 文字边缘发虚?检查是否启用了
EmulateMediaOptions中的ReducedMotion或ColorScheme,某些 CSS 媒体查询会关闭字体平滑 - 截图含闪烁/重影?说明页面有持续动画(如 loading spinner),应在截图前执行
await page.AddScriptTagAsync(new PageAddScriptTagOptions { Content = "document.querySelectorAll('*').forEach(e => e.style.animation = 'none')" })
实际项目中,多数“截图失败”不是因为选错库,而是没确认页面是否真正静止——比如 React/Vue 的 hydration 完成、第三方统计脚本加载完毕、或者 Web Font 渲染结束。这些状态 Playwright 能部分感知,Selenium 几乎完全靠猜。










