2012-11-06 12 views
5

Jak mogę napisać testowanie rspec dla zawartości Iframe? Moje ramki iframe wyglądają jak iframe, niezależnie od zawartości, chcę napisać przypadek testowy rspec dla tej treści. Jak mogę zrobić?Badanie Rspec dla zawartości iframe

Jak mogę sprawdzić "test" w elemencie iframe za pomocą rspec? Piszę poniżej, ale nie przechodzą

page.should have_content("test") 

błąd jak

Failure/Error: page.should have_content("test") 
     expected there to be content "test" in "Customize .... 

używam kapibary - 1.1.2 oraz rspec - 2.11.0 i szyn 3.2.8

+0

Zgodnie z [tą odpowiedzią] (http://stackoverflow.com/questions/6890364/capybarawebkit-unable-to-find-iframe-or-its-content) należy poczekać na załadowanie elementu iframe. Co się stanie, jeśli spać przez kilka sekund w specyfikacji przed testowaniem 'have_content'? –

+1

@shioyama - 'should have_content' już czeka (domyślnie 2 sekundy). – skalee

+0

@skalee oh nie wiedziałem tego.ciekawy. –

Odpowiedz

5

Po jednym współpracuje z sterownik selenu, prawdopodobnie z innymi sterownikami, ale nie dla testu rack_test.

/index.html:

<!DOCTYPE html> 
<html> 
    <body> 
    <h1>Header</h1> 
    <iframe src="/iframer" id='ident' name='pretty_name'></iframe> 
    </body> 
</html> 

/iframer.html:

<!DOCTYPE html> 
<html> 
    <body> 
    <h3>Inner Header</h3> 
    </body> 
</html> 

Spec:

visit "/" 
page.should have_selector 'h1' 
page.should have_selector 'iframe' 

page.within_frame 'ident' do 
    page.should have_selector 'h3' 
    page.should have_no_selector 'h1' 
end 

page.within_frame 'pretty_name' do 
    page.should have_selector 'h3' 
    page.should have_no_selector 'h1' 
end 
1

W moim przypadku musiałem sprawdzać iframe że nie mieć imię i nazwisko lub id. np

html

<iframe class="body" src='messages/1.html'>...</iframe> 

rspec

expect(page).to have_content "From [email protected]" 

within_frame '.body' do 
    expect(page).have_content 'You can confirm your account email through the link below:' 
end 

więc nie mogłem znaleźć iframe w jakikolwiek sposób, aż znalazłem ten przykład w wnętrzności kapibary. Capybara source code

Dzięki, że mam z tego rozwiązania:

expect(page).to have_content "From [email protected]" 

within_frame find('iframe.body') do 
    expect(page).have_content 'You can confirm your account email through the link below:' 
end 
0

odpowiedzi z góry są świetne, choć mimo to postanowił przedłużyć ich z następujących czynności:

Jeśli chcesz po prostu stwierdzić, że pewne tekst jest obecny na stronie i chciałby automatycznie sprawdzić wewnątrz dowolnych obecnych elementów iframe, a następnie wykonałem ten ogólny kod, który to umożliwi:

Then (/^I should see the text "(.*?)" in less than "(.*?)" seconds$/) do |text,time| 
    result = false 
    Capybara.default_wait_time = 5 
    time_start = Time.now 
    begin 
     time_running = Time.now - time_start #Calculate how much time have been checking 
     result = page.has_text?(text) 
     unless result #If not found in normal DOM, look inside iframes 
      if page.has_css?("iframe") #Check inside iframes if present 
       (page.all(:css,"iframe")).each do |element| #If multiple iframes found, check on each of them 
        within_frame(element) do 
         result = page.has_text?(text) 
         break if result #Stop searching if text is found 
        end 
       end 
      end 
     end 
    end until (time_running.to_i >= time.to_i) || (result == true) 
    expect(result).to be true 
end 

Należy zauważyć, że stale sprawdza stronę, dopóki podana ilość sekund nie zostanie osiągnięta przez uruchomiony timer lub dopóki dany tekst nie znajdzie się na stronie lub elemencie iframe. Uważam, że kod jest dość jasny i łatwy do zrozumienia, ale daj mi znać, jeśli masz jakieś pytania.

Powiązane problemy