[/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.
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
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.