Capybara :: ElementNotFound:无法找到可见的链接

时间:2017-11-23 08:58:44

标签: ruby-on-rails rspec capybara admin

我的测试方法有问题,管理员可以通过点击“推广到管理员”来推广其他用户管理。它位于我的控制器中,我正在为它编写功能测试。我正在使用Rails 5.1.4。

  def promote
   @user = User.find(params[:user_id])
   if @user.toggle!(:admin)
    flash[:success] = "User is promoted to admin."
    redirect_to root_path
   else
    flash[:notice] = "Can't promote."
    redirect_to root_path
   end
  end

这是测试:

describe "Promotion" do
 before do
  login_as(User.create!(name: "lala", email: Faker::Internet.email, 
  password: "lalala", admin: true))
  visit users_path
 end

context "to admin" do
 it "promotes user to admin" do
  click_link("Promote to Admin", :match => :first)
  expect(current_path).to eq user_promote_path
 end
end
end

它给了我错误:Capybara :: ElementNotFound:        无法找到可见的链接“推广到管理员” 我认为是因为我没有访问正确的页面,尝试以管理员身份登录可能无法正常工作。 任何建议都将非常感谢!

2 个答案:

答案 0 :(得分:0)

如果您想确定自己位于正确的页面上,可以使用以下命令进行调试:

  • save_and_open_page(打开浏览器)
  • save_and_open_screenshot(截屏并打开)

如果一切都很好,也许Capybara无法找到链接:它是屏幕尺寸/响应问题吗?如果是,您可以配置Capybara使用的窗口大小(请参阅此link

如果测试仍未通过,默认情况下链接可能不可见? 您可以在visible: false中添加选项click_link以精确确定。{/ p>

答案 1 :(得分:0)

您测试失败的最可能原因是您似乎没有创建除您登录的用户之外的任何其他用户。如果还没有,那么就没有任何用户可以显示“推广到管理员”的链接。您可以随时保存页面,也可以puts page.html来确保您对页面的看法实际存在。

您的测试的第二个问题是您不应该将eq匹配器与current_path一起使用。你应该使用Capybara提供的路径匹配器,你想要稳定的测试

expect(page).to have_current_path(user_promote_path)