Capybara没有通过id找到登出链接

时间:2015-04-15 21:48:02

标签: ruby-on-rails rspec capybara

对于我目前正在开发的rails应用程序,我最近稍微更改了设计,以便注销链接不再具有锚文本“注销”,而是来自twitter bootstrap的glyphicon。链接的html现在看起来像这样:

<a class="btn btn-primary btn-sm" data-method="delete" href="/users/sign_out" rel="nofollow">
  <span class="glyphicon glyphicon-log-out"></span>
</a>

同时我的水豚测试看起来像这样:

context "when not logged in" do

  it 'cannot create wikis' do
    @free_user = create(:user)
    login_as(@free_user, :scope => :user)

    click_link "Sign out"

    visit root_path
    expect(page).to_not have_link('Create wiki')
  end
end

现在文本“退出”不再存在,我需要一种新方法来识别链接。检查capybara(或更确切地说是this handy cheatsheet)的文档,看起来我可以提供 链接的文本或其ID。所以我试着给它一个id:

<a class="btn btn-primary btn-sm" data-method="delete" href="/users/sign_out" id="signout" rel="nofollow">
  <span class="glyphicon glyphicon-log-out"></span>
</a>

所以现在它有一个“注销”的ID,但是当我对测试进行此更改时,它仍然无法通过。

  1) Standard (free) User when not logged in cannot create wikis
     Failure/Error: click_link "signout"
     Capybara::ElementNotFound:
       Unable to find link "signout"
     # ./spec/features/standard_user_role_spec.rb:107:in `block (3 levels) in <top (required)>'

我尝试通过创建和登录用户来确保我仍然是测试中的用户,如上所示并添加一个检查页面上的html包含Hello,因为它显示“Hello”和用户登录时的用户名:

expect(page).to have_content('Hello')

这给了我另一个我不理解的错误:

  1) Standard (free) User when not logged in cannot create wikis
     Failure/Error: expect(page).to have_content('Hello')
     Capybara::ElementNotFound:
       Unable to find xpath "/html"
     # ./spec/features/standard_user_role_spec.rb:107:in `block (3 levels) in <top (required)>'

那么可能会发生什么?

完整规格here

2 个答案:

答案 0 :(得分:1)

您可以重新添加文字,但要将其隐藏在除屏幕阅读器之外的所有文字中:

<a class="btn btn-primary btn-sm" data-method="delete" href="/users/sign_out" id="signout" rel="nofollow">
  <span class="sr-only">Sign out</span>
  <span class="glyphicon glyphicon-log-out"></span>
</a>

这也有点改善了可访问性。

context "when not logged in" do

  it 'cannot create wikis' do
    @free_user = create(:user)
    login_as(@free_user, :scope => :user)

    visit root_path
    click_link "Sign out", visible: false 

    expect(page).to_not have_link('Create wiki')
  end
end

请注意,我们明确告诉Capybara使用visible选项查找隐藏文字。

答案 1 :(得分:-1)

对于使用JS的应用程序,这意味着使用例如json格式发送请求,并通过单击链接开始触发。 (假设HTML标记相同)。以下调用非常有用:

find('Sign Out', visible: false).trigger('click')

id(如果您要添加):

find(:css, "#sign-out", visible: false).trigger('click')