Месяц назад, когда сопровождающий PhantomJS ушел в отставку после анонса безголового Chromium от Google, мое любопытство возбудилось. Как будет выглядеть эта новая библиотека?

Я принимал участие в нескольких проектах по автоматизации, связанных с браузером, начиная от веб-сканирования, автоматизации тестирования (на моей прошлой и нынешней работе), а также написания браузерных сценариев на лету (автоматическая отметка каждого профиля на OkCupid довольно проста). просто, но это, безусловно, поразило моего друга).

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

Во всяком случае, вот мои выводы:

Хорошие части:

  • У него есть REPL (chrome-remote-interface inspect). Вау! Одной из самых больших проблем, с которыми я столкнулся при веб-автоматизации, был ужасный DX (опыт разработчика) при написании таких скриптов. Обычно это включало в себя сначала тестирование с помощью jQuery или нативных селекторов DOM через консоль на реальной странице, затем добавление этого в скрипт и повторный запуск, чтобы убедиться, что он действительно работает. С REPL я могу тестировать селекторы, поскольку они поддерживаются, и видеть свои изменения в реальном браузере вместо того, чтобы постоянно переключать контекст.
  • У него есть чистая ссылка на документацию: https://chromedevtools.github.io/devtools-protocol. Вы можете увидеть множество пользовательских функций, доступных через самое сердце хрома.

Плохие части:

  • Написание кода быстро становится очень многословным. Это касается нативных функций DOM: каждый селектор (DOM.querySelector/DOM.querySelectorAll) возвращает обещание, которое затем преобразуется в массив идентификаторов узлов. Запрос атрибутов (DOM.getAttributes) на узле также вернет все атрибуты, которые вы должны отфильтровать до тех, которые вам действительно нужны. И так далее и тому подобное. Несмотря на то, что он очень мощный, он в значительной степени использует молоток для забивания гвоздей везде, независимо от их размера. Ниже я сравниваю код, необходимый для получения списка отдельных ссылок со страницы меню Subway Australia:
  • Выполнение Javascript очень простое. У вас есть доступ только к Runtime.evaluate, который берет строку, а затем запускает ее eval(). Что, конечно, означает, что либо на самом деле заключая ваш код в строку, не дай Бог, вам нужно что-то более сложное, чем однострочный.

На данный момент я буду придерживаться PhantomJS. Для больших проектов, возможно, имеет смысл попробовать безголовый Chromium для долгосрочной поддержки кроссбраузерной функциональности, но трудно превзойти лаконичность PhantomJS и jQuery.