2011-08-03 15 views
55

Próbowałem już kilku przykładów znalezionych w Internecie, ale bez powodzenia. Czekam na potwierdzenie wiadomości potwierdzającej usunięcie linku. Ostatnią próbą był poniższy kod, ale spowodowało to błąd Capybara :: NotSupportedByDriverError.Jak potwierdzić wyskakujące javascript z Capybara?

def confirm_dialog 
    page.evaluate_script('window.confirm = function() { return true; }') 
end 
+0

możliwy duplikat [Jak przetestować okno potwierdzenia z ogórkiem?] (http://stackoverflow.com/questions/2458632/how-to-test-a-confirm-dialog-w-cucumber). Autor zaakceptowanej odpowiedzi zgadza się z duplikatem. –

+1

Duplicte odrzucono. –

+0

Zobacz moją odpowiedź tutaj na nowszy sposób, aby to zrobić: http://stackoverflow.com/a/26472467/2170577 –

Odpowiedz

2

Przypuszczam, że trzeba dodać selen do GEM-pliku i go skonfigurować i kapibary że kapibary używa selen jako kierowca.

Myślę również, że How to test a confirm dialog with Cucumber? jest bardzo podobny do twojego pytania, zwłaszcza zaakceptowanej odpowiedzi.

2

spróbuj dodać :js => true do testu.

RSpec’s metadata feature can be used to switch to a different driver. Use :js => true to switch to the javascript driver, or provide a :driver option to switch to one specific driver. For example:

it 'will use the default js driver' :js => true do 
    ... 
end 
47

Przede wszystkim przełączyć się na używanie selen jako kierowcy przez umieszczenie znacznika @javascript przed swoim scenariuszu.

Poniższy kod w kroku ogórka następnie potwierdź dialog:

page.driver.browser.switch_to.alert.accept 
# or 
page.driver.browser.switch_to.alert.dismiss 
# or 
page.driver.browser.switch_to.alert.text 

Jak powiedział @NobbZ, to pytanie zostało zadane i odpowiedzi zanim tutaj: How to test a confirm dialog with Cucumber?.

Więcej dokumentacji selen dostępny także tutaj: http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

+2

niezdefiniowana metoda "switch_to" dla # Dima

+1

Mam to niezdefiniowane błąd metody, a następnie odkryłem, że nie potrzebowałem wywołania switch_to w ogóle, ponieważ selen (myślę) automatycznie zwraca wartość true przy każdym potwierdzeniu. To nie pomoże wszystkim, ale może pomóc niektórym. – elc

+1

@ DemoGoltsman Używasz testu RackTest. odpowiedź odnosi się do kierowcy selenu. Musisz ustawić sterownik przed uruchomieniem testu przez '' Capybara.current_driver =: selenium'' lub dodać js: true do przykładu, który powinien domyślnie ustawić sterownik '': seleni'', ponieważ jest domyślny '' Capybara.javascript_driver'' – Nultyi

14

dla Kapibara-WebKit:

page.driver.browser.accept_js_confirms 
page.driver.browser.reject_js_confirms 

który nadal pracuje, ale dokumentacja mówi:

page.driver.accept_js_confirms! 
page.driver.accept_js_confirms! 

Zobacz https://github.com/thoughtbot/capybara-webkit, wyszukiwania "accept_js_confirms"

+2

To działało dla mnie z page.driver.accept_js_confirms! (w rzeczywistości z https://github.com/thoughtbot/capybara-webkit) – Adrien

+1

obecnie ta linia działa dla kapibara: page.driver.browser.switch_to.alert.accept –

+0

Wygląda na to, że jedna z nich powinna być stroną. driver.reject_js_confirms! – retroGiant

6

Musiałem użyć trybu uśpienia w teście webkit, ponieważ nie zawsze kończyło się to niepowodzeniem.

Oto co wymyśliłem po przeczytaniu everyones posty:

if page.driver.class == Capybara::Selenium::Driver 
    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.accept_js_confirms 
else 
    raise "Unsupported driver" 
end 
+0

pracował bardzo dobrze dla mnie, dzięki. – juanpastas

+0

Tak, po prostu bądźcie naprawdę ostrożni, aby nie dodawać ich zbyt wielu, to sprawia, że ​​wasze testy są naprawdę drogie w prowadzeniu (tj. Potrwają dłużej z powodu snu). –

7

miałem czasowe problemy z dialogów przeglądarek w środowisku CI więc jestem odpytywanie na oknie przed zaakceptowaniem go:

def accept_browser_dialog 
    wait = Selenium::WebDriver::Wait.new(:timeout => 30) 
    wait.until { 
    begin 
     page.driver.browser.switch_to.alert 
     true 
    rescue Selenium::WebDriver::Error::NoAlertPresentError 
     false 
    end 
    } 
    page.driver.browser.switch_to.alert.accept 
end 
24

Dodanie odpowiedzi dla osób, które trafiły na nią w 2016 r. I później. Możesz teraz użyć Capybara bezpośrednio, aby zaakceptować pole potwierdzenia. Robisz to, pakując kod, który powoduje, że pole potwierdzenia pojawia się w funkcji accept_confirm.

accept_confirm do 
    click_link 'Destroy' 
end 
+2

Witaj z przyszłości (2017). Dziękuję za tę odpowiedź. – user1515295

+0

Serdecznie zapraszamy :) – retroGiant

2

W Kapibara bardzo łatwo jest zaakceptować okno modelu. Nawet możemy zrobić to samo w selenach, ale jest to trochę trudne dla ludzi, którzy nie są świadomi selenu.

page.accept_modal #To zaakceptuje modalne okno

page.dismiss_modal #To odrzuci/odrzucenie modalne okno

+0

To zwraca mi 'NoMethodError: prywatna metoda 'accept_modal' wywołana dla # ' – Ruff9

Powiązane problemy