1

我正在使用 Twitter Bootstrap 和 poltergeist。我试图隐藏一些移动分辨率的元素,例如:

看法:

<th class="hidden-phone">Email</th> ....

CSS:

.hidden-phone {
  display: none !important;
}

规格:

context 'Phone', js: true do
  it 'should hide some elements' do
    page.driver.resize 320, 480
    visit my_path

    within '#members_list thead tr' do
      expect(page).not_to have_content 'Email'
    end
  end
end

但测试没有通过:

Failure/Error: expect(page).not_to have_content 'Email'
   expected content "Email" not to return anything

可能有什么问题?当我使用 page.driver.render 进行屏幕转储时,元素被隐藏。

4

2 回答 2

1

方法的默认选项have_content将查找所有文本,忽略隐藏的内容。

尝试

expect(page).not_to have_content(:visible, 'Email')

此处的文档http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_text%3F-instance_method

于 2013-06-03T20:30:50.173 回答
0

我从您的示例中猜测是该元素正在使用 javascript 或某些异步行为隐藏,因此在评估断言时它可能仍然可见。

为了让它等待元素隐藏或不可见,您可以使用 Capybara API 中的构建(我假设您正在使用 Capybara),它为异步行为提供了良好的支持。所以不要使用断言:

expect(page).not_to have_content 'Email'

您可以使用:

page.should_not have_selector("#members_list thead tr", :text => "Email")

或者:

page.find("#members_list thead tr").should_not have_content("Email")

只需检查 CSS 选择器是否符合您正在评估的元素。

有关这两种结构如何工作或行为的更多说明,请参阅以下参考资料: Capybara - Asynchronous JavaScript (Ajax and friends)
Why wait_until was removed from Capybara

如果考虑到元素等待缓慢的 AJAX 请求而需要很长时间才能隐藏元素,则可以通过在文件中指定以下内容来增加Capybara等待时间TimeOutErrorspec_helper.rb

Capybara.default_wait_time = 30

并且还让poltergeist司机在超时之前等待更多时间:

Capybara::Poltergeist::Driver.new(app, { timeout: 40 }
于 2013-06-07T22:02:36.853 回答