Установка Selenium, Chrome, JavaScript на CentOS 7

Author Автор: Роман Чернышов    Опубликовано: 26 ноября 2022

Автоматизация с SeleniumДоброго времени друзья! Последние несколько месяцев были насыщены проектами, многие из которых так или иначе были связаны с темой автоматизации процессов, начиная от парсинга сайтов и завершая сложными алгоритмами работы с 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, с разными скриптами автоматизации. Результат просто шикарный!

Друзья, если вам необходима помощь в написании скриптов автоматизации процессов, пожалуйста обращайтесь, буду рад сотрудничеству!

Оставить комментарий

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка