c# - 如何使用 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);
}
解决方案
一种方法是WebClient
从System.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.Common
NuGet 包来拉入Bitmap
和ImageFormat
,但同样可以使用您选择的库以类似方式完成。
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);
推荐阅读
- javascript - 关于代码中的函数,我不知道它们的含义
- producer-consumer - 如何优化并行合并元素
- xml - akka http中的文件解析和持久化
- android - 进程“命令 'C:\Users\sneha\AppData\Local\Android\Sdk\build-tools\29.0.0\aidl.exe'' 以非零退出值 -1073741819 结束
- internet-explorer - IE - C#,如何将 JavaScript 文件注入网页?
- php - 如何从数组中检索元素 - PHP
- .net - 我可以将流读入包含 Unicode BOM 的字符串吗?
- php - 如何从我的数据库中获取一个值并在输入字段中使用和显示它?
- android - 如何从事件处理程序中获取调用者作为 Kotlin 中的对象
- wpf - 为什么 VS2017 WPF 应用程序属性给我错误?