Я использую 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{...}
после одного клика, и это просто истекло.
Любое понимание будет оценено.