使用Selenium和Firefox保存图像

9 投票
5 回答
10232 浏览
提问于 2025-04-15 11:22

我正在尝试使用Selenium服务器和Python客户端从一个网站保存一张图片。我知道这张图片的URL,但我找不到保存它的代码,无论是当它在文档中,还是当它嵌入在当前的浏览器会话中。

到目前为止,我找到的解决办法是保存页面的截图(Selenium有两个方法可以做到这一点),但我想要的是原始的图片。

我不介意尝试点击菜单选项等等,但我找不到方法。

谢谢

5 个回答

2

我之前也想做同样的事情,但我想抓取的图片大小和我的显示器一样(壁纸),所以用截图的方法对我来说不管用。我找到了一种方法来解决这个问题……

我设置了selenium,让它打开我想要的页面(这样可以获取所有会话信息)。然后我用了一个叫“Workspace Macro”的程序来循环执行selenium的任务。

你可以从这里获取这个程序 http://www.tethyssolutions.com/product.htm -- 他们有一个试用版,我记得可以用30次左右。

下面是具体步骤:

  • 启动Firefox浏览器
  • 打开selenium并加载测试案例
  • 启动它,但要迅速暂停
  • 录制一个宏,先在selenium上点击“步骤”,然后切换到Firefox窗口,点击文件->另存为,保存后停止录制
  • 运行这个宏多次……
  • 然后就能得到结果了??

谢谢!

3

要按照你想要的方式来做(也就是实际获取发送到浏览器的内容),你需要修改Selenium RC的代理代码(查看ProxyHandler.java),并在将响应发送回浏览器的同时,把文件保存在本地磁盘上。

5

我发现了一段代码,它可以把一张图片放到一个画布上,然后把这个画布转换成数据,比如说可以转成base64格式。我的想法是通过selenium的eval命令来调用这个代码,但在测试时,toDataURL这个函数却报了一个安全错误,错误代码是1000。看起来离解决方案很近,但就是因为这个错误卡住了。

var data, canvas, ctx;
var img = new Image();
img = document.getElementById("yourimageID");
canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);  // everything works up to here
data = canvas.toDataURL();  // this fails ***
var base64Img = data.replace(/^data:image\/(png|jpg);base64,/, "");

我做了一些研究,发现有资料提到,当图片来自不同的域名时,是不允许使用toDataURL的。不过,我甚至尝试过把页面保存下来,只保留图片和这个脚本。

比如说 (index.html):

<html><head></head><body>
<img src="local/hard/disk/img.jpg" id="yourimageID">
<script>
// script from above
</script>
</body></html>

img.jpg和index.html都是保存在本地的,我在本地用火狐浏览器打开这个页面,还是遇到了安全错误1000!

撰写回答