0

我们使用 Capybara 和 Chrome Headless 进行集成测试。我想写一个 linter,每次 chrome 导航到另一个页面时检查 HTML 结构上的一些指标。然后,当我们的 linter 出现问题时,我会提出一个错误。

我们有一些没有 javascript 的测试,并且猴子补丁 rack-test 到目前为止工作:

Capybara::RackTest::Browser.class_eval do
  alias_method :process_orig, :process
  def process *args
    response = process_orig *args
    # do some linting
    response
  end
end

但是我还没有在 Capybara 和/或 Chrome Headless 中找到可以拦截响应并检查页面正文的方法。

页面更改时是否可以触发挂钩?或者是否有某种 API Chrome 提供了我可以获取每个请求的正文的地方?或者代理会是一个可行的解决方案吗?

4

2 回答 2

1

Capybara 无法直接实现这一点,因为它实际上并不知道浏览器中发生的页面转换/请求,除非它们是专门由用户发起的visit.

做你想做的事的一种潜在方法是使用像puffing-billy这样的可编程代理来处理对被测应用程序的每个请求。如果你使用puffing-billy你会想看看这个pass_request功能 - https://github.com/oesmith/puffing-billy#in-your-tests-capybarawatir - 转发初始请求,然后做任何你想做的响应.

于 2018-07-13T16:26:26.167 回答
0

我不会将 capybara 测试与 HTML linting 纠缠在一起。此刻它看起来很聪明,因为您会获得一个 URL 列表,以便在每次测试中免费检查,但是:

  • 您可能会对每个 URL 进行几次 lint,因为有些测试会通过它
  • 您可能会因为 HTML 不完美而失败,即使您正在测试的功能实际上还可以。

您可能有类似 sitemap.xml 或所有可用 URL 的其他来源。我会用它来做一个单独的检查,这很简单:请求 URL,检查响应。冲洗并重复。

如果仍然不相信,请尝试使用page.html并做某事

expect(page.html).to pass_linter

https://github.com/teamcapybara/capybara#debugging

然后,您可以根据需要将其添加around为每个type: :feature规范的挂钩。

编辑:这是另一种解决方法,可以让每个访问的路径。如果访问路径,只需解析服务器日志文件(像这样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=   

并将其用于棉绒。

于 2018-07-13T14:28:44.780 回答