Установка Selenium, Chrome, JavaScript на CentOS 7
Доброго времени друзья! Последние несколько месяцев были насыщены проектами, многие из которых так или иначе были связаны с темой автоматизации процессов, начиная от парсинга сайтов и завершая сложными алгоритмами работы с CRM. Так совпало, что я автоматизировал как множество бизнес-задач клиентов, так и задач в ряде своих проектов. Многая часть таких процессов, была автоматизирована за счет инструмента Selenium(позволяющего управлять браузером, автоматически), языка Node.JS(JavaScript, позволяющего описать все процессы), браузера Chrome(выступающим в качестве основного веб-обозревателя) и операционной системы CentOS 7(стабильная, легкая и актуальная версия Linux) — всё это, позволило достаточно быстро развернуть рабочий сервер и приступить к сути, а именно написанию кода автоматизации самих процессов. Эта статья, является краткой инструкцией по установке и базовой настройке всех необходимых компонентов для работы (при условии, что сервер и ОС у вас уже готовы).
Установка Node.js
Добавляем репозиторий.
$ curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash - |
Выполняем следующую команду
$ sudo yum install nodejs |
Проверяем установленную версию Node.js и npm, выполнив поочередно команды:
$ node --version $ npm --version |
Установка Selenium library
Для работы с Selenium из скриптов на JavaScript Node.js, устанавливаем соответствующую библиотеку:
$ npm install selenium-webdriver |
Установка Chrome
$ curl https://intoli.com/install-google-chrome.sh | bash $ sudo yum install google-chrome-stable |
Проверка установленной версии браузера
$ google-chrome --version |
Видим следующее:
Google Chrome 104.0.5112.101 |
Установка Browser Driver
Следовательно скачиваем и устанавливаем Browser driver именно для этой версии браузера.
Выполняем команду:
$ wget https://chromedriver.storage.googleapis.com/104.0.5112.79/chromedriver_linux64.zip |
Далее распаковываем архив:
$ unzip chromedriver_linux64.zip |
Копируем драйвер в папку /usr/bin/:
$ cp ./chromedriver /usr/bin/chromedriver |
Проверяем корректно ли он установился:
$ chromedriver |
Видим следующее:
Starting ChromeDriver 104.0.5112.79 on port 9515 Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully. |
Первый скрипт на Node.JS и его запуск
Создаем файл test.js со следующим содержимым:
const {Builder} = require('selenium-webdriver'); const chrome = require('selenium-webdriver/chrome'); (async function helloSelenium() { let options = new chrome.Options(); // Задаем настройки для браузера options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); options.addArguments('--headless'); options.addArguments('--unhandled-rejections=strict'); try { // Запускаем сессию let driver = await new Builder().setChromeOptions(options).forBrowser('chrome').build(); // Открываем веб-страницу await driver.get('https://rche.ru'); // Получаем заголовок веб-страницы let title = await driver.getTitle(); // Закрываем сессию await driver.quit(); // Выводим заголовок веб-страницы в консоль console.log(title); } catch(e) { // Сообщение об ошибке, в случае падения console.log(e); } })(); |
Запускаем скрипт используя Node.js:
$ node test.js |
В консоли видим заголовок веб-страницы
Еще больше команд для написания скрипта для Selenium тут.
Работа Chrome через прокси
В JavaScripe, в блоке кода перечня настроек браузера, добавим строку подключения плагина:
// Задаем настройки для браузера options.addExtensions("chrome_plugin_proxy.zip"); // !!! Плагин устанавливающий прокси |
Сам архив с плагином chrome_plugin_proxy.zip будет содержать два файла: background.js и manifest.json
Листинг файлов следующий:
background.js — Код плагина. Не забудьте прописать в коде, параметры подключения к прокси: IP(XXX.XXX.XXX.XXX), Порт(YYYY), логин(USERNAME) и пароль(PASSWORD).
var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "XXX.XXX.XXX.XXX", port: YYYY }, bypassList: ["foobar.com"] } }; chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); chrome.webRequest.onAuthRequired.addListener( function(details, callbackFn) { console.log("onAuthRequired!", details, callbackFn); callbackFn({ authCredentials: {username: "USERNAME", password: "PASSWORD"} }); }, {urls: ["<all_urls>"]}, ['asyncBlocking'] // blocking, asyncBlocking ); |
manifest.json — Файл конфигурации плагина.
{ "version": "1.0.0", "manifest_version": 2, "name": "Chrome Proxy v2", "permissions": [ "proxy", "tabs", "unlimitedStorage", "storage", "<all_urls>", "webRequest", "webRequestBlocking" ], "background": { "scripts": ["background.js"] }, "minimum_chrome_version":"76.0.0" } |
Возможные ошибки
Error: Server terminated early with status 2
UnhandledPromiseRejectionWarning: WebDriverError: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn’t exist)
ReferenceError: after is not defined
Проверьте установлен ли Browser Driver, а также сам Chrome.
Заключение
Вышеописанная связка операционной системы, набора приложений и инструментов, получилась очень стабильной, экономичной в ресурсах и быстрой в скорости работы. На одном выделенном сервере на базе i7 7700k, 32 GB RAM, удалось одномоментно запустить до 30 параллельных потоков Selenium, с разными скриптами автоматизации. Результат просто шикарный!
Друзья, если вам необходима помощь в написании скриптов автоматизации процессов, пожалуйста обращайтесь, буду рад сотрудничеству!

Автор:






