以编程方式在网页上下载动态图片

时间:2018-07-05 10:07:37

标签: java selenium selenium-webdriver

我正在尝试下载每次加载都会改变的图像。 src标签上的img属性是不变的,尽管所显示的图像会发生变化(我猜Web应用程序每次点击都会在src处更改图像)。

我确实尝试使用src下载,并且返回的图像与预期的不同。

我的要求是下载当前页面上显示的图像。 我也尝试单击右键进行保存,但是在页面中禁用了右键单击。 有任何想法吗 ? 我正在使用selenium webdriver。也欢迎使用其他选项。

这是我使用src属性尝试的内容:

public static void download() {
    WebDriver driver = new ChromeDriver();
    driver.navigate().to("https://*******.com/");

    String url = driver.findElement(By.id("regImg")).getAttribute("src");

    // run of the mill code to download the image.
    downloadImage(url);
}

正如我说的那样,此代码有效,但是随着Web应用在每次点击时更改它,我得到了不同的图像。我需要页面上显示的那个。

这是HTML:

<td width="20%" align="center" class="style1">characters
    <font color="#FF0000">*</font>
    <img id="regImg" src="../../**/**.php" alt="captcha image" height="25">
</td>

2 个答案:

答案 0 :(得分:3)

如果您没有重新生成相同图像的选项,例如通过在测试中添加请求参数,您可以截取屏幕截图

File sreenshotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

并从屏幕截图中提取图像,如果您知道要查找的内容,这应该很容易。

或者根据this answer,您可以配置Selenium驱动程序以使用已知目录来存储浏览器数据,

ChromeOptions chromeProfile = new ChromeOptions();
chromeProfile.addArguments("user-data-dir=" + chromeProfilePath);
driver = new ChromeDriver(options);

,也许随机映像将保存在磁盘上chromeProfilePath下的某个位置。 It's possible but the process is complex

答案 1 :(得分:0)

这取决于您的图像是从与HTML相同的URL还是从另一个URL加载的。

您可以尝试通过JS将所有图像转换为数据对象:

driver.execute_script(
    'var c=document.createElement("canvas");'+
    'document.querySelectorAll("img").forEach(function(img){'+
       'c.width=img.naturalWidth;'+
       'c.height=img.naturalHeight;'+
       'c.getContext("2d").drawImage(img,0,0);img.src=c.toDataURL();'+
     '});'
);

然后使用您的downloadImage捕获它。

但是,如果您的图像托管在其他主机上-您将遇到CORS问题。这些问题可以通过添加CORS标头来解决

Access-Control-Allow-Origin "*"

使用Charly代理,如下所示:Add header to requests with Charles