2016-06-11 3 views
0

私は、mechanizeを使用してラップトップにホストされている小さなWebサイトと対話するためのコードを作成した後、しかし、私はワイワーをまったく動かすのに苦労しています。RubyでWatirを使用してフォーム要素のテキストを設定できません

require 'watir-webdriver' 

b = Watir::Browser.new :firefox 
b.goto('https://dev.mitdev.org.uk/login') 
body = b.body 
body.forms.each do |f| 
    p f.name 
    f.text_field(:name, 'IDToken1').wait_until_present(5).set('test') 
end 

私は、f.nameが表示され、ログインフォームが「ログイン」と呼ばれることがわかりました。しかし、テキストを設定する行を追加するとタイムアウトになります。

FFを見ると、フォームがレンダリングされていることがわかります。なぜ私がそれとやりとりすることができないのか困惑しています。

body.text_field(:name => 'IDToken2').wait_until_present(5).set('Password') 

しかし無駄に:

私は次のように値を設定する他の方法を試してみました。

オンラインのチュートリアルは、私がルーキーの大失敗をしているのを見て、それを見て疲れていると思うので、この見た目がとても簡単です。


返信いただきありがとうございます。例外として、私は私が待っていなければレンダリングされていないと思っています。私の構文が間違っていると私に教えてもらう方法があれば、それをどうやって行うのか分かっていただければ幸いです。ここで

は形式です:

<form id="Login" name="Login" action="/login" method="post"> 
    <div class="sign-in"> 
     <fieldset> 
      <legend class="form-title heading-large">Sign in</legend> 
      <div class="form-group"> 
       <label class="form-label" for="IDToken1"> 
        User ID 
       </label> 
       <input class="form-control" type="text" name="IDToken1" id="IDToken1" value="" maxlength="50" tabindex="1" /> 
      </div> 
      <div class="form-group"> 
       <label class="form-label" for="IDToken2"> 
        Password 
       </label> 
       <input type="hidden" id="goto" name="goto" value=""/> 
       <input class="form-control" type="password" name="IDToken2" id="IDToken2" value="" maxlength="100" autocomplete="off" tabindex="2" /> 
       <input type="hidden" name="_csrf_token" value=" deleted "> 
      </div> 
     </fieldset> 
     <nav class="module-content-navigation"> 
      <input name="Login.Submit" type="submit" class="button" value="Sign in" tabindex="3" /> 
      <ul class="content-navigation__secondary"> 
       <li> 
        <a href="/forgotten-password" tabindex="4">Forgotten password</a> 
       </li> 
      </ul> 
     </nav> 
    </div> 
    <input name="IDButton" type="hidden" style="display: none;"> 
</form> 

私はさらに要素のアドレスを修飾するためにハッシュを使用する方法を見せてくれたましたが、私はまだとの運を持っていないよ良いチュートリアルをオンラインで発見しましたこのフォーム:

b = Watir::Browser.new 
b.goto('https://dev.mitdev.org.uk/login') 
b.wait(3) 
b.text_field(:class => 'form-control', 
      :type => 'text', 
      :name => 'IDToken1', 
      :id => 'IDToken1').set('test') 

私はまだ、タイムアウトまたはノーウェイトで例外を取得しています:

[remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-12708-sjjxdp/extensions/[email protected]/components/command-processor.js:10092:in `fxdriver.preconditions.visible': Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError) 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-12708-sjjxdp/extensions/[email protected]/components/command-processor.js:12644:in `DelayedCommand.prototype.checkPreconditions_' 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-12708-sjjxdp/extensions/[email protected]/components/command-processor.js:12661:in `DelayedCommand.prototype.executeInternal_/h' 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-12708-sjjxdp/extensions/[email protected]/components/command-processor.js:12666:in `DelayedCommand.prototype.executeInternal_' 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-12708-sjjxdp/extensions/[email protected]/components/command-processor.js:12608:in `DelayedCommand.prototype.execute/<' 

もう少しでゼロ化、これはテキストフィールドのID出力します

p b.text_field(:type => 'text', 
      :name => 'IDToken1', 
      :id => 'IDToken1').id 

をが、これはテキストを設定するために失敗します。

b.text_field(:type => 'text', 
      :name => 'IDToken1', 
      :id => 'IDToken1').when_present(5).set('test') 

これは、より多くのとは何かのように探していますむしろ水の構文の私の把握よりもページ:

p b.text_field(:name => /Token1/).name 
p b.text_field(:type => 'text', 
      :name => 'IDToken1', 
      :id => 'IDToken1').id 
p b.text_field(:name => /Token1/).exists? 
b.text_field(:name => /Token1/).double_click 
b.text_field(:name => /Token1/).set 'test' 

は私に要素が明確に存在しているが、私はこの奇妙な「スクロール」をダブルクリックしてのスタックトレースを参照して示し、この出力を提供します。

"IDToken1" 
"IDToken1" 
true 
[remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-2812-w3soqr/extensions/[email protected]/components/driver-component.js:11072:in `FirefoxDriver.prototype.mouseMoveTo': Offset within element cannot be scrolled into view: (5, 17.5): [object HTMLInputElement] (Selenium::WebDriver::Error::MoveTargetOutOfBoundsError) 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-2812-w3soqr/extensions/[email protected]/components/command-processor.js:12661:in `DelayedCommand.prototype.executeInternal_/h' 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-2812-w3soqr/extensions/[email protected]/components/command-processor.js:12666:in `DelayedCommand.prototype.executeInternal_' 
    from [remote server] file:///var/folders/f4/6vwp2t_d75v803226gs84v100000gp/T/webdriver-profile20160612-2812-w3soqr/extensions/[email protected]/components/command-processor.js:12608:in `DelayedCommand.prototype.execute/<' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/response.rb:70:in `assert_ok' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/response.rb:34:in `initialize' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/http/common.rb:78:in `new' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/http/common.rb:78:in `create_response' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/http/default.rb:90:in `request' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/http/common.rb:59:in `call' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/bridge.rb:649:in `raw_execute' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/bridge.rb:627:in `execute' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/remote/bridge.rb:419:in `mouseMoveTo' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/common/mouse.rb:71:in `move_to' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/common/mouse.rb:81:in `move_if_needed' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/common/mouse.rb:40:in `double_click' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/common/action_builder.rb:363:in `block in perform' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/common/action_builder.rb:362:in `each' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.53.1/lib/selenium/webdriver/common/action_builder.rb:362:in `perform' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/watir-webdriver-0.9.1/lib/watir-webdriver/elements/element.rb:147:in `block in double_click' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/watir-webdriver-0.9.1/lib/watir-webdriver/elements/element.rb:598:in `element_call' 
    from /Users/atkinsb/.rvm/gems/ruby-2.2.1/gems/watir-webdriver-0.9.1/lib/watir-webdriver/elements/element.rb:147:in `double_click' 

私が問題に近づいてるように感じている:

p b.text_field(:name => /Token1/).exists? 
p b.text_field(:id => /Token1/).visible? 
p b.text_field(:name => /Token1/).present? 

存在するため、可視光および存在するが、真のための偽のこのショー。

この要素は、私には見えるが、私は答えなければならない次の質問である一方、ワチールには見えないのはなぜ...

+0

それはあなたがだけでなく、見ている例外を提供するために役立つだろうあなたが作業しているHTML。 '.wait_until_present(5).set( 'test')'は有効な構文ではなく、 'when_present(5).set( 'test')'でなければなりません。しかし、タイムアウトではなく、定義されていないメソッドエラーが発生します。 –

+0

感謝ジャスティン、私は今多くの詳細を追加しました –

+0

例外は、要素が表示されていないと言います。スクリプトを実行すると、テキストフィールドが表示されますか?人にテキストフィールドが表示される前に実行する必要があるアクションがないことは確かですか? –

答えて

0

Woo!最後に...

だからSeleniumのJavaコードは私に正しい方向を与え、私はこのようなフォームを埋めるために管理している:

b.element(:xpath => "//*[contains(@id,'_tid1')]").send_keys('user')  
b.element(:xpath => "//*[contains(@id,'_tid2')]").send_keys('password') 
b.element(:name => "Login.Submit").click 
+0

これはあなたが探していた要素が提供されたHTML?私は "_tid1"を含むid属性を見ません。 'b.element(id:/ _tid1 /)send_keys( 'user')' –

+0

こんにちはJustin、不足している要素を指摘してくれてありがとう。私はページのためのHTMLフォームビューソースを取得し、私はdevのツールで見ることができる隠しフィールドをコピーしていない。私は気付かなかった。結局のところ、問題は上記のxpathでしか対処できないJavaスクリプトを入れている開発者にたどり着きました。 –

0

私はあなたのスクリプトを試してみました。それは私の最後で働いています

require 'watir-webdriver' 

b = Watir::Browser.new :chrome 
b.goto 'file:///D:/WORKSPACE/Learning/demo1.html' 
b.text_field(:name, 'IDToken1').when_present(5).set('test') 

しかし、フォームとボディではありません。

関連する問題