Установка 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, с разными скриптами автоматизации. Результат просто шикарный!
Друзья, если вам необходима помощь в написании скриптов автоматизации процессов, пожалуйста обращайтесь, буду рад сотрудничеству!
Похожие записи
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2024 (25)
- Ноябрь 2024 (10)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Интеграция платежной системы MoonPay на сайт по API 10.11.2024
- Парсер товаров с Taobao 08.11.2024
- Упаковка и минификация кода JavaScript онлайн 07.11.2024
- Как эффективно анализировать логи при DDOS атаке 07.11.2024
- Бот для автоматических заказов на OZON (плагин для Chrome) 07.11.2024