2011-12-30 7 views
1

FirefoxのラジオボタンとjQueryボタンセットのやり取りをするのにwatir-webdriverを使用しています。watir-webdriverとラジオボタンのスタイルがjqueryのボタンセットになっていて、クリック時の動作がわかりにくい

<label for="radioButtonSet">Radio Buttons</label> 
    <div id="radioButtonSet"> 
    <input type="radio" id="radio1" name="radio"/><label for="radio1">Choice 1</label> 
    <input type="radio" id="radio2" name="radio"/><label for="radio2">Choice 2</label> 
    <input type="radio" id="radio3" name="radio"/><label for="radio3">Choice 3</label> 
    </div> 

関連JS:今

$(function() { 
    $("#radioButtonSet").buttonset(); 
    }); 

は、何これは変身すると、実際に対応するラジオと対話することで、リスナーを持っている<ラベル>とラジオボタンの隠されたセット、それぞれでありますボタン。ハッキーだけどね。とにかく、私は基本的な(非スタイルの)ラジオボタンセットかjQueryボタンセットを扱っているかどうかに関して、私のキュウリのステップ定義を「不可知論的」に見せたいと思っています。次のように興味のステップは次のとおりです。

When /^I click on the (.+ button)$/ do |button| 
    get_on_page(@current_page,button).click 
end 

私は、ページオブジェクトモデルを使用していますので、私のような手順を望んでいたのでget_on_pageは、完全な開示の利益のために

def get_on_page (page_object, element_on_page) 
    page_object.send(element_on_page.downcase.gsub(" ","_")) 
end 

...のように定義されます"中央のラジオボタンが選択されている"と同様にjQueryに無関心であるように、私はWatir :: Labelを拡張しました。とにかく

class Watir::Label 
    attr_accessor :for, :browser 

    #For cases where the label is a "skin" over a checkbox or radio button. 
    #Finds the checkbox or radio button that this Label is for and interrogates it. 
    #Requires that @browser is set to the current active browser instance 
    def checked? 
    @input = @browser.checkbox(:id => self.for) 
    if (not @input.exists?) then 
     @input = @browser.radio(:id => self.for) 
    end 
    @input.checked? 
    end 
end 

予想通り、IRB(コマンドライン)ですべてが動作します。ここを参照してください:

irb(main):370:0> @middle_radio_button = @browser.label(:for => "radio2") 
=> #<Watir::Label:0x5b6635c2 located=false selector={:for=>"radio2", :tag_name=>"label"}> 
irb(main):371:0> @middle_radio_button.browser = @browser 
=> #<Watir::Browser:0x..fb560d81a url="file:///C:/Users/dsharkov/git/html-template/ShowCase.html" title="Showcase"> 
irb(main):372:0> @middle_radio_button.for = "radio2" 
=> "radio2" 
irb(main):373:0> @middle_radio_button.click 
=> [] 
irb(main):374:0> @middle_radio_button.checked? 
=> true 

私は<ラベル>をクリックして、そのラジオボタンがチェックされているかどうかを確認することができます。そして、はい、私は視覚的にアクティブなブラウザのウィンドウで、ラベルがクリックされ、すべての楽しいものを確認しました。

ここに問題があります。私はキュウリの機能を実行しているときに期待どおりに動作するようにはできません!ここではシナリオがあります:

Scenario: radio buttons styled as jQuery toggle buttons 
    Given I am on the Showcase page 
     And I click on the middle radio button 
    Then the middle radio button is selected 
     And the left radio button is not selected 

関心のある他のステップの定義は、1つの「が選択されている」と、私は思いますので、ここでそのです:

Then /^the (.+) is (not)?(?:checked|selected)$/ do |checkbox_or_radio,not_checked| 
    @checkbox = get_on_page(@current_page,checkbox_or_radio) 
    if (not_checked == "not ") then 
    @checkbox.checked?.should_not be_true 
    else 
    @checkbox.checked?.should be_true 
    end 
end 

は、ここで私は何を得るのです。

Scenario: radio buttons styled as jQuery toggle buttons # features\accessing_common_elements.feature:54 
    Given I am on the Showcase page      # features/step_definitions/common_steps.rb:3 
    And I click on the middle radio button    # features/step_definitions/common_steps.rb:19 
    Then the middle radio button is selected    # features/step_definitions/common_steps.rb:85 
     expected false to be true (RSpec::Expectations::ExpectationNotMetError) 
     ./features/step_definitions/common_steps.rb:90:in `/^the (.+) is (not)?(?:checked|selected)$/' 
     features\accessing_common_elements.feature:57:in `Then the middle radio button is selected' 
    And the left radio button is not selected    # features/step_definitions/common_steps.rb:85 

これは私を悲しくする。私は視覚的にボタンセットに起こるすべてのことが、クリックしたいと思っているボタンであることが、ちょっと見た目を上げているかのように強調表示されていることを確認しました。

そしてここでは、私はもっと悲しい作るものだ - 私はこれに私のステップ定義を変更する場合:

When /^I click on the (.+ button)$/ do |button| 
    get_on_page(@current_page,button).click 
    get_on_page(@current_page,button).click 
end 

すべてが幸せと緑です。それはクールではありません! 2回クリックすることは、1回クリックと同じではなく、2重クリックと同じではありませんので、これについて本当に混乱しています。ここに根底にある問題は何か?これは、irbを使って「正しく」動作しているのを見ていないと理解しやすくなります。 1回のクリックでWatir::Wait.until{...}を追加してタイムアウトしたため、競合状態ではないとも思う。

洞察力があれば幸いです。

+0

これはちょうどタイミングかもしれませんか?ラベルがクリックされ、隠しコントロールの実際の状態がjavascriptによって変更されるまでの間に若干の遅延がありますか? IRBのステップをスクリプトにして、それをそのまま「速く」実行すると、それはあなたのために機能しますか? –

+0

私はちょうどあなたが示唆したように...そして確かにそれはキュウリを通ってそれを実行するときと同じです。基本的には、視覚的に起こっていることは、クリックを送信してもjQueryラベルのアニメーションに基づいてわかる限り、「マウスオーバー」です。面白いのは、スクリプトを終了すると、実際にクリックが発生しないということです。だから、私が知る限りタイミング問題ではありません。イベントはちょうど起動しません、または間違っているように見えます... –

+0

更新:ラベルを見つけてそのページ上のコントロールを少し回した後にクリックするスクリプトを実行すると、動作します。初めてこのページにアクセスしてスクリプトを実行すると、失敗し、その「mouseover」ハイライトで終了します。だから、何かが時間内に読み込まれていないかのように...少なくともそれは "見える"方法です。 –

答えて

1

これを「溶液」ボタンをクリックするために使用されたステップの定義を変更することになりました。

オリジナル:

When /^I click on the (.+ button)$/ do |button| 
    get_on_page(@current_page,button).click 
end 

新機能と改善:

When /^I click on the (.+ [Bb]utton)$/ do |button| 
    get_on_page(@current_page,button).fire_event("onclick") 
end 

チャックはコメントで上記述べているように、.clickは、複数のイベントが発火につながるが、何この場合には興味がありますすることは本当にあります"onclick"イベントに応答して何が起こるのか、この書き換えで十分です。少なくともこの状況のた​​めに。

関連する問題