Перехват капибары хром безголовых визитов

Мы используем Capybara вместе с Chrome Headless для интеграционного тестирования. Я хотел бы написать линтер, который проверяет некоторые метрики в структуре HTML каждый раз, когда Chrome переходит на другую страницу. Тогда я бы поднял ошибку, когда что-то против нашего линтера.

У нас есть несколько тестов без javascript, и тестирование стойки в режиме monkey patting работает до сих пор:

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, где я мог бы получить тело каждого запроса? Или прокси будет возможным решением?

2 ответа

Решение

Это не возможно напрямую с Capybara, так как он на самом деле не знает о переходах / запросах страниц, которые происходят в браузере, если они не инициированы пользователем специально с visit,

Потенциальным способом сделать то, что вы хотите, было бы использование программируемого прокси-сервера, такого как puffing-billy, для обработки каждого запроса к тестируемому приложению. Если вы используете puffing-billy Вы хотите посмотреть на pass_request особенность - https://github.com/oesmith/puffing-billy - пересылать по первоначальному запросу и затем делать с ответом все, что вы хотите.

Я бы не стал путать тесты на капибару с HTML-линтингом. В данный момент это может показаться умным, поскольку вы получаете список URL-адресов, которые нужно бесплатно проверять при каждом тестировании, но:

  • Вы, вероятно, скопировали бы каждый URL несколько раз, потому что некоторые тесты проходят его
  • Вы можете столкнуться с ошибками, потому что HTML не идеален, хотя тестируемая вами функция на самом деле в порядке.

Возможно, у вас есть что-то вроде sitemap.xml или других источников всех доступных URL. Я бы использовал его, чтобы сделать отдельную проверку, которая будет простой: запросить URL-адрес, получить ответ. Промыть и повторить.

Если вы все еще не уверены, попробуйте использовать page.html и делать что-то вроде

expect(page.html).to pass_linter

https://github.com/teamcapybara/capybara

Затем вы можете добавить его как 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=   

и использовать его для ворса.

Другие вопросы по тегам