windbridges/browser-server-client

Browser Server API Client

dev-master 2021-03-07 21:29 UTC

This package is auto-updated.

Last update: 2024-05-08 04:32:38 UTC


README

PHP API

Создаем объект API и авторизуемся на сервисе:

use WindBridges\BrowserServerClient\BrowserServerClient;

$api = new BrowserServerClient('172.31.192.1');
$api->auth('AUTH_TOKEN');

Вызов startSession() приводит к открытию нового окна браузера и возвращает данные сессии, соответствующие новому окну:

$session = $api->startSession();

Используя socketUri сессии, можно подключиться к окну браузера с помощью любой библиотеки, понимающей DevTools protocol. Здесь мы будем использовать headless-chromium-php:

use HeadlessChromium\BrowserFactory;
$browser = BrowserFactory::connectToBrowser($session->getSocketUri());
$page = $browser->createPage();

Полный пример:

use WindBridges\BrowserServerClient\BrowserServerClient;
use HeadlessChromium\BrowserFactory;

$api = new BrowserServerClient('172.31.192.1');
$api->auth('AUTH_TOKEN');
$session = $api->startSession();
$browser = BrowserFactory::connectToBrowser($session->getSocketUri());
$page = $browser->createPage();

Иногда бывает гораздо удобнее дать сессии имя и обращаться к ней по нему, чтобы не хранить идентификаторы сессий, которые назначаются случайным образом. При запросе сессии по имени, сервис будет проверять, открыта ли данная сессия, и если нет, то автоматически создавать ее:

use WindBridges\BrowserServerClient\BrowserServerClient;
use HeadlessChromium\BrowserFactory;

$api = new BrowserServerClient('172.31.192.1');
$api->auth('AUTH_TOKEN');
// Если сессия с именем 'test-session' не существует, то она будет создана
$session = $api->requireSession('test-session');
$browser = BrowserFactory::connectToBrowser($session->getSocketUri());
$page = $browser->createPage();

Эту же тактику можно использовать и для страниц браузера. Например, если вам нужна одна вкладка для работы, то можно назначить ей уникальное имя, чтобы не следить за закрытием ненужных вкладок в процессе запуска скрипта:

use WindBridges\BrowserServerClient\BrowserServerClient;

$api = new BrowserServerClient('172.31.192.1');
$api->auth('AUTH_TOKEN');
// Если сессия с именем 'test-session' не существует, то она будет создана
$session = $api->requireSession('test-session');
$sessionPage = $session->requirePage('test-page');

$sessionPage->getSocketUri() будет каждый раз содержать uri одной и той же страницы. Однако headless-chromium-php не позволяет напрямую подключиться к открытой вкладке, поэтому нужно использовать workaround. В будущем для этой цели будет создан хелпер, позволяющий выполнять эти действия в несколько строк.

Workaround для подключения к существующей странице:

use WindBridges\BrowserServerClient\BrowserServerClient;
use HeadlessChromium\BrowserFactory;
use HeadlessChromium\Communication\Message;
use HeadlessChromium\Page;

$api = new BrowserServerClient('172.31.192.1');
$api->auth('AUTH_TOKEN');
// Если сессия с именем 'test-session' не существует, то она будет создана
$session = $api->requireSession('test-session');
$sessionPage = $session->requirePage('test-page');
$browser = BrowserFactory::connectToBrowser($session->getSocketUri());
$target = $browser->getTarget($sessionPage->getTargetId());
$frameTreeResponse = $target->getSession()->sendMessageSync(new Message('Page.getFrameTree'));

if (!$frameTreeResponse->isSuccessful()) {
    throw new Exception('Cannot read frame tree');
}

$page = new Page($target, $frameTreeResponse['result']['frameTree']);
$page->getSession()->sendMessageSync(new Message('Page.enable'));
$page->getSession()->sendMessageSync(new Message('Network.enable'));
$page->getSession()->sendMessageSync(new Message('Runtime.enable'));
$page->getSession()->sendMessageSync(new Message('Page.setLifecycleEventsEnabled', ['enabled' => true]));
// $page->addPreScript($pagePreScript);