对于我目前正在开发的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
答案 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')