Ferrum — бесстрашный Ruby-драйвер для Chrome с открытым исходным кодом

5cef89d942bb274c48454a6ee84bdb43

Если вы хотите запустить интеграционные тесты на своем сайте, у вас есть три варианта: Poltergeist, Selenium и новое секретное оружие — Ferrum.

  • Poltergeist — отличный, но, к сожалению, сейчас он действительно устарел.

  • Selenium требует установки дополнительного программного обеспечения, он медленнее и не даёт полного контроля над браузером. Это определенно не то, что нужно.

  • Ferrum работает быстрее, чем Selenium, нет необходимости устанавливать дополнительное программное обеспечение, и с его помощью вы получаете полный контроль над браузером.

В 1970-х годах, когда Unix впервые появился на горизонте, почти всё работало в headless-режиме: подавляющее большинство инструментов, которые использовались, просто не имели какого-либо видимого интерфейса, за исключением сообщений об ошибках, когда что-то пошло не так.

Философия Web-проектов, как правило, немного отличается от философии Unix. Они могут развиваться разными способами, и нам постоянно приходится идти на компромиссы. Интерпретируемые языки, динамическая типизация и автоматическое управление памятью делают жизнь намного проще, чем инструменты, с которыми приходилось работать разработчикам оригинальных Unix-систем. Всё это позволяет писать очень читаемый код, но он может быть подвержен ошибкам. Чем быстрее мы сможем написать интеграционные тесты и запустить их, тем меньше шансов пропустить ошибку: и тут в игру вступает Ferrum, написанный нашим коллегой Дмитрием.

Встречайте CDP

CDP расшифровывается как «Chrome DevTools Protocol». Это не что-то новое, вы, вероятно, видели Web Inspector в Chrome: CDP — это то, что приводит его в действие.

Сам CDP — довольно простой протокол, основанный на JSONRPC. API разделен на несколько доменов, ориентированных на различные аспекты Chrome: основное приложение браузера находится в домене браузера, конкретная страница обрабатывается доменом страницы, вы можете взаимодействовать с деревом DOM с помощью методов в домене DOM и так далее. Существует довольно много разных доменов, каждый из которых имеет свой собственный набор методов, которые вы можете вызывать.

Ferrum — секретное оружие для Chrome

Теперь, когда мы познакомились с CDP, давайте перейдем к Ferrum. Ferrum — это Ruby gem, который контролирует Chrome через WebSocket с использованием протокола Chrome DevTools и предоставляет высокоуровневый API к нему.

Давайте попробуем использовать Ferrum, чтобы сделать скриншот главной страницы Google:

browser = Ferrum::Browser.new
browser.goto("https://google.com")
browser.screenshot(path: "google.png")
browser.quit

И это все! Использовать Ferrum действительно проще простого.

То, что его легко использовать, не значит, что он не способен на многое: существует уже множество CDP-функций, помимо базовой навигации, поиска и скриншотов. Вы можете перехватывать сетевой трафик, подменять реальные ответы «заглушками», управлять аутентификацией и изменять файлы cookie, заголовки и сценарии. Вы даже можете отправлять события мыши и клавиатуры, которые неотличимы от реальных!

(Единственное, что Ferrum не может сделать, это ввести CAPTCHA за вас… пока что).

Полностью поточно-ориентированное управление

С самого начала Ferrum был написан полностью ориентированным на многопотоковое исполнение. Вы можете работать с десятками открытых вкладок из одного и того же процесса Chrome, используя несколько потоков, и каждая страница будет поддерживаться самостоятельно через выделенный WebSocket. Например:

browser = Ferrum::Browser.new
context = browser.contexts.create
t1 = Thread.new(context) do |c|
page = c.create_page
page.goto("https://www.google.com/search?q=Ruby")
page.screenshot(path: "t1.png")
end
t2 = Thread.new(context) do |c|
page = c.create_page
page.goto("https://www.google.com/search?q=Ruby+static+typing")
page.screenshot(path: "t2.png")
end

В приведённом выше примере мы создаём контекст, который является функцией Chrome, особенно подходящей для тестирования — по сути, он работает как частное окно просмотра, и как только вы его закроете, всё исчезнет. Вы можете создавать вкладки в одном и том же контексте, если они должны обмениваться историей или данными, или разделять их на изолированные контексты, если они должны быть полностью независимыми друг от друга.

Ferrum + Capybara = Cuprite

Cuprite — это драйвер для Capybara, который использует Ferrum, чтобы управлять браузером Chrome. Это означает, что вы можете использовать знакомый Capybara API без необходимости полагаться на дополнительные зависимости, которые нужны другим драйверам для headless Chrome. Если вы уже используете Capybara, Cuprite даёт вам преимущества Ferrum без необходимости изучать новый набор API.

Ferrum + Crawling = Vessel

Если вы планируете использовать Ferrum для автоматического поиска данных в сети, то выберите Vessel — поисковый фреймворк для Ruby на основе Ferrum.

https://github.com/rubycdp/ferrum

Теперь, когда вы познакомились с Ferrum, всё, что нужно сделать — перейти на страницу проекта в Github и начать использовать Chrome для автоматизации вашего следующего проекта! Наш коллега Дмитрий Воротилин представил доклад на конференции ParisRB 2020 о headless тестировании в XXI веке, Ferrum, Cuprite и Vessel. Мы приглашаем вас посмотреть его, если хотите узнать об этом больше.

© Habrahabr.ru