例如,我想将浏览器的用户代理作为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
之类的操作,因此我希望有一些方法可以将这些方法链接起来。这甚至可能吗?
答案 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