Ruby 拦截水豚铬无头访问

Ruby 拦截水豚铬无头访问,ruby,rspec,capybara,google-chrome-headless,rack-test,Ruby,Rspec,Capybara,Google Chrome Headless,Rack Test,我们使用水豚和铬无头进行集成测试。我想写一个linter,每次chrome导航到另一个页面时,它都会检查HTML结构上的一些指标。然后,当有东西对我们的门楣不利时,我会提出一个错误 我们有一些没有javascript的测试,到目前为止,monkey patching rack测试仍然有效: Capybara::RackTest::Browser.class_eval do alias_method :process_orig, :process def process *args

我们使用水豚和铬无头进行集成测试。我想写一个linter,每次chrome导航到另一个页面时,它都会检查HTML结构上的一些指标。然后,当有东西对我们的门楣不利时,我会提出一个错误

我们有一些没有javascript的测试,到目前为止,monkey patching rack测试仍然有效:

Capybara::RackTest::Browser.class_eval do
  alias_method :process_orig, :process
  def process *args
    response = process_orig *args
    # do some linting
    response
  end
end
但我还没有在水豚和/或Chrome Headless中找到一种可以截取响应并检查页面正文的方法


当页面更改时,是否可能触发挂钩?或者Chrome是否提供了某种API,我可以从中获取每个请求的主体?或者代理是一个可行的解决方案吗?

我不会将水豚测试与HTML linting混为一谈。现在看来这似乎很明智,因为每次测试都会得到一个免费的URL列表,但是:

  • 您可能会对每个URL进行几次lint,因为有些测试会对其进行测试
  • 您可能会失败,因为HTML并不完美,即使您正在测试的功能实际上还可以
您可能有类似sitemap.xml或其他所有可用URL的来源。我会用它做一个单独的检查,这很简单:请求URL,lint响应。冲洗并重复

如果仍然不确定,尝试使用
page.html
并做类似的事情

expect(page.html).to pass_linter

然后,如果需要,可以将其添加为每个
type::feature
spec的
around
hook

编辑:这里有另一个解决方法,可以让每个访问的路径。只需解析服务器日志文件(如下面的
cat log/devlopment.log | grep path
)即可获得访问路径的完整列表:

method=POST path=/users/login format=html controller=SessionsController action=create
status=302 duration=256.82 view=0.00 db=52.29 location=http://0.0.0.0:3000/platform/admin/dashboard params={"utf8"=>"✓", "authenticity_token"=>"ubGnWKOq8gbUE5C/aK375QQn5DpjHarUYxHtBLglGe6Lr9Ie3O5XPq90k5gr/SZbIPoDiiasvY0mGlwhzD/MsQ==", "user"=>{"email"=>"alex-3d51048235c9d1a8@toptal.io", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"} uid=983 remote_ip=127.0.0.1 x_forwarded_for= x_request_id=                
method=GET path=/admin/dashboard format=html controller=XXX action=show status=200 duration=3285.54 view=1051.32 db=2016.87 params={} uid=983 remote_ip=127.0.0.1 x_forwarded_for= x_request_id=   

并用它来起毛

这在使用Capybara时不可能直接实现,因为它实际上不知道浏览器中发生的页面转换/请求,除非它们是用户通过
visit
特别发起的


做你想做的事情的一个可能的方法是使用一个可编程的代理来处理对被测应用程序的每个请求。如果您使用
puffing billy
功能,您将需要查看
pass\u request
功能--转发初始请求,然后对响应执行任何操作。

谢谢您的回答。起毛本身很快,所以多次起毛不是问题。然而,维护每次有人引入新URL时都必须检查的URL列表会导致大量手动工作。当然HTML不是完美的,但我不是在验证一个完美的HTML文档,只是一些更大的指标,比如“每页只有一个h1标记”之类的东西。你说得对。我添加了一种可能适合您的方法。不要在水豚身上寻找钩子——在你的规格和用户
page.html
(参见我的更新答案)上设定期望值,谢谢你的更新。我已经尝试了一个环绕钩子,但是当一个测试在多个页面中导航时,我希望将它们中的每一个都去掉,而不仅仅是最后一个。因此,我认为google chrome的某种挂钩是强制性的,那么在运行capybara测试时,也许你可以使用日志文件来获取每个访问的路径?我在测试中,所以当测试结束时,资源将被清理,路径将不再可访问