Компонент BrowserKit

Компонент BrowserKit симулирует поведение веб-браузера, позволяя вам программно делать запросы, нажимать на ссылки и отправлять формы.

Note

Компонент BrowserKit может делать только внутренние запросы к вашему приложению. Если вам нужно сделать запрос к внешним сайтам и приложениям, рассмотрите использование Goutte, в качестве простого веб-агрегатора, основанного на компонентах Symfony.

Установка

1
$ composer require symfony/browser-kit

Также вы можете клонировать репозиторий https://github.com/symfony/browser-kit.

Note

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

Базовое применение

Эта статья объясняет как использовать функции BrowserKit как независимый компонент в любом PHP-приложении. Прочитайте статью Функциональные тесты Symfony для того, чтобы понять как использовать его в приложениях Symfony.

Создание клиента

Компонент предоставляет только абстрактного клиента, и не предоставляет готового к использованию бэк-энда для уровня HTTP.

Чтобы создать вашего собственного клиента, вам нужно расширить абстрактный класс Client и реализовать метод doRequest(). Этот метод принимает запрос и должен вернуть ответ:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
namespace Acme;

use Symfony\Component\BrowserKit\Client as BaseClient;
use Symfony\Component\BrowserKit\Response;

class Client extends BaseClient
{
    protected function doRequest($request)
    {
        // ... преобразовать запрос в ответ

        return new Response($content, $status, $headers);
    }
}

Для простой реализации браузера, основанного на слое HTTP, посмотрите на Goutte. Для реализации, основанной на HttpKernelInterface, посмотрите на Client, предоставленный компонентом HttpKernel.

Как делать запросы

Используйте метод request(), чтобы делать HTTP запросы. Первые два аргумента - HTTP метод и запрошенный URL:

1
2
3
4
use Acme\Client;

$client = new Client();
$crawler = $client->request('GET', '/');

Значение, возвращённое методом request() - это экземпляр класса Crawler, предоставленный DomCrawler component, который разрешает программный доступ и траверсирование HTML элементов.

Метод xmlHttpRequest(), у котого такие же аргументы как и у метода request(), является ярлыком для создания AJAX запросов:

1
2
3
4
5
use Acme\Client;

$client = new Client();
// the required HTTP_X_REQUESTED_WITH header is added automatically
$crawler = $client->xmlHttpRequest('GET', '/');

New in version 4.1: Метод xmlHttpRequest() был добавлен в Symfony 4.1.

Нажатие ссылок

Объект Crawler способен симулировать нажатие на ссылки. Для начала, передайте содержимое текста ссылки методу selectLink(), который возвращает объект Link. Далее, передайте этот объект методу click(), который выполняет необходимый HTTP запрос GET, чтобы симулировать нажатие на ссылку:

1
2
3
4
5
6
use Acme\Client;

$client = new Client();
$crawler = $client->request('GET', '/product/123');
$link = $crawler->selectLink('Go elsewhere...')->link();
$client->click($link);

Отправка форм

Объект Crawler также способен выбирать формы. Для начала, выберите любую кнопку формы методом selectButton(). Далее, используйте метод form(), чтобы выбрать форму, которой принадлежит кнопка.

После выбора формы, заполните данные и отправьте их, используя метод submit() (который делает необходимй HTTP запрос POST , чтобы отправить содержимое формы):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
use Acme\Client;

// сделайте реальный запрос ко внешнему сайту
$client = new Client();
$crawler = $client->request('GET', 'https://github.com/login');

// выберите форму и заполните некоторые значения
$form = $crawler->selectButton('Log in')->form();
$form['login'] = 'symfonyfan';
$form['password'] = 'anypass';

// Чтобы загрузить файл, значение должено быть абсолютным путём файла
$form['file'] = __FILE__;

// отправьте эту форму
$crawler = $client->submit($form);

История

Клиент хранит все ваши запросы, позволяя вам перемещаться по вашей истории вперёд и назад:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use Acme\Client;

$client = new Client();
$client->request('GET', '/');

// выберите и нажмите на ссылку
$link = $crawler->selectLink('Documentation')->link();
$client->click($link);

// перейдите назад к домашней странице
$crawler = $client->back();

// перейдите вперёд к странице документации
$crawler = $client->forward();

Вы можете удалять историю клиента методом restart(). Это также удалит все cookie:

1
2
3
4
5
6
7
use Acme\Client;

$client = new Client();
$client->request('GET', '/');

// перезапустите клиент (история и cookie также очищаются)
$client->restart();

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.