2012-12-14 8 views
13

Poniższe działa zgodnie z oczekiwaniami:Jak połączyć wyszukiwanie i używanie przy użyciu Capybara?

within('h2', text: 'foo') do 
     should have_content 'bar' 
end 

Próbuję sprawdzić obrębie elementu nadrzędnego, używając find(:xpath, '..')

Po znalezieniu elementu, jak stosować .find(:xpath, '..'), a następnie sprawdzić, czy czegoś w ciągu ten element?

+0

Dlaczego po prostu nie użyć pojedynczej instrukcji XPath? –

+0

Znajduję 'h2 ', tekst:' foo'' bardziej czytelny. –

+1

Miałem na myśli twoje ostatnie zdanie: Zamiast stosowania jednego XPath, a potem innego, możesz użyć pojedynczego XPath. –

Odpowiedz

16

Kiedy używasz XPath lokalizator wewnątrz within powinien zacząć . (jeśli nie zacząć . wyszukiwanie odbywa się nie w ciągu .myclass ale w całym dokumencie).

Np .:

within('.myclass') do 
    find(:xpath, './div') 
end 

czyli

find('.myclass').find(:xpath, './div') 

Code od użytkownika @ BSeven odpowiedź może być napisany w jednym wierszu:

expect(find("//h2[text()='foo']/..")).to have_text('bar') 

lub

expect(page).to have_xpath("//h2[.='foo']/..", text: 'bar') 
+0

Jeśli używam ''./p [@ class = test]', to nie jest on w stanie znaleźć, jeśli użyję' '// p [@ class = test]' 'jego pasujący sam element i inny element poza elementem nadrzędnym .. Pomóżcie – pahnin

+0

To zadziałało z '.// p [@ class = test]' – pahnin

+0

'. /' Działa idealnie, dzięki! – thewoolleyman

4

Poniżej jedno podejście:

within('h2', text: 'foo') do 
    within(:xpath, '..') do 
    should have_content 'bar' 
    end  
end 
+1

To samo można zrobić w jednym wierszu: 'find (" // h2 [text() = 'foo']/.. "). Should have_content 'bar'' –

2

Dzięki nowej składni rspec po 2.11, powinno być;

within('h2', text: 'foo') do |h| 
    expect(h).to have_content 'bar' 
end