.NET6环境下Selenium全屏截图替代方案求助
.NET6 下 WebDriver 全屏截图实现方案
方案一:原生 API 手动滚动拼接(无第三方依赖)
完全基于 Selenium 和 .NET 自带绘图能力实现,规避第三方包漏洞风险。
实现步骤
- 获取页面总高度与视口高度
- 分段滚动页面,截取每段视口截图
- 将所有截图拼接为完整全屏图片
代码示例
using OpenQA.Selenium; using System.Drawing; using System.Drawing.Imaging; using System.Threading; public static Bitmap CaptureFullPageScreenshot(IWebDriver driver) { // 获取页面与视口尺寸 var totalHeight = (int)(long)driver.ExecuteScript("return document.body.scrollHeight"); var viewportHeight = (int)(long)driver.ExecuteScript("return window.innerHeight"); var viewportWidth = driver.Manage().Window.Size.Width; var currentY = 0; // 初始化全屏画布 var fullPageImage = new Bitmap(viewportWidth, totalHeight); using (var graphics = Graphics.FromImage(fullPageImage)) { while (currentY < totalHeight) { // 滚动到当前位置 driver.ExecuteScript($"window.scrollTo(0, {currentY});"); // 等待页面渲染稳定 Thread.Sleep(500); // 截取当前视口截图 var screenshot = ((ITakesScreenshot)driver).GetScreenshot(); using (var currentImage = new Bitmap(new MemoryStream(screenshot.AsByteArray))) { // 绘制到全屏画布对应位置 graphics.DrawImage(currentImage, 0, currentY); } currentY += viewportHeight; // 处理最后一段不足视口高度的情况 if (currentY + viewportHeight > totalHeight) { currentY = totalHeight - viewportHeight; } } } return fullPageImage; } // 使用示例 var fullScreenshot = CaptureFullPageScreenshot(_driver); fullScreenshot.Save("fullpage.png", ImageFormat.Png);
注意事项
- 需安装
System.Drawing.CommonNuGet 包(.NET6 官方支持 System.Drawing 的包) - 若页面存在固定定位元素(如顶部导航栏),可临时隐藏避免重复:
// 滚动前隐藏固定元素 driver.ExecuteScript("document.querySelectorAll('header, [style*=\"position: fixed\"]').forEach(el => el.style.display = 'none');"); // 截图后恢复 driver.ExecuteScript("document.querySelectorAll('header, [style*=\"position: fixed\"]').forEach(el => el.style.display = '');");
方案二:基于最新版 Magick.NET 实现拼接
直接使用修复漏洞后的最新版 Magick.NET,自行实现截图拼接逻辑,无需依赖第三方扩展包。
代码示例
using OpenQA.Selenium; using ImageMagick; using System.Threading; public static void CaptureFullPageWithMagick(IWebDriver driver, string outputPath) { var totalHeight = (int)(long)driver.ExecuteScript("return document.body.scrollHeight"); var viewportHeight = (int)(long)driver.ExecuteScript("return window.innerHeight"); var viewportWidth = driver.Manage().Window.Size.Width; var currentY = 0; using (var fullPageImage = new MagickImage(MagickColors.Transparent, viewportWidth, totalHeight)) { while (currentY < totalHeight) { driver.ExecuteScript($"window.scrollTo(0, {currentY});"); Thread.Sleep(500); var screenshot = ((ITakesScreenshot)driver).GetScreenshot(); using (var currentImage = new MagickImage(screenshot.AsByteArray)) { // 将当前截图合成到全屏图片对应位置 fullPageImage.Composite(currentImage, 0, currentY, CompositeOperator.Over); } currentY += viewportHeight; if (currentY + viewportHeight > totalHeight) { currentY = totalHeight - viewportHeight; } } fullPageImage.Write(outputPath, MagickFormat.Png); } } // 使用示例 CaptureFullPageWithMagick(_driver, "fullpage_magick.png");
注意事项
- 直接安装最新版
Magick.NET-Q8-AnyCPU或Magick.NET-Q16-AnyCPU,避免使用漏洞版本 7.9.0
方案三:DevTools API 直接生成全屏截图(Chrome/Firefox 专属)
利用浏览器 DevTools 原生的全屏截图能力,无需手动拼接,效果最优。
代码示例(Chrome)
using OpenQA.Selenium.Chrome; using System; using System.IO; using System.Threading.Tasks; public static async Task CaptureFullPageWithDevTools(ChromeDriver driver, string outputPath) { var devTools = driver.DevTools; await devTools.Page.EnableAsync(); // 调用浏览器全屏截图API var screenshotResponse = await devTools.Page.CaptureScreenshotAsync(new OpenQA.Selenium.DevTools.Page.CaptureScreenshotCommandSettings { CaptureBeyondViewport = true, FromSurface = true }); // 保存Base64格式的截图 var imageBytes = Convert.FromBase64String(screenshotResponse.Data); File.WriteAllBytes(outputPath, imageBytes); await devTools.Page.DisableAsync(); } // 使用示例(需异步调用) await CaptureFullPageWithDevTools((ChromeDriver)_driver, "fullpage_devtools.png");
注意事项
- 仅支持 ChromeDriver、FirefoxDriver 等支持 DevTools 的浏览器
- 代码需在异步方法中执行,或使用
.GetAwaiter().GetResult()同步调用(不推荐,可能引发死锁)
内容的提问来源于stack exchange,提问作者THFC-Dude-14
相关产品推荐
相关产品推荐

