如何在下一个控制器操作中重用相同的watir对象

时间:2019-06-05 11:31:48

标签: ruby-on-rails watir headless

我在无头浏览器中使用了watir。我需要执行三个步骤来添加位置,添加车辆并从另一个站点获取产品,以获取我想从另一个站点获得的信息。 我正在从服务器提交这三个详细信息,并在watir和headless的帮助下在一个HTTP请求中执行所有这三个步骤。

我只想将服务器上的一个HTTP请求分解为三个HTTP请求。该请求将是: 1)add_location:触发一个http请求,该请求将打开无头浏览器并选择位置。

2)add_vehicle:触发一个http请求,该请求将重新使用无头浏览器,并在其中添加位置,然后我们将选择车辆。

3)获取产品:触发一个http请求,该请求将重新使用无头浏览器(添加了位置和车辆)将获取产品列表。

我无法重用已经在Rails端的下一个http请求中打开的watir和headless会话。

代码示例:

class TestsController < ApplicationController

  def add_location
    @headless = Headless.new
    @headless.start
    @watir = Watir::Browser.new
    @watir.goto('www.google.com')
    @watir.text_field(id: 'findstore-input')
              .wait_until(&:present?).set(params[:zip_code])
    @watir.a(id: 'findstore-button').click
    @watir.div(class: 'notifier').wait_while(&:present?)
  end

  def add_vehicle
    #need to resuse above @watir object in this action
  end
end

2 个答案:

答案 0 :(得分:0)

从1个请求到3个请求的设计更改对您的API产生了很大的影响,因为即使这个简单的部分现在也是有状态的,即您需要将状态保持在这三个请求之间。

一旦您了解了,您就有不同的可能性。

  1. 在请求后建立您的信息请求,只有完成后,才使用watir来获取所需的信息。

    这基本上是在更改API,然后将数据存储在会话,cookie,数据库或其他任何内容中。

    它对您必须进行的更改没有很大的影响,但是并没有带来任何优势。

  2. 已经忘记了这一点,但是您可以在会话中传递对对象的全局引用,但是它对内存的影响很大,并且您可能会陷入竞争状态。

    从不这样做

  3. 如果您确实要将watir请求分为三个不同的步骤(例如,因为它太慢),则可以使用后台作业,当用户到达数据时可以将其传输到该作业(使用专用数据库,websocket或其他工具),然后等待作业结束(即获得结果),例如通过尝试访问它直到可用。

    此解决方案需要做更多的工作,但是它可以使客户端的HTTP请求保持轻量级,并允许您在后台执行任何类型的复杂任务,否则可能会超时。

答案 1 :(得分:0)

您可以使用hooks文件,以无头模式启动浏览器,并分配给变量以在单独的def中调用,以将url传递给浏览器。

例如:

在挂钩中,您可以将其添加如下

@browser = Watir :: Browser.new:chrome,选项:{args:['--headless']}

因此,您可以在一个def中重用@ browser.goto('www.google.com'),也可以在其他调用中使用同一实例。

def example1:     @ browser.goto('www.google.com') 结束

def example2:     @ browser.goto('www.facebook.com') 结束 。 。 。 等

希望这会有所帮助。