Cucumber / Capybara / Selenium i preventDefault() / stopPropagation()

Taki kawałek HTML-a (dla przykładu):

[code]




Wyślij
[/code] W skrócie - do diva podpięty jest event JS, który łapie wszystkie klinięcia. Wywołuje preventDefault() i stopPropagation(). Wysyła formularz przez XmlHttpRequest. Czyli - jeśli kliknę na linka to ma się wykonać formularz. I tak się dzieje przez przeglądarkę.

Teraz testy - Cucumber / Capybara / Selenium. W teście mam rozpisane (znów skrócie):

click_link("Wyślij")

Efekt - w testach wykonuje się przejście do odnośnika, natomiast nie jest wywoływany event JS.

Jak osiągnąć pożądany efekt w możliwie koszerny sposób? Dodam, że oczywiście scenariusz jest otagowany @javascript.

Pamiętam, że kiedyś selenium miał problemy z wywoływaniem zdarzeń ‘click’ przy klikaniu w linki.

O ile dobrze pamiętam to było to związane z pewnymi ograniczeniami interfejsów javascript przeglądarek. Teraz obstawiam, że obeszli to poprzez ręczne wywołanie event’u ‘click’ na linku, który jest “klikany” przez selenium. Dlatego, że event jest sztucznie wywoływany to propagacja już nie działa…

To tylko moje przypuszczenia - nie wiem jak jest teraz w praktyce.

Ponieważ nie upieram się przy tym zestawie - może można zastąpić czymś innym po to, żeby te testy podziałały?

BTW, to działa przy ręcznie wklepanych / klikanych scenariuszach w Selenium IDE.

Dlatego używam Watir’a - próbowałem zmusić Selenium do działania i mialem ten sam problem: testy wyklikane przez Selenium IDE działały jak trzeba (np wspaniały ‘wait for element’), ale już przez Ruby (różne drivery, gemy itd) już niezbyt.

Watir ma tą zaletę, że używa faktycznej przeglądarki (Firefox) do robienia różnych fajnych rzeczy, więc np twój test mógłby wyglądać mniej-więcej tak:

describe "integration" do before :each do @browser ||= Watir::Browser.new end it "should load stuff via Ajax" do @browser.link(:href, "/submit").click sleep 3 # czekamy aż ajax wczyta nam odpowiedz czy cóś, np info o potwierdzeniu @browser.text.should include "standardowa odpowiedz administratora" end end
Oczywiście są też wady takiego rozwiązania (firefox staje się tylko narzędziem do testowania, musisz używać innej przeglądarki (imo to nie problem ;-)), ale łatwość setup-u (firefox + jeden plugin, gem firewatir) przebiła bałagan z Selenium.

disklejmer: Używam Watir’a dopiero od niecałego miesiąca, ale jeszcze nie natrafiłem na większe problemy, gdyż 90% testów staram się robić zdala od przeglądarki, w watir’ze testując tylko krytyczne rzeczy.

plugawy: selenium też korzysta z przeglądarki, z tym że jest selenium 1.0 (do którego jest IDE) i w miarę świeże selenium 2.0 (webdriver), do którego jest driver w capybarze

filiptepper: z tego co pamiętam, watir ma takie same API co celerity. możesz sprobować napisać driver do watira w capybarze, wtedy mógłbyś na tym samym API korzystać z watira. W międzyczasie można dodać ticket do webdrivera i czekać aż ktoś to naprawi :wink:

Lub też skorzystać ze sterownika Culerity i zamiast wywoływać metodę click/click_link odpalić trigger(“click”). Która jest, jak nazwa wskazuje, aliasem na fire_event.

Uff, działa, dzięki za sugestie.

Coś słabo się rozglądałem za tym Selenium bo umknęło mi info o Selenium2 :-/

Webdriver dla watir’a jest na GH