0

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

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

2)add_vehicle:触发一个http请求,该请求将重用添加位置的无头浏览器,我们将选择车辆。

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

我没有任何方法可以重用已在 rails 端的下一个 http 请求中打开的 watir 和无头会话。

代码示例:

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
4

2 回答 2

0

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

例如:

在钩子中,您可以按如下方式添加它

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

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

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

def 示例 2:@browser.goto('www.facebook.com') end 。. . ETC

希望这可以帮助。

于 2019-06-10T19:17:45.707 回答
0

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

一旦你明白了这一点,你就有不同的可能性。

  1. 在请求之后构建您的信息请求,并且只有在完成后,才能使用它watir来获取您需要的信息。

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

    它不会对您必须进行的更改产生很大影响,但不会带来任何优势。

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

    千万不要这样做拜托

  3. 如果您真的想将watir请求分成三个不同的步骤(例如,因为它太慢),您可以使用后台作业,您可以在用户数据到达时将其传输到该作业(使用专用数据库、websocket 或其他),然后等待你的工作结束(即得到一个结果),例如尝试访问它直到它可用。

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

于 2019-06-06T11:24:23.027 回答