watir-webdriver и переключатели, стилизованные под набор кнопок jquery, сбивают с толку поведение при нажатии - PullRequest
1 голос
/ 31 декабря 2011

Я использую 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();
  });

Теперь, чтоэто превращается в фактически скрытый набор переключателей, у каждого из которых есть

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

Я могу нажать

Итак, вот в чем проблема.Я не могу заставить это работать так, как ожидалось, когда я использую свои функции Cucumber!Вот сценарий:

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 Ответ

1 голос
/ 04 января 2012

«Решением» для этого стало изменение определения шага, которое использовалось для нажатия кнопки.

Оригинал:

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", поэтому этого перезаписи достаточно.По крайней мере, для целей этой ситуации.

...