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();