使用selenium从页面保存图像

Fid*_*del 5 c# selenium download selenium-chromedriver

我正在使用Selenium和谷歌Chrome驱动程序以编程方式打开页面.在每个页面上都有一个动态生成的图像,我想下载它.目前,我正在等待页面完成加载,然后我抓取图像URL并使用System.Net.WebClient下载它.

这工作正常,除了我下载图像两次 - 一次在浏览器中,一次使用WebClient.问题是每个图像大约是15MB,下载两次很快就会增加.

那么 - 是否可以直接从谷歌浏览器中获取图像?

meh*_*cek 12

一种方法是使用webdriver执行的javascript获取图像的base64字符串.然后,您可以将图像的base64string保存到文件.

基本上,如果你的形象是

<img id='Img1' src='someurl'>
Run Code Online (Sandbox Code Playgroud)

然后你就可以转换它了

var base64string = driver.ExecuteScript(@"
    var c = document.createElement('canvas');
    var ctx = c.getContext('2d');
    var img = document.getElementById('Img1');
    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;

var base64 = base64string.Split(',').Last();
using (var stream = new MemoryStream(Convert.FromBase64String(base64)))
{
    using (var bitmap = new Bitmap(stream))
    {
        var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ImageName.png");
        bitmap.Save(filepath, ImageFormat.Png);
    }
}
Run Code Online (Sandbox Code Playgroud)


TH *_*rov 6

是的,您可以通过几个步骤执行此操作:

  1. 获取网页的屏幕截图并将其保存到磁盘
  2. 找到图像元素
  3. 找到图像元素的位置,宽度和高度
  4. 从您在步骤1中截取的屏幕截图中裁剪所需的图像
  5. 将图像保存到磁盘(或使用它执行其他操作)

示例代码 - 请添加您的代码以捕获异常

        IWebDriver driver = new ChromeDriver();

        //replace with the page you want to navigate to
        string your_page = "https://www.google.com"; 
        driver.Navigate().GoToUrl(your_page);

        ITakesScreenshot ssdriver = driver as ITakesScreenshot;
        Screenshot screenshot = ssdriver.GetScreenshot();

        Screenshot tempImage = screenshot;

        tempImage.SaveAsFile(@"C:\full.png", ImageFormat.Png);

        //replace with the XPath of the image element
        IWebElement my_image = driver.FindElement(By.XPath("//*[@id=\"hplogo\"]/canvas[1]"));

        Point point = my_image.Location;
        int width = my_image.Size.Width;
        int height = my_image.Size.Height;

        Rectangle section = new Rectangle(point, new Size(width, height));
        Bitmap source = new Bitmap(@"C:\full.png");
        Bitmap final_image = CropImage(source, section);

        final_image.Save(@"C:\image.jpg");
Run Code Online (Sandbox Code Playgroud)

CropImage方法由James Hill发布, 如何在C#中剪切图像的一部分

但为了清楚起见,我也会在这里添加它

    public Bitmap CropImage(Bitmap source, Rectangle section)
    {
        Bitmap bmp = new Bitmap(section.Width, section.Height);
        Graphics g = Graphics.FromImage(bmp);
        g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel);
        return bmp;
    }
Run Code Online (Sandbox Code Playgroud)


Fid*_*del 2

您可以使用此技术阻止在 Google Chrome 中下载图像。它运行一个名为“Block Image”的 Google Chrome 扩展。这样就不会使用 chrome 下载图像,只需使用其 URL 和 System.Net.WebClient 正常下载图像即可。