Capybara - nowy (lepszy?) webrat

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 :slight_smile: )

Super. W przyszłym roku pewnie spróbuję. :slight_smile:

Ło, rewelacja! Po releasie M (jak miłość :wink: ) obowiązkowo to przeczołgujemy podczas następnego sprintu :smiley:

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?

Juz nie moge sie doczekac

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

Capybara.current_session.driver.browser

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

Możesz wkleić tutaj jak wygląda ten test?

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?

@Piotr Misiurek:
Możesz jeszcze spróbować posiłkować się(w env.rb):

Capybara.debug = true

EDIT: zobacz ten post:
http://groups.google.com/group/ruby-capybara/browse_thread/thread/97207727fb1ff4ee
U mnie był podobny problem, zmieniłem w capybarze domyślny serwer na webricka.

Przestały się uruchamiać. Włącza się puste okno przeglądarki i to by było na tyle.

Powoli zaczynam myśleć, że to może nie błąd, tylko fjuczer, bo jak sie doda nowy scenario, to znów wszystko ładnie pójdzie ten raz czy dwa.

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

Taki dobry dzien mialem, wolne od pracy, a Ty musiales przypomniec ten paskudny babol z focusem :wink:

Zawsze do usług :wink:

A w temacie jeszcze post Huberta, na który przypadkiem ostatnio wpadłem:
http://hubertlepicki.com/2010/01/09/perfect-solution-for-testing-rails-applications-rspec-cucumber-capybara-selenium-2-0

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