2013-06-05 18 views
7

Chciałbym kliknąć wyskakującą wiadomość, która pojawi się w mojej aplikacji testowej, jeśli jest obecna. Jestem nowy w kapibarze i nie mogę znaleźć sposobu, aby to zrobić. Mam doświadczenia z Watir i jeśli robią to z Watir byłoby coś takiego:kliknij element, jeśli istnieje w kapibarze

if browser.link(:text, "name").exists? do 
    browser.link(:text, "name").click 
end 

Jak mogę zrobić to samo w kapibary? Uwaga: ten link nie zawsze będzie się pojawiał, dlatego chciałbym mieć instrukcję if.

+0

Jeśli piszesz deterministycznego testu nie powinieneś wiedzieć * * jeśli to okienko będzie istnieć, czy nie? Dlaczego najpierw sprawdzasz istnienie, zamiast po prostu iść prosto do kliknięcia? – nzifnab

+0

@ nzifnab ponieważ jeśli element nie istnieje, metoda "kliknij" nie powiedzie się –

+0

@Andrey Ale ponieważ piszesz * test * powinieneś WIEDZIEĆ, czy element powinien tam być, czy nie. Dlatego metoda kliknięcia POWINIEN się nie powieść, ponieważ oczekiwania testowe zawodzą. Nie? – nzifnab

Odpowiedz

-3

Czy próbowałeś zrobić coś takiego:

if page.find('.id') do 
    click_link('Some Link') # or page.find('.id').click 
else 
    page.should_not have_selector('.id') # or something like that 
end 
+1

Dzięki Whitney !!! Udało mi się to zrobić za pomocą page.find wewnątrz instrukcji if – user1523236

+2

@ user1523236, jeśli nie ma elementu pasującego do takiego selektora 'find', który rzuci wyjątek' Capybara :: ElementNotFound'. Więc jeśli link nie istnieje, ten kod nie zadziała –

+0

link = first ('') ma 'find' w nim, po prostu znajduje pierwsze łącze ... jeśli cokolwiek jest przekazywane do find nie istnieje, to będzie rzucić ten sam wyjątek. –

22

Prosta kodu głowy jest po prostu powołać się has_link? dopasowywania i następnie click_link działanie:

if page.has_link?('name') 
    page.click_link('name') 
end 

Ale to nie być najszybsza rozwiązanie, ponieważ Capybara wykona dwa zapytania do sterownika, aby uzyskać element: pierwszy w has_link?, a drugi w click_link.

Lepszym wariantem może zrobić tylko jedno zapytanie, aby uzyskać element:

# This code doesn't check that an element exists only at one place and just chooses the first one 
link = first('name') 
link.click if link 

lub

# This code checks that element exists only at one place 
links = all('name') 
unless links.empty? 
    links.count.should == 1 
    link = links.first 
    link.click 
end 

Osobiście chciałbym pójść z has_link?/click_link realizacji jako drugiego wariantu does't sprawdź, czy element istnieje tylko w jednym miejscu, a trzeci jest za długi.

+0

To zadziałało dla mnie "click_link (" cokolwiek "), jeśli page.has_link? (" Cokolwiek ")' –

+0

'if ... do' tworzy błąd składniowy (przynajmniej na ruby ​​2.3.1), usuwając' do' rozwiązuje problem. – Pavelloz

-1

W przypadku użyłem has_css? zapytanie:

if page.has_css?("button #popUpButton") 
    click_button(#popUpButton") 
end 
Powiązane problemy