You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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.Common NuGet 包(.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:00:53