Ручное тестирование сайта — это как собирать конструктор без инструкции: вроде бы и весело, но быстро надоедает, а потом вы находите баг, который пропустили. Если вы пишете на PHP и хотите спать спокойно, а не кликать по кнопкам в браузере каждый раз после обновления кода, пора познакомиться с Selenium. Это инструмент, который автоматизирует браузер, а мы сейчас разберём, как подружить его с PHP.
Что такое 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 миллисекунд, появился ли элемент. Это спасает от ложных срабатываний и делает тесты стабильнее.
Интеграция с 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, то интеграция будет практически бесшовной.
Не забывайте, что тесты — это тоже код, и за ними нужно ухаживать. Поддерживайте их в актуальном состоянии, и они будут приносить пользу, а не головную боль.



