Używam Ruby on Rails z ogórkiem i kapibarą.
Jak bym zabrał się do testowania prostego polecenia potwierdzenia („Czy na pewno?”)?
Gdzie mogę znaleźć dalszą dokumentację dotyczącą tego problemu?
Używam Ruby on Rails z ogórkiem i kapibarą.
Jak bym zabrał się do testowania prostego polecenia potwierdzenia („Czy na pewno?”)?
Gdzie mogę znaleźć dalszą dokumentację dotyczącą tego problemu?
Odpowiedzi:
Wygląda na to, że w Kapibara nie da się tego zrobić niestety. Ale jeśli przeprowadzasz testy ze sterownikiem Selenium (i prawdopodobnie innymi sterownikami obsługującymi JavaScript), możesz go zhakować. Tuż przed wykonaniem akcji, która spowodowałaby wyświetlenie okna dialogowego potwierdzenia, nadpisz confirm
metodę, aby zawsze zwracała wartość true. W ten sposób okno dialogowe nigdy nie zostanie wyświetlone, a testy będą kontynuowane tak, jakby użytkownik nacisnął przycisk OK. Jeśli chcesz zasymulować odwrotność, po prostu zmień to na wartość false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Sterownik selenu teraz to obsługuje
Z Kapibary można uzyskać do niego dostęp w następujący sposób:
page.driver.browser.switch_to.alert.accept
lub
page.driver.browser.switch_to.alert.dismiss
lub
page.driver.browser.switch_to.alert.text
page.driver.browser
w odpowiedzi Dereka
Jeśli chcesz dokładnie przetestować wyświetlaną wiadomość, oto szczególnie hakerski sposób na zrobienie tego. Nie polecam tego jako pięknego kodu, ale spełnia swoje zadanie. Będziesz musiał załadować http://plugins.jquery.com/node/1386/release lub zmienić go tak, aby robił pliki cookie natywnie, jeśli nie chcesz korzystać z jQuery.
Użyj tego rodzaju historii:
Given I am on the menu page for the current booking
And a confirmation box saying "The menu is £3.50 over budget. Click Ok to confirm anyway, or Cancel if you want to make changes." should pop up
And I want to click "Ok"
When I press "Confirm menu"
Then the confirmation box should have been displayed
I te kroki
Given /^a confirmation box saying "([^"]*)" should pop up$/ do |message|
@expected_message = message
end
Given /^I want to click "([^"]*)"$/ do |option|
retval = (option == "Ok") ? "true" : "false"
page.evaluate_script("window.confirm = function (msg) {
$.cookie('confirm_message', msg)
return #{retval}
}")
end
Then /^the confirmation box should have been displayed$/ do
page.evaluate_script("$.cookie('confirm_message')").should_not be_nil
page.evaluate_script("$.cookie('confirm_message')").should eq(@expected_message)
page.evaluate_script("$.cookie('confirm_message', null)")
end
Aktualizuję to dla aktualnych wydań Kapibary. Większość dzisiejszych sterowników Capybara obsługuje modalne API. Aby zaakceptować potwierdzenie modalne, zrobiłbyś
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Można go użyć w ogórku z czymś w rodzaju
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
który kliknie nazwany przycisk, a następnie zaakceptuje pole potwierdzenia z dopasowaniem tekstu
Kapibary-WebKit kierowca obsługuje to za dobrze.
Scenario: Illustrate an example has dialog confirm with text
#
When I confirm the browser dialog with tile "Are you sure?"
#
=====================================================================
my step definition here:
And(/^I confirm the browser dialog with title "([^"]*)"$/) do |title|
if page.driver.class == Capybara::Selenium::Driver
page.driver.browser.switch_to.alert.text.should eq(title)
page.driver.browser.switch_to.alert.accept
elsif page.driver.class == Capybara::Webkit::Driver
sleep 1 # prevent test from failing by waiting for popup
page.driver.browser.confirm_messages.should eq(title)
page.driver.browser.accept_js_confirms
else
raise "Unsupported driver"
end
end
Prickle dodaje kilka wygodnych metod pracy z wyskakującymi okienkami w selenie i webkicie
W tym streszczeniu opisano kroki, aby przetestować okno dialogowe potwierdzenia JS w Railsach 2 i 3 z dowolnym sterownikiem Capybara.
Jest to adaptacja poprzedniej odpowiedzi, ale nie wymaga wtyczki jQuery Cookie.
Wypróbowałem powyższe odpowiedzi bez powodzenia. W końcu to zadziałało dla mnie:
@browser.alert.ok