2013-02-19 8 views
29

Mam następujący test w żądaniu specyfikacji:kapibary click_link z: href meczu

page.should have_link('Edit user', :href => edit_users_path(@user)) 

ten sprawdza, czy określony użytkownik w widoku indeksu ma link Edytuj. Chciałbym kliknij ten sam związek, z czymś takim:

click_link('Edit user', :href => edit_users_path(@user)) 

Niestety click_link nie akceptuje opcji.

Czy jest to dobry sposób na zrobienie tego, wydaje się dość oczywistym przypadkiem użycia?

powinienem być w tym ID w tabeli <tr> lub <td> i robi coś takiego:

within(#user_id) 
    click_link 'Edit user' 
end 

wolałbym nie majstrować z poglądem, tylko po to żeby testy do pracy.

Odpowiedz

38

można użyć znaleźć find(:xpath, "//a[@href='/foo']").click

+1

To wstyd, że trzeba wyraźnie przejść do poziomu html, ale to działa, dziękuję! – jackpipe

+1

to daje Capybara :: ElementNotFound: Błąd .... –

11

skończyło się dodając moduł pomocniczy w spec/support/selectors.rb

module Selectors 
    Capybara.add_selector(:linkhref) do 
    xpath {|href| ".//a[@href='#{href}']"} 
    end 
end 

Następnie w testach używam

find(:linkhref, some_path).click 
+0

Jak radzisz sobie z "mieć"? tzn. page.should have_linkhref (...) – vanboom

+0

Naprawdę fajny pomysł! Dziękuję za udostępnienie. – Starkers

+0

@vanboom Możesz zdefiniować tę metodę def have_linkhref (href) Capybara :: RSpecMatchers :: HaveSelector.new (: linkhref, href) koniec I użyj jak oczekiwać (strona) .to have_linkhref url – icem

0

opuszczeniu pierwszego puste argument wydaje się pracować dla mnie ...

page.should have_link("", :href=>edit_comment_path(@comment)) 
+0

OP pyta, jak * Kliknij w link. Powiedział, że "powinien mieć link" działał –

12

Do tego celu można użyć interfejsu niższego poziomu Capybara. Spróbuj:

find("a[href='#{edit_users_path}']").click 
4

podstawie odpowiedzi @jackpipe (i moich wcześniejszych doświadczeń) I zbudować własną selektor Kapibara, oto kod dla modułu pomocniczego (spec/support/selectors.rb): przykład

module Selectors 
    # find(:href, 'google.com') 
    Capybara.add_selector(:href) do 
    xpath {|href| XPath.descendant[XPath.attr(:href).contains(href)] } 
    end 
end 

Zastosowanie:

find(:href, 'google') 

Jaka jest różnica?

To znajdzie dowolny link zawierający "google". Następujące elementy będą pasować:

www.google.com 
http://google.com 
fonts.google.com 
something.google.inside.com 

Co więcej, przeszukuje tylko wybrane selektory, np. within('header') { find(:href, 'google').click } będzie działać poprawnie.

+0

Dzięki, to naprawdę miłe. –