Ручное тестирование сайта — это как собирать конструктор без инструкции: вроде бы и весело, но быстро надоедает, а потом вы находите баг, который пропустили. Если вы пишете на PHP и хотите спать спокойно, а не кликать по кнопкам в браузере каждый раз после обновления кода, пора познакомиться с Selenium. Это инструмент, который автоматизирует браузер, а мы сейчас разберём, как подружить его с PHP.

Digital-студия WNDER

Что такое Selenium и зачем он нужен PHP-разработчику

Представьте, что у вас есть личный помощник, который открывает браузер, вводит данные, нажимает кнопки и проверяет, что всё работает. Именно это делает Selenium. Он умеет управлять браузером через специальные команды, а вы можете писать эти команды на разных языках, включая PHP.

Для PHP-разработчика Selenium — это шанс убедиться, что ваш сайт не развалится после обновления. Например, вы изменили форму регистрации, а она перестала отправлять данные. Selenium это заметит и сообщит вам. Без него пришлось бы вручную открывать сайт, заполнять поля и надеяться, что вы ничего не забыли.

Но не пугайтесь: Selenium — это не магия, а просто набор библиотек и драйверов. В PHP мы используем расширение PHPUnit-Selenium или более современный Facebook WebDriver. Последний — это фактически стандарт, и на нём мы и остановимся.

Как установить и настроить Selenium для PHP

Установка Selenium в PHP состоит из трёх шагов: установка драйвера браузера, установка PHP-библиотеки и запуск сервера. Звучит сложно, но на деле всё просто.

Сначала скачайте драйвер для вашего браузера. Если вы используете Chrome, возьмите ChromeDriver, для Firefox — GeckoDriver. Драйвер — это программа, которая связывает Selenium с браузером. Положите его в отдельную папку и запомните путь.

Затем установите библиотеку php-webdriver через Composer. В терминале выполните:

composer require php-webdriver/webdriver

После этого запустите Selenium Server. Можно скачать jar-файл с официального сайта и запустить его командой:

java -jar selenium-server-standalone-4.0.0.jar

Либо, если вы не хотите возиться с Java, можно использовать драйвер напрямую (в новых версиях библиотеки это поддерживается). Но для простоты рекомендуем первый вариант.

Компонент Что это Как установить
Драйвер браузера Мост между Selenium и браузером Скачать с официального сайта
PHP-библиотека Набор классов для управления браузером composer require php-webdriver/webdriver
Selenium Server Прослойка для управления драйверами java -jar selenium-server-standalone.jar
Правило: всегда указывайте путь к драйверу в переменной окружения, чтобы не прописывать его каждый раз в коде. Это сэкономит вам нервы и время.

Пишем первый тест на PHP с Selenium

Теперь самое интересное — код. Допустим, у нас есть страница входа, и мы хотим проверить, что при неправильном пароле появляется сообщение об ошибке. Вот как это выглядит:

<?php
require_once 'vendor/autoload.php';

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverBy;

// Подключаемся к Selenium Server
$host = 'http://localhost:4444';
$driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome());

// Открываем страницу
$driver->get('https://example.com/login');

// Находим поле для логина и вводим значение
$loginField = $driver->findElement(WebDriverBy::name('login'));
$loginField->sendKeys('test_user');

// Находим поле для пароля и вводим значение
$passwordField = $driver->findElement(WebDriverBy::name('password'));
$passwordField->sendKeys('wrong_password');

// Нажимаем кнопку «Войти»
$button = $driver->findElement(WebDriverBy::cssSelector('button[type="submit"]'));
$button->click();

// Проверяем, что появилось сообщение об ошибке
$errorMessage = $driver->findElement(WebDriverBy::cssSelector('.alert-error'));

if ($errorMessage->isDisplayed()) {
    echo "Тест пройден! Сообщение об ошибке показано.\n";
} else {
    echo "Тест не пройден! Сообщение об ошибке не найдено.\n";
}

// Закрываем браузер
$driver->quit();
?>

Разберём, что тут происходит. Мы подключаемся к серверу, открываем страницу, находим элементы по имени, CSS-селектору и т.д. Вводим данные, кликаем и проверяем результат. Всё просто.

Обратите внимание: мы используем WebDriverBy для поиска элементов. Это удобно, потому что можно искать по разным критериям: id, name, класс, XPath.

Работа с ожиданиями и динамическим контентом

Сайты часто загружают данные через Ajax, и если вы сразу попытаетесь найти элемент, его может ещё не быть. Для этого в Selenium есть явные ожидания. Они заставляют скрипт подождать, пока элемент появится на странице.

Пример: мы ждём, пока появится кнопка «Сохранить» после загрузки формы:

use Facebook\WebDriver\WebDriverExpectedCondition;

// Ждём, пока элемент с id 'save-button' станет видимым
$driver->wait(10, 500)->until(
    WebDriverExpectedCondition::visibilityOfElementLocated(
        WebDriverBy::id('save-button')
    )
);

Здесь мы ждём до 10 секунд, проверяя каждые 500 миллисекунд, появился ли элемент. Это спасает от ложных срабатываний и делает тесты стабильнее.

Лайфхак: не используйте фиксированные паузы через sleep(). Они замедляют тесты и делают их ненадёжными. Всегда используйте ожидания — так вы сэкономите время и избежите случайных ошибок.

Интеграция с PHPUnit и итоговые советы

Если вы пишете тесты на PHPUnit, то Selenium легко вписывается в этот процесс. Просто создайте класс-тест, который наследуется от PHPUnit\Framework\TestCase, и используйте Selenium внутри методов.

use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;

class LoginTest extends TestCase
{
    public function testLoginWithWrongPassword()
    {
        $driver = RemoteWebDriver::create('http://localhost:4444', DesiredCapabilities::chrome());
        $driver->get('https://example.com/login');

        $driver->findElement(WebDriverBy::name('login'))->sendKeys('test_user');
        $driver->findElement(WebDriverBy::name('password'))->sendKeys('wrong_password');
        $driver->findElement(WebDriverBy::cssSelector('button[type="submit"]'))->click();

        $this->assertTrue($driver->findElement(WebDriverBy::cssSelector('.alert-error'))->isDisplayed());

        $driver->quit();
    }
}

Теперь вы можете запускать тесты через PHPUnit и получать отчёты. Удобно, правда?

В итоге, Selenium — это мощный инструмент, который экономит часы ручной работы. С ним вы сможете быстро проверять критические сценарии: регистрацию, вход, оформление заказа. А если вы используете PHPUnit, то интеграция будет практически бесшовной.

Не забывайте, что тесты — это тоже код, и за ними нужно ухаживать. Поддерживайте их в актуальном состоянии, и они будут приносить пользу, а не головную боль.

Студия WNDER