【问题标题】:Can't use PhantomJS render options in Poltergeist不能在 Poltergeist 中使用 PhantomJS 渲染选项
【发布时间】: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 中,该方法接受文件名和包含键 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 中似乎没有任何方法可以做到这一点。我这里有什么明显的遗漏吗?

【问题讨论】:

  • save_screenshot 的写法很明显,你不能传递质量等选项,但格式通常由 PhantomJS 中的目标文件名确定。此外,如果您尝试生成缩略图,那么仅 PhantomJS 无法做到这一点。您只能裁剪到页面的一部分(通过选择器),但不能缩放图像。你能澄清一下你想要做什么吗?
  • 谢谢!根据this,您可以在 PhantomJS 中使用clipRect 进行裁剪而不使用选择器。我正在尝试捕获页面的顶部(大约是典型的笔记本电脑屏幕的空间——大约 1024x768 左右)但是在低分辨率下,这是 PhantomJS quality 选项应该完成的。但我无法弄清楚 a) 为什么 Poltergeist 不允许该选项以及 b) 当 PhantomJS 的 render 方法没有该切换功能时,full 选项如何工作。这有意义吗?
  • a) 我没有尝试过,但我怀疑full 会呈现可能大于视口的整个页面。可以把它想象成浏览器窗口的高度以至于看不到滚动条。 b) 您不应将quality 与分辨率混淆。 quality 表示有损 jpeg 压缩的强度,而不是像素数。
  • A) 对不起,我应该更清楚。 Full 确实 确实呈现了整个页面,而不是视口。但是由于 Poltergeist 的 save_screenshot 基本上是 Phantom 的 render 的包装器(对吗?),当底层 Phantom render 方法本身甚至没有可用于仅视口的参数时,我不明白这个功能是如何工作的渲染。 B) 取点。但是,如果可能的话,我仍然想从 Poltergeist 访问 quality 功能。
  • 简洁地说,Poltergeist 自述文件描述了它的save_screenshot 方法如下:“这与 PhantomJS 渲染功能的工作方式相同。”但它似乎没有,我主要想知道是因为我没有正确使用它还是因为它实际上与 Phantom 的 render 不一样。

标签: ruby-on-rails phantomjs poltergeist


【解决方案1】:

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


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

【讨论】:

  • 谢谢!我还没有找到 Poltergeist 代码的那部分——有助于理清问题。赞赏!
  • 请注意,您所做的任何更改实际上都应该在 CoffeeScript file 中完成,以便以后可以编译成 JavaScript。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2015-05-31
  • 2020-09-17
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多