2017-05-09 3 views
0

例として、ブラウザのユーザーエージェントをhttp://www.useragentstring.com/からの出力として取得し、変数に格納したいとします。現在、私は複数行で行うことができます。Chain Watirコマンド

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

理想的には、私は1行でやりたいと思います。

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のようなことをさせてくれるので、私はこれらの方法を連鎖させる方法もあると思っています。これも可能ですか?

+1

[ 'goto'](http://www.rubydoc.info/gems/ watir-webdriver/0.6.11/Watir/Browser#goto-instance_method)は 'self'を返さないので、どのように連鎖しているのか分かりません。 ['wait_until'](http://www.rubydoc.info/gems/watir/Watir/Waitable#wait_until-instance_method)のようなメソッドは' self'を返すので連鎖できます(例えば 'wait_until_present.click')。 – orde

+0

後藤は自己を返さず、URIを返す、URIは文字列なので、そこで 'textarea'メソッドを呼び出すことはできません。 – RAJ

+0

私はきれいに読めるコードに関する良いコーディング実践に基づいて、このことをお勧めしません。 1行でこれを行う際に(私がとにかく見ることができる)利点はなく、コードの内容に従うのが実質的に難しくなります。 –

答えて

3

のようになります。 Ruby Docs

ブロックに自己を返し、自己を返します。この方法の主目的は、 をチェーン内の中間結果に対して 操作を実行するためにメソッドチェーンに「タップ」することです。あなたがgotoを呼び出すと、まだtextareaを呼び出すためのWatir::Browserインスタンスを持つことtapを使用できることを意味

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

これは美しいです。ありがとうございました。私は答えを受け入れますが、ブラウザを '.close'する必要があるので、私はそれを使うことができないようです。 'tap'の呼び出しを入れ子にして動作させることはできますが、' .close'は 'agent'ではなく' true'を返します。 'タップ'について学ぶ価値はまだあります。 – user137369

+1

ちょうど好奇心から、単線を欲しい理由は何ですか?ファイル内の1行だけを見たい場合は、元の複数行の回答をセミコロンで区切って1行に置くだけです。 –

+0

すばらしいジャスティン・コウ! – RAJ

1

goto方法は、あなたが次にあなたが Watir::Browser.new(:firefox).chain_goto('http://www.useragentstring.com/').textarea.textのようなものを使用することができます

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

を次のようにWatir::Browserためのカスタムメソッドを作ることができる連鎖をサポートしていませんが。

だから、完全なコードは、あなたがtapメソッドを使用して、何もチェーン化可能にすることができ

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 
+0

これは巧妙な解決策ですが、余分な行を別の場所に移動するだけで、目的をいくらか打ち負かしています。それは技術的に正しいので、まだupvoteだろう。 – user137369