OwlCoder
Chrome Web Driver и WSL2
Настройка X-сервера - соединяем Ubuntu и Windows
Предположим Вы уже используете windows 10, а на ней у Вас работает ubuntu через wsl версии 2.
Для того, чтобы построить мост, который будет соединять интерфейсы ubuntu и windows нам понадобится весьма любопытная программа VcXsrv Windows X Server.
Это по сути X Server (аналог xorg сервера и построенный на основе его). По сути у Вас сервер отображения интерфейса будет запускаться в Windows, а WSL на него будет всё посылать.
Скачивает его отсюда: https://sourceforge.net/projects/vcxsrv/ и устанавливаем. Далее, чтобы запустить программу ищем её через пуск, как XLaunch.
Кликаем 2 раза далее, а потом при запуске указываем галочку Disable access controll, дабы не иметь проблем с соединением между клиентами со стороны wsl и самим X-сервером.
Жмём "далее", затем "готово". Всё XServer запущен.
В ubuntu в консоле вводим следующие команды, чтобы указать, куда слать данные об устройстве отображения.
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
Впринципе это можно добавить в домашнюю директорию в папку .bashrc, чтобы каждый раз при старте WSL не прописывать это вручную.
Далее можно поставить chrome через команду apt install apt install google-chrome-stable. Если вы работаете не от рута добавьте к этой команде вначале sudo ( Ну вы же это и без меня знаете да? :) ).
Проверяем, работает ли chrome из под WSL запуском - google-chrome-stable в командой строке. Работает?
Делаем далее на PHP
Здесь иммется ввиду, что у вас уже установлен composer на Вашей любимой Ubuntu. Поэтому начнём с того, что создадим пустую директорию.
Внутри новой директории устанавливаем webdriver командой
require php-webdriver/webdriver
В ней расположим файл, например test.php
Мы почти готовы начать писать код. Но прежде чем сделать это давайте скачаем chromedriver, для интеграции кода в google-chrome.
Скачать нужно версию, которая будет сопоставима с нашим браузером. Чтобы узнать версию нашего браузера в WSL вводим
google-chrome-stable --version
У меня это сейчас - Google Chrome 89.0.4389.82.
Можете скопировать драйвер непосредственно в проект командой wget https://chromedriver.storage.googleapis.com/89.0.4389.23/chromedriver_linux64.zip (у вас может быть другая ссылка, другая версия и тд)
Ссылку ищите на сайте https://chromedriver.chromium.org/
Разархивация: unzip ./chromedriver_linux64.zip
Далее я подробно в коде описываю каждый шаг, который мы делаем
<?php
require 'vendor/autoload.php';
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Chrome\ChromeOptions;
$chromedriverPath = '/root/chromedriver'; // путь до хромдрайвера в WSL
exec('pkill chromedriver;'); // убиваем предыдущий инстанс хром драйвера если он запускался
// опции запуска google chrome
$options = new ChromeOptions();
// сюда же можно добавить флаг --headless, изначальный размер окна и тд
$options->addArguments([
// в моём случае, т.к. wsl я запускаю как рут - я должен при запуске хрома указать флаг --no-sandbox
'--no-sandbox',
// я хз что это
'--disable-dev-shm-usage',
// максимыльный размер окна
'--start-maximized',
// расширений на ненадь
'--disable-extensions',
// не надо использовать GPU
'--disable-gpu',
// запуск браузера в режиме без головы (а тогда зачем мы вообще wsl на xserver windows прокидывали?)
// '--headless',
]);
// создаём конфигурацию - как мы хотим запустить хром
$desiredCapabilities = DesiredCapabilities::chrome();
$desiredCapabilities->setCapability(ChromeOptions::CAPABILITY, $options);
// создаём инстанс хромдрайвера
putenv("webdriver.chrome.driver={$chromedriverPath}");
$driver = \Facebook\WebDriver\Chrome\ChromeDriver::start($desiredCapabilities);
$driver->get('http://google.com');
// do something with webdriver :)
$driver->close();