例如,我希望从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之类的操作,所以我希望有一些方法来链接这些方法。这有可能吗?
发布于 2017-05-10 12:49:34
通过使用tap方法,您可以使任何东西都是可连锁的。正如Ruby文档所描述的
向块生成self,然后返回self。该方法的主要目的是“挖掘”一个方法链,以便对链中的中间结果执行操作。
这意味着您可以使用tap调用goto,并且仍然拥有用于调用textarea的Watir::Browser实例。
agent = Watir::Browser.new(:chrome).tap{ |b| b.goto('http://www.useragentstring.com/') }.textarea.text发布于 2017-05-10 10:14:45
虽然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.texthttps://stackoverflow.com/questions/43880460
复制相似问题