Добрый день.
Недавно столкнулся с проблемой при проведении UI тестов: Selenium не имеет функции получения статус кода страницы. Как оказалось в дальнейшем, разработчики Selenium специально не предусмотрели данную возможность т. к. это противоречит концепции симуляции работы пользователя (подразумевается что пользователь не способен посмотреть статус код ответа).
Возможные решения
После долгих поисков в интернете стало понятно, что сделать это можно только при помощи внешних средств:
И многие другие.
Также существуют более изысканные варианты:
При помощи фреймворков (Codeception, Mink и пр.), использующих более одного браузера (к примеру PhpBrowser и ChromeDriver).
PhpBrowser консольный, и имеет возможность получения статус кодов, но не может работать динамически изменяющимися страницами. В ChromeDriver всё наоборот. То есть для написания автотеста для динамически изменяющейся страницы используется ChromeDriver. Куки из сессии ChromeDriver сохраняются, запускается сессия PhpBrowser, туда пробрасываются сохранённые куки и только после этого вызывается функция получения статус кода. Не самый быстрый метод, как по мне.
Решение средствами Selenium
Я предлагаю решение внутренними средствами Selenium, которое будет работать на любом фреймворке. А именно вставка функции на js. Данная функция поддерживается любым фреймворком на базе Selenium и не требует запуска дополнительных сессий.
Пример для Codeception (PHP)
public function getStatusCode()
{
return $this->executeInSelenium(function (FacebookWebDriverRemoteRemoteWebDriver $webdriver) {
return $webdriver->executeScript(
'var xhr = new XMLHttpRequest();
xhr.open('GET', '' . $webdriver->getCurrentURL() . '', false);
xhr.send();
return String(xhr.status)');
});
}
Надеюсь данная информация будет кому нибудь полезна.
Автор: мастер слога