Если вы хотите запустить интеграционные тесты на своем сайте, у вас есть три варианта: Poltergeist, Selenium и новое секретное оружие — Ferrum.
Философия Web-проектов, как правило, немного отличается от философии Unix. Они могут развиваться разными способами, и нам постоянно приходится идти на компромиссы. Интерпретируемые языки, динамическая типизация и автоматическое управление памятью делают жизнь намного проще, чем инструменты, с которыми приходилось работать разработчикам оригинальных Unix-систем. Всё это позволяет писать очень читаемый код, но он может быть подвержен ошибкам. Чем быстрее мы сможем написать интеграционные тесты и запустить их, тем меньше шансов пропустить ошибку: и тут в игру вступает Ferrum, написанный нашим коллегой Дмитрием.
Сам CDP — довольно простой протокол, основанный на JSONRPC. API разделен на несколько доменов, ориентированных на различные аспекты Chrome: основное приложение браузера находится в домене браузера, конкретная страница обрабатывается доменом страницы, вы можете взаимодействовать с деревом DOM с помощью методов в домене DOM и так далее. Существует довольно много разных доменов, каждый из которых имеет свой собственный набор методов, которые вы можете вызывать.
Давайте попробуем использовать Ferrum, чтобы сделать скриншот главной страницы Google:
И это все! Использовать Ferrum действительно проще простого.
То, что его легко использовать, не значит, что он не способен на многое: существует уже множество CDP-функций, помимо базовой навигации, поиска и скриншотов. Вы можете перехватывать сетевой трафик, подменять реальные ответы «заглушками», управлять аутентификацией и изменять файлы cookie, заголовки и сценарии. Вы даже можете отправлять события мыши и клавиатуры, которые неотличимы от реальных!
(Единственное, что Ferrum не может сделать, это ввести CAPTCHA за вас... пока что).
В приведённом выше примере мы создаём контекст, который является функцией Chrome, особенно подходящей для тестирования — по сути, он работает как частное окно просмотра, и как только вы его закроете, всё исчезнет. Вы можете создавать вкладки в одном и том же контексте, если они должны обмениваться историей или данными, или разделять их на изолированные контексты, если они должны быть полностью независимыми друг от друга.
или Зарегистрируйся — это драйвер для Capybara, который использует Ferrum, чтобы управлять браузером Chrome. Это означает, что вы можете использовать знакомый Capybara API без необходимости полагаться на дополнительные зависимости, которые нужны другим драйверам для headless Chrome. Если вы уже используете Capybara, Cuprite даёт вам преимущества Ferrum без необходимости изучать новый набор API.
или Зарегистрируйся — поисковый фреймворк для Ruby на основе Ferrum.
Для просмотра ссылки Войдиили Зарегистрируйся
Теперь, когда вы познакомились с Ferrum, всё, что нужно сделать — перейти на страницу проекта в Github и начать использовать Chrome для автоматизации вашего следующего проекта! Наш коллега Дмитрий Воротилин представил доклад на конференции ParisRB 2020 о headless тестировании в XXI веке, Ferrum, Cuprite и Vessel. Мы приглашаем вас посмотреть его, если хотите узнать об этом больше.
- Poltergeist — отличный, но, к сожалению, сейчас он действительно устарел.
- Selenium требует установки дополнительного программного обеспечения, он медленнее и не даёт полного контроля над браузером. Это определенно не то, что нужно.
- Ferrum работает быстрее, чем Selenium, нет необходимости устанавливать дополнительное программное обеспечение, и с его помощью вы получаете полный контроль над браузером.
Философия 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
То, что его легко использовать, не значит, что он не способен на многое: существует уже множество 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
Ferrum + Capybara = Cuprite
Для просмотра ссылки ВойдиFerrum + Crawling = Vessel
Если вы планируете использовать Ferrum для автоматического поиска данных в сети, то выберите Для просмотра ссылки ВойдиДля просмотра ссылки Войди
Теперь, когда вы познакомились с Ferrum, всё, что нужно сделать — перейти на страницу проекта в Github и начать использовать Chrome для автоматизации вашего следующего проекта! Наш коллега Дмитрий Воротилин представил доклад на конференции ParisRB 2020 о headless тестировании в XXI веке, Ferrum, Cuprite и Vessel. Мы приглашаем вас посмотреть его, если хотите узнать об этом больше.