使用Rails和PhantomJS进行多步骤页面交互和快照?

时间:2014-08-23 14:22:36

标签: javascript ruby-on-rails phantomjs poltergeist

我们的Rails应用程序需要从给定域中获取多个URL的快照。目前这些只是简单的GET请求,但将来用户将能够输入更复杂的指令,例如在拍摄快照之前单击页面元素,填写表单等。我已经确定PhantomJS作为后端,但我不清楚与它进行交互的最佳方式。

PhantomJS的网站提供了非常清晰的文档以及如何使用预先编写的JS脚本和参数来控制它的示例。如果您的所有交互都可以在严格的脚本中捕获,这似乎很有效:创建页面实例,加载URL,执行某些操作,然后调用phantom.exit();

但在我们的案例中,我们希望能够以Capybara的方式向持久性浏览器会话发送各种指令。例如,给定的用户定义脚本可能会调用加载URL,按ID单击元素,然后使用参数定义的浏览器宽度呈现屏幕截图。然后单击一个链接或加载另一个URL并采取更多操作等。因此,虽然我们的迫切需要(加载URL并截取屏幕截图)可以轻松地作为一个10行JS脚本处理,但似乎很快我们将会需要能够更加模块化地发送命令到一个持久的PhantomJS浏览器打开,它在命令之间保持打开状态,直到我们明确关闭它。

有没有办法“模块化”与PhantomJS的通信?通过查看Poltergeist代码,我看到他们使用Web套接字将个别请求发送到PhantomJS。我需要学习如何做到这一点吗?我应该只使用Capybara吗?是否有一些我想念的更简单的解决方案?

提前致谢。只是想弄清楚如何在这里开始。

1 个答案:

答案 0 :(得分:1)

事实证明我正在过度思考这个问题。我已经决定使用Capybara和Poltergeist,它负责PhantomJS,因此我不必直接与它交谈。事实证明,Capybara可以很容易地在你的测试套件之外使用。

给定一个Gemfile,其中capybarapoltergeist存在(在开发和生产中,不仅仅是测试环境),并且给定了一个我需要加载页面,交互并截取屏幕截图的类,下面的代码加载了Capybara,让我可以访问我在测试套件中常用的友好方法。

require 'capybara/rails'
require 'capybara/poltergeist'

class Snapshot
  include Capybara::DSL
  Capybara.default_driver = :poltergeist

  def initialize(url)
    visit url
    click_link "#signup"
    puts page.html
    # etc.
  end
end

然后以正常方式实例化此类:

...
s = Snapshot.new('http://www.google.com')
puts s.page.html
if s.page.status_code == 200
  ...
end
...

(我使用Poltergeist和PhantomJS而不是Capybara的默认值,因为我需要能够在页面上与JS进行交互。)