代码之家  ›  专栏  ›  技术社区  ›  Topher Hunt

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

  •  1
  • Topher Hunt  · 技术社区  · 11 年前

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

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

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

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

    提前感谢。我只是想知道如何在这里开始。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Topher Hunt    11 年前

    原来我想得太多了。我已经决定使用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交互。)