2012-11-06 54 views
5

Làm cách nào để tôi có thể viết thử nghiệm rspec cho nội dung Iframe? iframe của tôi trông giống nhưKiểm tra Rspec cho nội dung iframe

<iframe src="/any url" name="Original"> 
    ... 
    <div>test </div> 
</iframe> 

giữa iframe bất kỳ nội dung nào, tôi muốn viết trường hợp kiểm tra rspec cho nội dung đó. Làm thế nào tôi có thể làm được ?

làm cách nào tôi có thể kiểm tra "thử nghiệm" nằm trong khung nội tuyến bằng cách sử dụng rspec? Tôi viết dưới đây nhưng không vượt qua

page.should have_content("test") 

lỗi như

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

tôi sử dụng Capybara - 1.1.2 và rspec - 2.11.0 và đường ray 3.2.8

+0

Theo [câu trả lời này] (http://stackoverflow.com/questions/6890364/capybarawebkit-unable-to-find-iframe-or-its-content), bạn cần đợi khung nội tuyến tải. Điều gì xảy ra nếu bạn ngủ trong vài giây trong spec trước khi kiểm tra 'has_content'? –

+1

@shioyama - 'nên have_content' đã chờ (theo mặc định 2 giây). – skalee

+0

@skalee oh không biết điều đó.hấp dẫn. –

Trả lời

5

Sau một làm việc với trình điều khiển selen, có thể với các trình điều khiển khác quá, nhưng không phải cho 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

Trong trường hợp của tôi, tôi cần phải kiểm tra một iframe mà không có tên và id. ví dụ

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 

vì vậy tôi không thể tìm thấy khung nội tuyến trong bất kỳ cách nào, cho đến khi tôi tìm thấy ví dụ này trong ruột Capybara. Capybara source code

Với mà tôi nhận giải pháp này:

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

Đáp từ trên cao là rất lớn, mặc dù tôi vẫn muốn mở rộng chúng với những điều sau đây:

Nếu bạn chỉ muốn khẳng định rằng chắc chắn văn bản có trong một trang và muốn tự động kiểm tra bên trong bất kỳ iframe hiện tại nào, sau đó tôi đã thực hiện mã chung này sẽ thực hiện điều đó:

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 

Lưu ý rằng nó tiếp tục kiểm tra trang cho đến khi số giây đã cho được đáp ứng bởi bộ hẹn giờ bắt đầu hoặc cho đến khi tìm thấy văn bản đã cho bên trong trang hoặc khung nội tuyến. Tôi tin rằng mã này khá rõ ràng và dễ hiểu, mặc dù cho tôi biết nếu bạn có bất kỳ câu hỏi nào.

Các vấn đề liên quan