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.
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'? –
@shioyama - 'should have_content' już czeka (domyślnie 2 sekundy). – skalee
@skalee oh nie wiedziałem tego.ciekawy. –