Chain Watir命令

时间:2017-05-09 21:51:36

标签: ruby watir

例如,我想将浏览器的用户代理作为http://www.useragentstring.com/的输出,并将其存储在变量中。目前,我可以多行进行

require 'watir'
b = Watir::Browser.new(:chrome)
b.goto('http://www.useragentstring.com/')
agent = b.textarea.text
b.close

理想情况下,我想在一行中完成。像

这样的东西
require 'watir'
agent = Watir::Browser.new(:chrome).goto('http://www.useragentstring.com/').textarea.text

但是

失败了
NoMethodError: undefined method `textarea' for "http://www.useragentstring.com/":String`

所以虽然goto部分有效,但其余部分则无效。由于watir允许我们执行wait_until_present.click之类的操作,因此我希望有一些方法可以将这些方法链接起来。这甚至可能吗?

2 个答案:

答案 0 :(得分:3)

您可以使用tap方法制作任何可链接的内容。正如Ruby Docs

所述
  

向块发出自我,然后返回self。主要目的   这种方法的目的是“挖掘”一个方法链,以便执行   对链内中间结果的操作。

这意味着您可以使用tap来呼叫goto并仍然拥有Watir::Browser个实例来呼叫textarea

agent = Watir::Browser.new(:chrome).tap{ |b| b.goto('http://www.useragentstring.com/') }.textarea.text

答案 1 :(得分:1)

虽然goto方法不支持链接,但您可以为Watir::Browser设置自定义方法,如下所示

class Watir::Browser
  def chain_goto(url)
    goto(url)
    self
  end
end

然后你可以使用它     Watir::Browser.new(:firefox).chain_goto('http://www.useragentstring.com/').textarea.text

所以完整的代码就像

require 'watir'

class Watir::Browser
  def chain_goto(url)
    goto(url)
    self
  end
end

b = Watir::Browser.new(:firefox).chain_goto('http://www.useragentstring.com/'.textarea.text