6

如何为 iframe 内容编写 rspec 测试?我的 iframe 看起来像

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

在 iframe 无论内容之间,我想为该内容编写 rspec 测试用例。我能怎么做 ?

我如何使用 rspec 检查 iframe 中的“测试”?我在下面写但没有通过

page.should have_content("test")

错误如

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

我使用 capybara - 1.1.2 和 rspec - 2.11.0 和 rails 3.2.8

4

3 回答 3

7

以下一个适用于 selenium 驱动程序,也可能适用于其他驱动程序,但不适用于 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>

规格:

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
于 2012-11-06T12:11:18.373 回答
2

就我而言,我需要检查一个没有名称或 ID 的 iframe。例如

html

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

rspec

expect(page).to have_content "From email@test.html"

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

所以我无法以任何方式找到 iframe,直到我在水豚内脏中找到了这个例子。水豚源代码

有了这个我得到了这个解决方案:

expect(page).to have_content "From email@test.html"

within_frame find('iframe.body') do
  expect(page).have_content 'You can confirm your account email through the link below:'
end
于 2016-10-15T17:08:47.057 回答
2

上面的答案很棒,尽管我仍然想用以下内容扩展它们:

如果您只想断言页面中存在某些文本并想自动检查任何现有 iframe 内部,那么我执行了以下通用代码来完成此操作:

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

请注意,它会一直检查页面,直到启动的计时器达到给定的秒数,或者直到在页面或 iframe 中找到给定的文本。我相信代码非常清晰易懂,但如果您有任何问题,请告诉我。

于 2017-03-16T17:45:13.910 回答