【发布时间】:2015-12-29 21:45:12
【问题描述】:
提前为这个新问题道歉,但我在 SO 和其他地方花了几个小时试图解决这个问题,但无济于事。
我在 Ruby on Rails 应用程序中使用 Poltergeist 作为我的 Capybara 驱动程序,以使用 PhantomJS 创建和保存屏幕截图,我注意到一个奇怪的差异。
下面是the syntax 的示例,用于直接使用 PhantomJS 创建屏幕截图:
page.render('google_home.jpeg', {format: 'jpeg', quality: '100'});
我想使用 Poltergeist 来实现相同的目标 - 具体来说,以低分辨率截取屏幕截图(生成缩略图)。所以我尝试了Poltergeist的documented method:
默认情况下,只会渲染视口(可见的页面部分)。要呈现整个页面,请使用
save_screenshot('/path/to/file.png', :full => true)。
注意参数是不同的。在 Poltergeist 中,该方法接受文件名和包含键 full 的哈希,而在 PhantomJS 中,该方法接受文件名和包含键 format 和 quality 的哈希。然而,据我了解,Poltergeist 只是将其参数传递给 PhantomJS 的 render 方法,所以我不明白发生了什么。
具体来说,我查看了 Poltergeist 的源代码,并将save_screenshot 方法(只是render 的别名)追溯到here:
def render(path, options = {})
check_render_options!(options)
command 'render', path.to_s, !!options[:full], options[:selector]
end
这就是我失去情节的地方。我可以成功地使用 Poltergeist 语法来完成它所说的将发生的事情(将full 设置为 true 会截取整个页面的屏幕截图;false 只是捕获视口),但我不知道为什么它在PhantomJS 本身甚至不接受 full 作为参数。
更糟糕的是,我实际上需要调整质量,但在 Poltergeist 中似乎没有任何方法可以做到这一点。我这里有什么明显的遗漏吗?
【问题讨论】:
-
save_screenshot的写法很明显,你不能传递质量等选项,但格式通常由 PhantomJS 中的目标文件名确定。此外,如果您尝试生成缩略图,那么仅 PhantomJS 无法做到这一点。您只能裁剪到页面的一部分(通过选择器),但不能缩放图像。你能澄清一下你想要做什么吗? -
谢谢!根据this,您可以在 PhantomJS 中使用
clipRect进行裁剪而不使用选择器。我正在尝试捕获页面的顶部(大约是典型的笔记本电脑屏幕的空间——大约 1024x768 左右)但是在低分辨率下,这是 PhantomJSquality选项应该完成的。但我无法弄清楚 a) 为什么 Poltergeist 不允许该选项以及 b) 当 PhantomJS 的render方法没有该切换功能时,full选项如何工作。这有意义吗? -
a) 我没有尝试过,但我怀疑
full会呈现可能大于视口的整个页面。可以把它想象成浏览器窗口的高度以至于看不到滚动条。 b) 您不应将quality与分辨率混淆。quality表示有损 jpeg 压缩的强度,而不是像素数。 -
A) 对不起,我应该更清楚。
Full确实 确实呈现了整个页面,而不是视口。但是由于 Poltergeist 的save_screenshot基本上是 Phantom 的render的包装器(对吗?),当底层 Phantomrender方法本身甚至没有可用于仅视口的参数时,我不明白这个功能是如何工作的渲染。 B) 取点。但是,如果可能的话,我仍然想从 Poltergeist 访问quality功能。 -
简洁地说,Poltergeist 自述文件描述了它的
save_screenshot方法如下:“这与 PhantomJS 渲染功能的工作方式相同。”但它似乎没有,我主要想知道是因为我没有正确使用它还是因为它实际上与 Phantom 的render不一样。
标签: ruby-on-rails phantomjs poltergeist