首页 > 解决方案 > 如何使用 Selenium Webdriver 和 C# 保存图像?

问题描述

我需要在 C# 应用程序中使用 Selenium Webdriver 在网站上保存图像,但是我无法做到这一点。到目前为止,我发现的选项不起作用。
请问有什么解决办法吗?
谢谢。
我测试的选项之一是使用gravity.code 扩展

using System.IO;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Extensions;

driver = new ChromeDriver(driverService, opts);
          driver.Navigate().GoToUrl("https://rd1.com.br/fora-da-globo-fausto-silva-recusa-convite-do-canal-para-homenagem/");

          try
          {
             string ImageLink = "//*[@id='post-1163172']/div[8]/ul/li[2]/div[1]/a/img";
             // from element attribute
             var element = driver.FindElement(By.XPath(ImageLink)).DownloadResource(path: @"C:\temp\a.png", attribute: "src");

             // from element text
             var element2 = driver.FindElement(By.XPath(ImageLink)).DownloadResource(path: @"C:\temp\b.png");
          }
          catch (Exception ex)
          {
             Console.WriteLine(ex.Message);
          }

标签: c#selenium-webdriverselenium-chromedriver

解决方案


一种方法是WebClientSystem.Net命名空间使用:

string ImageLink = "//*[@id='post-1163172']/div[8]/ul/li[2]/div[1]/a/img";

// Find the image element using xpath or other selector
var element = driver.FindElement(By.XPath(ImageLink));

// Get the value of the src attribute from the image element
var imageSrc = element.GetAttribute("src");

// Download the image file from the src URI
using (var client = new System.Net.WebClient())
{
    client.DownloadFile(imageSrc, @"C:\temp\a.png");
}

using System.Net;这可以通过在文件顶部添加来简化一点,如果使用 C# 8 或更高版本,则省略using (var client = new WebClient())块的大括号。

更新

保留来自 WebDriver 的会话以将图像数据读入数据 URL(base 64 表示)并写入本地文件。请注意,这将丢失图像中的所有 exif/元数据,因为它只读取视觉数据。

此示例使用System.Drawing.CommonNuGet 包来拉入BitmapImageFormat,但同样可以使用您选择的库以类似方式完成。

string ImageLink = "//*[@id='post-1163172']/div[8]/ul/li[2]/div[1]/a/img";

// Create dataurl base64 string
var dataUrl = driver.ExecuteScript(@$"
    var c = document.createElement('canvas');
    var ctx = c.getContext('2d');
    var img = document.evaluate(""{ImageLink}"", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    c.height=img.naturalHeight;
    c.width=img.naturalWidth;
    ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);
    var base64String = c.toDataURL();
    return base64String;
    ") as string;

// Write the image data out to a file
var base64 = dataUrl.Split(',').Last();
using var stream = new MemoryStream(Convert.FromBase64String(base64));
using var bitmap = new Bitmap(stream);
bitmap.Save(@"C:\temp\a.png", ImageFormat.Png);

推荐阅读