Ferrum — бесстрашный Ruby-драйвер для Chrome с открытым исходным кодом
Если вы хотите запустить интеграционные тесты на своем сайте, у вас есть три варианта: 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.
Теперь, когда вы познакомились с Ferrum, всё, что нужно сделать — перейти на страницу проекта в Github и начать использовать Chrome для автоматизации вашего следующего проекта! Наш коллега Дмитрий Воротилин представил доклад на конференции ParisRB 2020 о headless тестировании в XXI веке, Ferrum, Cuprite и Vessel. Мы приглашаем вас посмотреть его, если хотите узнать об этом больше.
В Evrone, наряду с собственными open-source разработками, мы также поддерживаем другие open-source инициативы, в том числе предлагая наши услуги по дизайну и айдентике для перспективных и уникальных проектов, таких как Ferrum. Если вам нужен опытный Ruby-разработчик для реализации сложных задач или open-source проекта, наша команда готова предложить свою экспертизу и качественное решение.