我正在尝试下载每次加载都会改变的图像。
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>
答案 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