如何使用Selenium(任何版本)下载图像?

Ali*_*ehi 23 selenium webdriver

我想知道,如何使用selenium/webdriver下载页面的图像.假设需要用户会话来下载图像,因此具有纯URL是没有用的.任何示例代码都非常受欢迎.

cod*_*iot 19

我更喜欢做这样的事情:

1. Get the SRC attribute of the image.
2. Use ImageIO.read to read the image onto a BufferedImage
3. Save the BufferedImage using ImageIO.write function
Run Code Online (Sandbox Code Playgroud)


jas*_*ero 11

是一个适用于Firefox和Chrome的技巧,基本上让Selenium只用图像打开一个新的浏览器,然后用Ctrl + S下载它.

另一种选择是模拟右键单击并使用此处的上下文菜单


sam*_*son 6

我喜欢这样:

 WebElement logo = driver.findElement(By.cssSelector(".image-logo"));
 String logoSRC = logo.getAttribute("src");

 URL imageURL = new URL(logoSRC);
 BufferedImage saveImage = ImageIO.read(imageURL);

 ImageIO.write(saveImage, "png", new File("logo-image.png"));
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试以下操作

JavascriptExecutor js = (JavascriptExecutor) driver;                              
String base64string = (String) js.executeScript("var c = document.createElement('canvas');"
                       + " var ctx = c.getContext('2d');"
                       + "var img = document.getElementsByTagName('img')[0];"
                       + "c.height=img.naturalHeight;"
                       + "c.width=img.naturalWidth;"
                       + "ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);"
                       + "var base64String = c.toDataURL();"
                       + "return base64String;");
String[] base64Array = base64string.split(",");

String base64 = base64Array[base64Array.length - 1];

byte[] data = Base64.decode(base64);

ByteArrayInputStream memstream = new ByteArrayInputStream(data);
BufferedImage saveImage = ImageIO.read(memstream);

ImageIO.write(saveImage, "png", new File("path"));
Run Code Online (Sandbox Code Playgroud)


abo*_*021 5

对于我的用例,存在 cookie 和其他问题,使得这里的其他方法不适合。

我最终使用 XMLHttpRequest 来填充 FileReader (来自How to conversion image into base64 string using javascript,然后使用 Selenium 调用它ExecuteAsyncScript(如Selenium 和异步 JavaScript 调用中所示)。这使我能够获得直接的数据 URL向前解析。

这是我用于获取数据 URL 的 C# 代码:

public string ImageUrlToDataUrl(IWebDriver driver, string imageUrl)
{
  var js = new StringBuilder();
  js.AppendLine("var done = arguments[0];"); // The callback from ExecuteAsyncScript
  js.AppendLine(@"
    function toDataURL(url, callback) {
      var xhr = new XMLHttpRequest();
      xhr.onload = function() {
        var reader = new FileReader();
        reader.onloadend = function() {
          callback(reader.result);
        }
        reader.readAsDataURL(xhr.response);
      };
      xhr.open('GET', url);
      xhr.responseType = 'blob';
      xhr.send();
    }"); // XMLHttpRequest -> FileReader -> DataURL conversion
  js.AppendLine("toDataURL('" + imageUrl + "', done);"); // Invoke the function

  var executor = (IJavaScriptExecutor) driver;
  var dataUrl = executor.ExecuteAsyncScript(js.ToString()) as string;
  return dataUrl;
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

44920 次

最近记录:

6 年,4 月 前