rabin ef108495d0 edit | 8 månader sedan | |
---|---|---|
.. | ||
.github | 8 månader sedan | |
bin | 8 månader sedan | |
src | 8 månader sedan | |
tests | 8 månader sedan | |
.php-cs-fixer.cache | 8 månader sedan | |
.php-cs-fixer.dist.php | 8 månader sedan | |
CHANGELOG.md | 8 månader sedan | |
LICENSE | 8 månader sedan | |
README.md | 8 månader sedan | |
composer.json | 8 månader sedan | |
package.json | 8 månader sedan | |
phpstan.neon | 8 månader sedan | |
phpunit.xml | 8 månader sedan |
A Puppeteer bridge for PHP, supporting the entire API. Based on Rialto, a package to manage Node resources from PHP.
Here are some examples borrowed from Puppeteer's documentation and adapted to PHP's syntax:
Example - navigating to https://example.com and saving a screenshot as example.png:
use Nesk\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer;
$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->goto('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();
Example - evaluate a script in the context of the page:
use Nesk\Puphpeteer\Puppeteer;
use Nesk\Rialto\Data\JsFunction;
$puppeteer = new Puppeteer;
$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->goto('https://example.com');
// Get the "viewport" of the page, as reported by the page.
$dimensions = $page->evaluate(JsFunction::createWithBody("
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio
};
"));
printf('Dimensions: %s', print_r($dimensions, true));
$browser->close();
This package requires PHP >= 7.3 and Node >= 8.
Install it with these two command lines:
composer require zoon/puphpeteer
npm install github:zoonru/puphpeteer
Instead of requiring Puppeteer:
const puppeteer = require('puppeteer');
You have to instantiate the Puppeteer
class:
$puppeteer = new Puppeteer;
This will create a new Node process controlled by PHP.
You can also pass some options to the constructor, see Rialto's documentation. PuPHPeteer also extends these options:
[
// Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
'log_browser_console' => false,
]
With PuPHPeteer, every method call or property getting/setting is synchronous.
The following methods have been aliased because PHP doesn't support the $
character in method names:
$
=> querySelector
$$
=> querySelectorAll
$x
=> querySelectorXPath
$eval
=> querySelectorEval
$$eval
=> querySelectorAllEval
Use these aliases just like you would have used the original methods:
$divs = $page->querySelectorAll('div');
Functions evaluated in the context of the page must be written with the JsFunction
class, the body of these functions must be written in JavaScript instead of PHP.
use Nesk\Rialto\Data\JsFunction;
$pageFunction = JsFunction::createWithParameters(['element'])
->body("return element.textContent");
If an error occurs in Node, a Node\FatalException
will be thrown and the process closed, you will have to create a new instance of Puppeteer
.
To avoid that, you can ask Node to catch these errors by prepending your instruction with ->tryCatch
:
use Nesk\Rialto\Exceptions\Node;
try {
$page->tryCatch->goto('invalid_url');
} catch (Node\Exception $exception) {
// Handle the exception...
}
Instead, a Node\Exception
will be thrown, the Node process will stay alive and usable.
To use puppeteer-extra plugins add them to your project:
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
Then override js inclusion with js_extra option
$puppeteer = new Puppeteer([
'js_extra' => /** @lang JavaScript */ "
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
instruction.setDefaultResource(puppeteer);
"
]);
The MIT License (MIT). Please see License File for more information.
PuPHPeteer's logo is composed of:
Thanks to Laravel News for picking the icons and colors of the logo.