我们的Rails应用程序需要从给定域中获取多个URL的快照。目前这些只是简单的GET请求,但将来用户将能够输入更复杂的指令,例如在拍摄快照之前单击页面元素,填写表单等。我已经确定PhantomJS作为后端,但我不清楚与它进行交互的最佳方式。
PhantomJS的网站提供了非常清晰的文档以及如何使用预先编写的JS脚本和参数来控制它的示例。如果您的所有交互都可以在严格的脚本中捕获,这似乎很有效:创建页面实例,加载URL,执行某些操作,然后调用phantom.exit();
。
但在我们的案例中,我们希望能够以Capybara的方式向持久性浏览器会话发送各种指令。例如,给定的用户定义脚本可能会调用加载URL,按ID单击元素,然后使用参数定义的浏览器宽度呈现屏幕截图。然后单击一个链接或加载另一个URL并采取更多操作等。因此,虽然我们的迫切需要(加载URL并截取屏幕截图)可以轻松地作为一个10行JS脚本处理,但似乎很快我们将会需要能够更加模块化地发送命令到一个持久的PhantomJS浏览器打开,它在命令之间保持打开状态,直到我们明确关闭它。
有没有办法“模块化”与PhantomJS的通信?通过查看Poltergeist代码,我看到他们使用Web套接字将个别请求发送到PhantomJS。我需要学习如何做到这一点吗?我应该只使用Capybara吗?是否有一些我想念的更简单的解决方案?
提前致谢。只是想弄清楚如何在这里开始。
答案 0 :(得分:1)
事实证明我正在过度思考这个问题。我已经决定使用Capybara和Poltergeist,它负责PhantomJS,因此我不必直接与它交谈。事实证明,Capybara可以很容易地在你的测试套件之外使用。
给定一个Gemfile,其中capybara
和poltergeist
存在(在开发和生产中,不仅仅是测试环境),并且给定了一个我需要加载页面,交互并截取屏幕截图的类,下面的代码加载了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进行交互。)