拦截水豚 chrome 无头访问
Intercept capybara chrome headless visits
我们使用 Capybara 和 Chrome Headless 进行集成测试。我想写一个 linter,它会在每次 chrome 导航到另一个页面时检查 HTML 结构上的一些指标。然后当某些东西与我们的 linter 不一致时,我会提出错误。
我们有一些没有 javascript 的测试,到目前为止,monkey patching 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 中找到方法 and/or Chrome Headless 我可以拦截响应并检查页面正文。
是否可以在页面更改时触发挂钩?或者是否有某种 API Chrome 提供了我可以获得每个请求正文的地方?或者代理会是一个可行的解决方案吗?
我不会将水豚测试与 HTML 检测混为一谈。这一刻看起来很聪明,因为您会得到一个 URL 的列表,可以在每次测试中免费检查,但是:
- 您可能每次 URL 都会检查几次,因为有些测试会通过它
- 您可能会失败,因为 HTML 并不完美,即使您正在测试的功能实际上还可以。
您可能有类似 sitemap.xml 或所有可用 URL 的其他来源。我会用它来进行单独的检查,这很简单:请求 URL,检查响应。冲洗并重复。
如果仍然不相信,请尝试使用 page.html
并执行类似
的操作
expect(page.html).to pass_linter
https://github.com/teamcapybara/capybara#debugging
如果需要,您可以将其添加为每个 type: :feature
规范的 around
挂钩。
编辑:这是让每个访问路径的另一种解决方法。只需解析服务器日志文件(如 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=
并将其用于 linting。
Capybara 无法直接做到这一点,因为它实际上并不知道浏览器中出现的页面 transitions/requests,除非它们是用户使用 visit
专门启动的。
一种可能的方法是使用像 puffing-billy to handle every request to the app under test. If you use puffing-billy
you'll want to look at the pass_request
feature - https://github.com/oesmith/puffing-billy#in-your-tests-capybarawatir 这样的可编程代理 - 转发初始请求,然后根据响应做任何你想做的事。
我们使用 Capybara 和 Chrome Headless 进行集成测试。我想写一个 linter,它会在每次 chrome 导航到另一个页面时检查 HTML 结构上的一些指标。然后当某些东西与我们的 linter 不一致时,我会提出错误。
我们有一些没有 javascript 的测试,到目前为止,monkey patching 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 中找到方法 and/or Chrome Headless 我可以拦截响应并检查页面正文。
是否可以在页面更改时触发挂钩?或者是否有某种 API Chrome 提供了我可以获得每个请求正文的地方?或者代理会是一个可行的解决方案吗?
我不会将水豚测试与 HTML 检测混为一谈。这一刻看起来很聪明,因为您会得到一个 URL 的列表,可以在每次测试中免费检查,但是:
- 您可能每次 URL 都会检查几次,因为有些测试会通过它
- 您可能会失败,因为 HTML 并不完美,即使您正在测试的功能实际上还可以。
您可能有类似 sitemap.xml 或所有可用 URL 的其他来源。我会用它来进行单独的检查,这很简单:请求 URL,检查响应。冲洗并重复。
如果仍然不相信,请尝试使用 page.html
并执行类似
expect(page.html).to pass_linter
https://github.com/teamcapybara/capybara#debugging
如果需要,您可以将其添加为每个 type: :feature
规范的 around
挂钩。
编辑:这是让每个访问路径的另一种解决方法。只需解析服务器日志文件(如 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=
并将其用于 linting。
Capybara 无法直接做到这一点,因为它实际上并不知道浏览器中出现的页面 transitions/requests,除非它们是用户使用 visit
专门启动的。
一种可能的方法是使用像 puffing-billy to handle every request to the app under test. If you use puffing-billy
you'll want to look at the pass_request
feature - https://github.com/oesmith/puffing-billy#in-your-tests-capybarawatir 这样的可编程代理 - 转发初始请求,然后根据响应做任何你想做的事。