如何用Capybara测试现场能见度?

时间:2017-06-23 18:18:20

标签: rspec capybara

注意:这个问题是关于使用Capybara 1.1.2,而不是当前版本。

我有一个隐藏的文本字段和一个使其可见的按钮。

隐藏文字字段:

<input type="text" name="Franchise Name" id="new_franchise_name" placeholder="Franchise Name" style="display:none;" />

按钮和js事件处理程序使上面的字段可见:

<button class="btn btn-medium" id="create_franchise" data-remote="true" >Create New Franchise</button>

$('#create_franchise').click(function(){
  $('#new_franchise_name').css('display', 'inline-block');
}

在我的测试中,我有以下内容:

page.all('#new_franchise_name') #=> returns array with text input
Capybara.ignore_hidden_elements = true
page.all('#new_franchise_name') #=> returns empty array as expected
page.find_button('Create New Franchise').click #=> sets the input css "display:inline-block"
page.all('#new_franchise_name') #=> still returns empty array. Should include the text field

我已经探索了其他一些方法,但这似乎是最直接的...除了它不起作用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

注意:这个答案适用于Capybara的当前(2.14.3当前)版本。只有在讨论之后,OP才会使用Capybara 1.1.2,行为明显不同

一些事情

  1. 如果您正在测试应用,请不要更改Capybara.ignore_hidden_​​elements(只需将其保留为默认值),在您希望Capybara的查询中使用visible选项&# 34;参见&#34;不可见的元素。 page.find('#new_franchise_name', visible: :all)

  2. 当您需要单个元素(任何具有id的内容)时,请远离all以支持findall有许多缺点,其中最重要的是除非您传递其中一个计数选项,否则它不会等待元素出现。 (first具有相同的缺点)

  3. 当您不需要其他任何元素时,测试时使用断言/期望而不是find

  4. 考虑到这些因素,您的测试应该写成

    expect(page).not_to have_css('#new_franchise_name')  # or  .to have_no_css(...)
    page.click_button('Create New Franchise')
    expect(page).to have_css('#new_franchise_name')
    

    如果由于某种原因您将默认设置Capybara.ignore_hidden_elements更改为false,那么测试可以写为

    expect(page).not_to have_css('#new_franchise_name', visible: true)  # or  .to have_no_css(...)
    page.click_button('Create New Franchise')
    expect(page).to have_css('#new_franchise_name', visible: true)