我想使用 Capybara 和 rspec 验证页面上没有断开的链接

问题描述

我使用下面的代码来验证页面上没有使用 RSpec 和水豚的断开链接

然后(“我希望主页上没有损坏的链接”)做

allinks = page.all('a')
allinks.each do |link|
  get link[:href]
  expect(page.status_code).to eq(200)
end

我对第 1 行的代码感到困惑。 4 和 5. 我正在尝试使用机架测试方法“get”来检查链接而不重定向链接。 即使响应代码从 200 更改为 400,代码也不会抛出任何错误并通过。

解决方法

当你这样做时,我不确定 Capybara 发生了什么(我很久没用了) 我怀疑 page 是您当前“进入”的页面,可能已经记住了。

我建议您尝试使用例如 httparty

单独获取 URL
response = HTTParty.get(link[:href])
expect(response.code).to eq(200)

相对 href 属性可能存在问题,例如

<a href="/home">I skipped domain</a>

但这超出了这个问题的范围。

,

您是否正在尝试检查您的所有页面是否都没有损坏,即它们是否从 GET 请求中以正确的状态代码 (200) 响应?

我为此编写了此测试。您几乎可以将其复制粘贴到任何 Rails 5 应用程序中。


describe Rails.application.routes do
  describe '#get',type: :request do
    # This gets rails routes
    let(:routes_info) { described_class.routes }
    # this select GET routes
    let(:routes_get) { routes_info.select { |r| r.verb == 'GET' } }
    let!(:user) { create(:user) }

    specify 'GET routes returns 200,301 or 302 code' do
      routes_get.each do |route|
        # parsing routes to a correct uri format
        route = route.path.spec.to_s.gsub(/\(.:format\)*$/,'')

        # route_with_params will replace ':security_token' with a test security token
        get route_with_params(route,user)
        expect(response.status).to eq(200).or eq(301).or eq(302)
      end
    end

    def route_with_params(route,user)
      route.gsub!(':security_token',user.security_token)
    end
  end
end

这里增加的复杂性是某些 GET 页面需要用户安全令牌,因此我必须为测试创建一个。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...