无法在 Poltergeist 中使用 PhantomJS 渲染选项

Can't use PhantomJS render options in Poltergeist

提前为这个新问题道歉,但我在 SO 和其他地方花了几个小时试图解决这个问题,但无济于事。

我正在使用 Poltergeist as my Capybara driver in a Ruby on Rails app, to create and save screenshots with PhantomJS,我注意到一个奇怪的差异。

下面是the syntax直接使用PhantomJS创建截图的例子:

page.render('google_home.jpeg', {format: 'jpeg', quality: '100'});

我想使用 Poltergeist 来实现同样的目的——具体来说,以低分辨率截取屏幕截图(生成缩略图)。所以我尝试了 Poltergeist 的 documented method:

By default, only the viewport will be rendered (the part of the page that is in view). To render the entire page, use save_screenshot('/path/to/file.png', :full => true).

注意参数是不同的。在 Poltergeist 中,该方法接受文件名和包含键 full 的散列,而在 PhantomJS 中,该方法接受文件名和包含键 formatquality 的散列。然而,据我所知,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 中似乎没有任何方法可以做到这一点。我在这里明显遗漏了什么吗?

您不能通过 Poltergeist 将质量选项传递给底层 PhantomJS 脚本,因为没有选项作为 seen in the code (CoffeeScript is transpiled into JavaScript, so the actual code is here) 传递。但是,该项目是开源的,因此您可以轻松地将此功能添加到 save_screenshot 函数和底层 PhantomJS 脚本(不要忘记创建拉取请求)。


:full 为 false 或未设置时,则仅渲染视口,因为 page.clipRect 属性 用于将渲染裁剪为当前视口大小。