[扩展推荐] Puphpeteer:Chrome 无头浏览器 Puphpeteer 项目的 PHP 桥梁

file

Johann Pardanaud 开发的 PuPHPeteer 是 PHP 与 Google Chrome Puppeteer (无头浏览器 headless chrome)API 之间的桥梁。同时,PuPHPeteer 基于另一个由 Johann 开发的叫 Rialto 的包,它可以通过 PHP 来管理 Node 资源。

一些例子

PuPHPeteer 有着和 Puppeteer 相似的例子,让我们试着用 PHP 来调用这些 API 吧。

这里有一个页面导航和截图的例子:

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();

这是一个在页面上执行JS脚本的例子:

use Nesk\PuPHPeteer\Puppeteer;
use Nesk\Rialto\Data\JsFunction;

$puppeteer = new Puppeteer;

$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->goto('https://example.com');

// 通过JS来获取页面的尺寸信息
$dimensions = $page->evaluate(JsFunction::create("
    return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight,
        deviceScaleFactor: window.devicePixelRatio
    };
"));

printf('Dimensions: %s', print_r($dimensions, true));

$browser->close();

一些区别

我认为最显著的区别,就是在 PuPHPeteer 中每个方法的调用都是同步的。

虽然 PuPHPeteer 支持所有 Node 版 Puppeteer 的 API,但还是有一些重要的不同点。最大的一点就是创建 new Puppeteer; 实例,而不是 Node 上使用 require('puppeteer') 的方式。当你通过 new Puppeteer; 创建一个实例的时候,实际上创建了一个由 PHP 控制的 Node 进程。

接下来,你可以给构造器设置参数:

[
    // Node 可执行命令的路径,如果 Node 已经在 PATH 里,就只要这样写就好了
    'executable_path' => 'node',

    // 进程可以阻塞多久(秒)不被终止,
    'idle_timeout' => 60,

    // 一个指令在返回结果前最多等待多久(秒)
    'read_timeout' => 30,

    // 关闭进程时最多等待多久(秒)
    'stop_timeout' => 3,

    // 调试用的 logger 实例 (必须实现 \Psr\Log\LoggerInterface)
    'logger' => null,

    // 开启调试模式(会自动做如下操作):
    //   - 添加参数 --inspect 到 Node 命令中
    //   - 追加堆栈跟踪信息到 Node 的报错消息中
    'debug' => false,
]

PuPHPeteer 要求 PHP >= 7.1 并且 Node >= 8 。可以到 GitHub repo 查看完整的 readme 和 安装说明。干的漂亮,约翰!( 自行脑补翻译语气 (*/ω\*)

原文地址:https://laravel-news.com/puphpeteer

译文地址:https://learnku.com/laravel/t/14699/exte...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4
GhostCoder

不太明白 这个是干什么用的?测试吗?有人能否解答下

1年前 评论
Summer

@GhostCoder

  • 页面生成 PDF ,这个用例可多了;
  • 可作为 SPA 的 SSR 解决方案 —— https://laravel-china.org/search?q=SSR
  • 自动化测试、UI 测试,你甚至可以测试你的 JS 里的键盘输入;
  • 捕抓 timeline trace ,为页面性能问题分析提供接口
  • 测试 Chrome Extensions.

更多请见 https://github.com/GoogleChrome/puppeteer

1年前 评论
GhostCoder

@Summer 厉害了 多谢科普

1年前 评论
yangweijie

如何用这个 捕获浏览器的alert 并确认关闭掉呢

7个月前 评论
likunyan 2个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!