【问题标题】:Multi-step page interaction and snapshots using Rails and PhantomJS?使用 Rails 和 PhantomJS 的多步骤页面交互和快照?
【发布时间】:2014-08-26 06:08:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在这里查看我的答案:stackoverflow.com/a/25221906/1816580
  • 谢谢,这个答案有帮助。你有使用 Capybara 做这种事情的经验吗?
  • 不,我没有。建议的解决方案只有在您可以并且想要自己制作所有东西时才可行。

标签: javascript ruby-on-rails phantomjs poltergeist


【解决方案1】:

原来是我想多了。我已经决定使用 Capybara 和 Poltergeist,它们负责 PhantomJS,所以我不必直接与它交谈。事实证明,Capybara 可以轻松地在您的测试套件之外使用。

给定一个存在 capybarapoltergeist 的 Gemfile(在开发和生产环境中,而不仅仅是测试环境中),并给定一个我需要加载页面、交互和截屏的类,以下代码加载 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 进行交互。)

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 2015-01-21
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多