Jeżeli ktoś próbował generować dla aplikacji railsowej cucumbera w najnowszej wersji (0.5.x), to pewnie zauważył, że cucumber pyta, czy wygenerować konfigurację dla capybary czy webrata.
Capybara, to nowy gem, którego API jest w większości kompatybilne z Webratem, ale łatwiej jest pod niego podpinać inne narzędzia. Webrat był początkowo stworzony tylko dla jednego trybu: rails. Capybara ma już teraz wsparcie dla mode’ów: rails, celerity, culerity, selenium (selenium w wersji 2.0 z WebDriverem). Nie wiem jak działa to w praktyce, ale może to być wreszcie odpowiedź na problemy z różnymi narzędzami. Używając capybary można by teoretycznie uruchamiać większość testów w najszybszym trybie “rails”, część w celerity/culerity, a to co nie przejdzie na celerity/culerity w przeglądarce (selenium, firewatir?).
Kilka osób pytało się mnie o to jak uzyskać taki efekt i to jest chyba najlepsza odpowiedź. W najbliższym czasie postaram się to sprawdzić i zobaczyć jak działa w praktyce.
UPDATE:
Oczywiście powinno być “Capybara, to nowy gem, którego API jest w większości kompatybilne w Webratem” (nie z Watirem )
Podpiąłem Capybara pod Rails 3 i Ruby 1.9.2 i działa bardzo fajnie. Dodatkowa zaleta jest taka, że domyślny mode nie jest oparty na rails integration tests, ale na Rack::Test, więc powinno zadziałać z każdym frameworkiem opartym na racku.
Czy ktoś już używał Capybary i Selenium na poważnie?
Jak póki co się jedynie bawię i napotkałem na parę problemów:
1/ Zauważyłem, że testy mi nie przechodzą jeśli w tle mam odpaloną przeglądarkę. Test wiesza się np. w momencie wpisywania wartości do pola tekstowego i po chwili pada. Wydaje mi się, że może to być problem z menadżerem okiem, firefoxem lub po prostu tym, że przeglądarka nagle dostaje/traci focus i selenium głupieje.
Problem nie występuje gdy odpalam FF z użyciem Xvfb (czyli okienko FF w ogóle się nie pojawia).
2/ Jak w Capybarze z poziomu scenario dostać się bezpośrednio do selenium? W webracie można było zrobić coś takiego:
When /I do something/ do
selenium.do_something
end
3/ Da się jakoś robić screenshoty ze scenario, które padły?
W weekend próbowałem się bawić capybarą z selenium i byłem mile zaskoczony, że wystarczyło otagować scenariusz @javascript i już wszystko ładnie śmigało. Niestety również nie znalazłem sposobu na bezpośrednie skorzystanie z selenium w krokach, a poprzez page.evaluate_script nie jestem w stanie mieszać w stronie
Ale dużo lepiej jest sforkować capybarę i dodać potrzebne metody do klasy Driver::Base i zaimplementować je dla danego drivera. Wtedy możesz później zaimplementować takie kroki dla innych driverów.
Nieco cięższe pytanie: jak obsługiwać javascriptowe okienka dialogowe (alert, confirmation itp.)?
Niestety nie znalazłem sensownej odpowiedzi na to pytanie. W “czystym” selenium można użyć metody get_confirmation, jak jej użyć w capybarze?
[quote=lucassus]Nieco cięższe pytanie: jak obsługiwać javascriptowe okienka dialogowe (alert, confirmation itp.)?
Niestety nie znalazłem sensownej odpowiedzi na to pytanie. W “czystym” selenium można użyć metody get_confirmation, jak jej użyć w capybarze?[/quote]
Niestety ticket do tego jest jeszcze otwarty w WebDriverze.
Najprostszy i najbardziej hackish way, to:
[code]Given /^I will confirm on next step$/ do
Capybara.current_session.driver.browser.execute_script(“window.confirm = function(msg) { return true; }”);
end
i podobnie z alert[/code]
Minus tego jest taki, że musisz wiedzieć, że dialog się pojawi (chociaż w krokach cucumbera powinieneś to wiedzieć).
Inna sprawa jest taka, że ja raczej staram się zamieniać alerty i confirm na ich mniej inwazyjne odpowiedniki i wtedy nie ma takiego problemu.
Dzis probuje odpalić selenium na capybarze i mam nie wiem dlaczego problem. Otóż zwykle test się odpala, wyskakuje firefox i tyle z działań - nawet adres stronki nie jest wpisany. Czasami jednak dzieje się tak, że test jest wykonywany. Jest to czynnik czysto losowy: ten sam test, ten sam config, raz zadziała, kilka razy nie zadziała i tak w kółko. Jak to rozwikłać? Capybara 0.3.0, selenium-driver 0.0.17, firefox 3.5.7
Wydaje mi się to dość dziwne, bo u nas testujemy WebDriverem gadget do opensocial, czyli masę javascriptów odpalanych w iframe i raczej nie ma losowo wywalających się scenariuszy.
Żeby było dziwniejsze, w tym teście nie ma niczego, żadnego JS. Najprostsza rzecz, żeby zobaczyć czy działa:
[code]Feature: Testing with selenium
In order to test javascript
As a developer
I want to use selenium
Scenario: Test
When I am on the home page
Then I should see “google”[/code]
i env.rb wygenerowany automatycznie plus
Capybara.current_driver = :selenium
Capybara.app_host = "http://www.gooogle.com"
Zainstalowałem sobie firefox-2 i nic to nie zmieniło. Wywaliłem webdriver 0.0.17 i odpaliłem 0.0.15 i test wykonał się dwa razy (dwa odpalenia), a za trzecim i wyżej przestał.
Test przestał się uruchamiać czy po prostu zaczęły iść faile?
Jeśli to drugie, to zauważyłem ciekawą anomalię: testy odpalane w przeglądarce działają niedeterministycznie - raz przechodzą, a raz nie.
Gdy odpalam Firefoxa za pomocą xvfb (czyli FF jest opalany na “sztucznych x-ach”) testy przechodzą za każdym razem. Wydaje mi się, że problem może stwarzać focus na oknie przeglądarki lub na jakimś polu input w formularzach.
Czy ktoś z was spotkał się z podobnym zachowaniem?
[quote=lucassus]Jeśli to drugie, to zauważyłem ciekawą anomalię: testy odpalane w przeglądarce działają niedeterministycznie - raz przechodzą, a raz nie.
Gdy odpalam Firefoxa za pomocą xvfb (czyli FF jest opalany na “sztucznych x-ach”) testy przechodzą za każdym razem. Wydaje mi się, że problem może stwarzać focus na oknie przeglądarki lub na jakimś polu input w formularzach.[/quote]
Ach… rzeczywiście ;]
U mnie nie ma takich problemów, ale Tomash u nas też musiał się wspomóc xvfb.
Piotr Misiurek: spróbuj z xvfb i daj znać jak poszło.
[quote]EDIT: zobacz ten post: http://groups.google.com/group/ruby-cap … 27fb1ff4ee
U mnie był podobny problem, zmieniłem w capybarze domyślny serwer na webricka.[/quote]
U mnie to nie był problem z serwerem. Jak sie uruchamiało capybarę z opcją debugowania, to pisało że wszystko jest okej startowane no i błąd występował też gdy testowałem google’a. To było coś poryte raczej z firefoksem czy może szerzej z moim systemem. Jechałem na jednym /homie dobre 6 lat i ostatnio różne cuda się tam zdarzały. Teraz jestem świeżo po nowej instalce ubu 9.10 z nowym homem i wszystko śmiga jak należy.