我在无头浏览器中使用了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
答案 0 :(得分:0)
从1个请求到3个请求的设计更改对您的API产生了很大的影响,因为即使这个简单的部分现在也是有状态的,即您需要将状态保持在这三个请求之间。
一旦您了解了,您就有不同的可能性。
在请求后建立您的信息请求,只有完成后,才使用watir
来获取所需的信息。
这基本上是在更改API,然后将数据存储在会话,cookie,数据库或其他任何内容中。
它对您必须进行的更改没有很大的影响,但是并没有带来任何优势。
已经忘记了这一点,但是您可以在会话中传递对对象的全局引用,但是它对内存的影响很大,并且您可能会陷入竞争状态。
从不这样做, 请
如果您确实要将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') 结束 。 。 。 等
希望这会有所帮助。