watir-webdriver和单选按钮设置为jquery buttonset,点击时会混淆行为

时间:2011-12-30 20:19:51

标签: jquery ruby cucumber radio-button watir-webdriver

我正在使用watir-webdriver与Firefox中的单选按钮进行交互,这些按钮被设计为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();
  });

现在,这变成了一组隐藏的单选按钮,每个按钮都带有&lt; label&gt;它上面有听众与相应的单选按钮进行交互。哈基但是呃。无论如何,我想让我的Cucumber步骤定义看起来“不可知”,关于我们是否正在处理一组基本(无样式)单选按钮或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

我可以点击&lt; label&gt;然后查看是否已选中其单选按钮。是的,我已经在活动的浏览器窗口上直观地确认了标签被点击以及所有有趣的东西。

所以,这就是问题所在。当我运行我的黄瓜功能时,我无法按预期工作!这是场景:

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

感兴趣的另一个步骤定义是“被选中”,我猜,所以这就是:

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

一切都快乐和绿色。那不酷!单击两次与单击一次不同,也不是双击,所以我对此感到困惑。这可能是潜在的问题?如果我没有看到它通过irb“正确”工作,这将更容易理解。我也不认为这是一种竞争条件,因为我在单击后添加了Watir::Wait.until{...}并且只是超时了。

任何见解都将受到赞赏。

1 个答案:

答案 0 :(得分: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

正如Chuck在评论中提到的那样,.click会导致多个事件被触发,但是在这种情况下,真正感兴趣的是响应“onclick”事件会发生什么,所以这次重写就足够了。至少就这种情况而言。