Jak przetestować potwierdzenie dialogowe z Cucumber?

Odpowiedzi:

62

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 confirmmetodę, 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')
Theo
źródło
Wydaje się, że to już nie działa w Firefoksie 4 ... Rozwiązanie @ derek-ekins poniżej, z tego, co mówi mi Google, wydaje się być bardziej kompatybilne z nowszymi wersjami, chociaż nie mogę jeszcze potwierdzić (utknąłem na Kapibara 0.3.9).
carpeliam
1
Zobacz odpowiedź poniżej dotyczącą używania „page.driver.browser.switch_to ...”
Thorbjørn Hermansen,
134

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
Derek Ekins
źródło
2
Dla każdego, kto to śledzi - proszę zauważyć, że odpowiedź Dereka rzeczywiście działa tam, gdzie stwierdziłem, że kod w oficjalnej dokumentacji selenu nie działa (ogórek / selen). Zwróć uwagę na obecność page.driver.browserw odpowiedzi Dereka
Peter Nixey
Peter - kod tutaj jest dostosowany specjalnie do używania kapibary, podczas gdy kod w dokumentacji jest przeznaczony do bezpośredniego korzystania z selenu-webdriver - napisałem również ten przykład, więc mam nadzieję, że zadziała!
Derek Ekins
Ahh. Tak, słuszna uwaga i całkowicie mi brakowało. W takim razie dziękuję za oba przykłady.
Peter Nixey
39

Zaimplementowałem te dwa kroki internetowe w /features/step_definitions/web_steps.rb:

When /^I confirm popup$/ do
  page.driver.browser.switch_to.alert.accept    
end

When /^I dismiss popup$/ do
  page.driver.browser.switch_to.alert.dismiss
end
Dynamick
źródło
8

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
Jon Wood
źródło
2
Fajne rozwiązanie! Odwróciłem
Mat Schaffer,
A oto kolejna wersja tego kodu, która obsługuje zarówno okna alertów, jak i potwierdzeń, gist.github.com/919116
Matthew O'Riordan
3

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

Thomas Walpole
źródło
2

Kapibary-WebKit kierowca obsługuje to za dobrze.

regulatethis
źródło
2
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
hainguyen
źródło
1

Prickle dodaje kilka wygodnych metod pracy z wyskakującymi okienkami w selenie i webkicie

Chris Bloom
źródło
0

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.

Joel Cogen
źródło
0

Wypróbowałem powyższe odpowiedzi bez powodzenia. W końcu to zadziałało dla mnie:

@browser.alert.ok
Andy Stannard
źródło