jmoo / chrome-react
使用ReactPHP的Chrome DevTools Protocol的异步、低级客户端
dev-master
2018-12-09 16:41 UTC
Requires
- php: ^7.1
- clue/block-react: ^1.3
- clue/buzz-react: ^2.3
- ratchet/pawl: ^0.3.2
- react/event-loop: ^0.4.3||^0.5.2||^1.0
- react/promise: ^2.7
Requires (Dev)
- amphp/amp: ^2.0
- amphp/react-adapter: ^1.1
- monolog/monolog: ^1.23
- phpunit/phpunit: ^6.3
This package is auto-updated.
Last update: 2024-09-19 21:44:32 UTC
README
使用ReactPHP的Chrome DevTools Protocol的完全异步、低级客户端
警告:实验性!在没有标记版本之前,预计会有大量破坏性更改、不稳定性和缺乏文档
安装
$ composer require jmoo/chrome-react
入门
运行Chrome
$ chrome --headless --disable-gpu --remote-debugging-port=9222
同步导航到页面
阻塞客户端在等待每个任务完成时运行事件循环。这允许你在响应异步事件的同时编写正常的同步代码。
$chrome = new \Jmoo\React\Chrome\Blocking\Client; $url = $chrome->new()->webSocketDebuggerUrl; $tab = $chrome->connect($url); $tab->Page->enable(); $tab->Page->navigate(['url' => 'https://www.chromium.org/']); $tab->disconnect();
异步导航到页面
异步客户端为每个命令返回Promises。
$loop = \React\EventLoop\Factory::create(); $chrome = new \Jmoo\React\Chrome\Async\Client($loop); $chrome ->new() ->then(function ($page) use ($chrome) { return $chrome->connect($page->webSocketDebuggerUrl); }) ->then(function ($c) { return \React\Promise\all([ $c, $c->Page->enable(), $c->Page->navigate(['url' => 'https://www.google.com']) ]); }) ->then(function ($result) { list($c) = $result; $c->disconnect(); }); $loop->run();
异步导航到页面(协程)
异步客户端可以与使用amphp/react-adapter
的amphp协程一起使用
\Amp\Loop::run(function() { $chrome = new \Jmoo\React\Chrome\Async\Client(ReactAdapter::get()); $tabInfo = yield $chrome->new(); $tab = yield $chrome->connect($tabInfo->webSocketDebuggerUrl); yield $tab->Page->enable(); yield $tab->Page->navigate(['url' => 'https://news.ycombinator.com/']); $tab->disconnect(); });
使用阻塞客户端与现有事件循环一起使用
// any existing event loop $loop = \React\EventLoop\Factory::create(); // create a new async client with event loop $async = new \Jmoo\React\Chrome\Async\Client($loop); // create a new blocking client using async client $chrome = new \Jmoo\React\Chrome\Blocking\Client($async);
用法
配置
# Default options $client = (new Client)->withOptions([ 'host' => '127.0.0.1', 'port' => 9222, 'ssl' => false, 'timeout' => 30 // blocking client only ]); # Using a custom event-loop and connector $asyncClient = new \Jmoo\React\Chrome\Async\Client($loop, $connector); $blockingClient = new \Jmoo\React\Chrome\Blocking\Client($asyncClient);
域
$client = new \Jmoo\React\Chrome\Blocking\Client; $c = $client->connect($client->new()->webSocketDebuggerUrl); // getting a domain accessor $page = $c->Page; // with magic method $page = $c->getDomain('Page'); // directly // enable events and retrieve multiple domain accessors at the same time list($page, $network, $log) = $c->enable(['Page', 'Network', 'Log']);
方法
$client = new \Jmoo\React\Chrome\Blocking\Client; $c = $client->connect($client->new()->webSocketDebuggerUrl); // executing a method using the domain accessor $c->Page->navigate(['url' => 'http://jmoo.io']); // with magic method $c->Page->send('navigate', ['url' => 'http://jmoo.io']); // directly // without using domain accessor $c->send('Page.navigate', ['url' => 'http://jmoo.io']);
事件
$client = new \Jmoo\React\Chrome\Blocking\Client; $c = $client->connect($client->new()->webSocketDebuggerUrl); // events must be enabled $c->Page->enable(); $c->Page->on('domContentEventFired', function() use ($c) { $c->disconnect(); }); // pause execution until disconnect (blocking client only) $c->waitForDisconnect();
会话
$client = new \Jmoo\React\Chrome\Blocking\Client; $c = $client->connect($client->version()->webSocketDebuggerUrl); $target = $c->send('Target.createTarget', ['url' => 'about:blank']); $session = $c->createSession($target->targetId); $session->Page->enable();