资讯详情

资讯详情

Browsershot 页面点击(click)指南:在截图中模拟左键、右键与多次点击

后端图像处理【免费下载链接】browsershotConvert HTML to an image, PDF or string项目地址https://gitcode.com/gh_mirrors/br/browsershot点击查看免费下载Browsershot 允许你在生成图片、PDF 或 HTML 之前先对页面执行一次或多次“点击”操作从而把页面加载完成后的交互状态例如点击按钮后展开的下拉菜单、切换后的 Tab、提交表单后的结果页真实地渲染进截图。本文围绕 clicking-on-the-page.md 展开结合 Browsershot.php 与 browser.cjs 的源码实现完整讲解click方法的全部参数、底层执行链路、测试验证方式以及它与type、selectOption、delay等方法的组合实战。一、click方法是什么click是 Browsershot 提供的一个链式方法用于在无头浏览器Chromium/Puppeteer加载目标页面之后、执行截图之前模拟真实用户在页面上的一次或多次点击。它的典型应用场景包括点击按钮后截取展开的菜单、弹层或新状态点击“提交”按钮截取表单提交后的结果页连续多次点击如计数器、翻页组件、星级评分截取最终状态使用右键触发上下文菜单后截取画面。原文档给出了最核心的两个用法Browsershot::url(https://example.com) -click(#selector1) // Right click 5 times on #selector2, each click lasting 200 milliseconds. -click(#selector2, right, 5, 200)第一行表示对#selector1执行一次默认的左键单击第二行表示对#selector2执行 5 次右键点击且每次点击持续 200 毫秒。二、方法签名与全部参数详解click方法的完整签名定义在 src/Browsershot.php#L218-L227public function click(string $selector, string $button left, int $clickCount 1, int $delay 0): static { $clicks $this-additionalOptions[clicks] ?? []; $clicks[] compact(selector, button, clickCount, delay); $this-setOption(clicks, $clicks); return $this; }四个参数的含义与默认值如下参数类型默认值说明$selectorstring必填CSS 选择器用于定位要点击的元素如#selector1、.btn-submit$buttonstringleft鼠标按键可取left左键、right右键、middle中键等$clickCountint1连续点击次数$delayint0每次点击的持续时间毫秒对应原文档注释“each click lasting 200 milliseconds”几点值得注意的实现细节支持链式多次调用click内部会先从additionalOptions[clicks]中取出已有的点击列表把本次点击追加进去后再通过setOption(clicks, ...)写回。因此你可以像原文档示例那样连续调用多次click最终会按调用顺序依次执行而不是互相覆盖。每个点击独立记录四个字段源码使用compact(selector, button, clickCount, delay)组装每个点击动作的结构化描述最终在生成命令时序列化为 JSON 传给 Node 端详见下文第三节。参数校验交由 Puppeteer 层处理PHP 侧并不对$button或$delay做枚举校验非法取值会在实际执行点击时由底层浏览器驱动暴露错误。因此建议按left/right/middle与合理的毫秒值传参。三、底层执行链路从 PHP 选项到 Puppeteer 点击点击动作并不是在 PHP 进程内模拟的而是通过 Browsershot 生成的一段 Node 脚本bin/browser.cjs驱动真实 Chromium 完成的。整条链路可以概括为PHP 侧click()把点击参数写入clicks选项Browsershot 生成执行命令并启动 Node 脚本Node 脚本加载页面page.goto后遍历clicks数组逐个执行page.click(...)全部点击完成及可选的delay等待后再执行截图、导出 PDF 等后续动作。对应 Node 端的实现位于 bin/browser.cjs#L382-L390if (options.clicks) { for (const clickOptions of options.clicks) { await page.click(clickOptions.selector, { button: clickOptions.button, clickCount: clickOptions.clickCount, delay: clickOptions.delay, }); } }从这段代码可以清楚地看到执行顺序与声明顺序一致for...of按数组顺序逐个await前面的点击完成才会执行后面的点击点击时机在页面加载之后该代码块位于page.goto见 bin/browser.cjs#L349之后且排在types输入文字、selects下拉选择之后说明 Browsershot 的执行顺序是“先加载页面 → 输入表单 → 选择下拉 → 执行点击 → 等待/截图”点击完成后才截图点击循环之后才是options.delay等待与后续的截图/导出动作因此截图中必然包含点击后的页面状态。参数如何影响点击行为clickCount告诉 Puppeteer 在同一位置连续点击多少次例如双击2、三击3以选中整段文本或触发计数器的累加delay控制单次点击中“按下”与“松开”之间的间隔毫秒数值越大一次点击的持续时间越长原文档示例中的200即表示每次点击持续 200 毫秒button指定使用哪个鼠标按键右键点击可以触发上下文菜单等左键无法触发的交互。四、测试验证点击参数如何被序列化Browsershot 的测试套件对点击功能有直接覆盖。在 tests/BrowsershotTest.php#L650-L683 中can click on the page用例验证了连续两次click调用最终生成的命令结构it(can click on the page, function () { $command Browsershot::url(https://example.com) -click(#selector1) -click(#selector2, right, 2, 1) -createScreenshotCommand(screenshot.png); $this-assertEquals([ url https://example.com, action screenshot, options [ clicks [ [ selector #selector1, button left, clickCount 1, delay 0, ], [ selector #selector2, button right, clickCount 2, delay 1, ], ], ... ], ], $command); });这个测试同时印证了两个事实省略参数会落到默认值-click(#selector1)生成的记录是button left、clickCount 1、delay 0与方法签名中的默认值完全一致多次点击按序累积两次调用产生了两个数组元素且各自完整保留四个字段与源码中“追加到clicks列表”的逻辑吻合。如果你需要调试自己的点击配置可以参考 docs/miscellaneous-options/writing-options-to-a-file.md 中介绍的writeOptionsToFile方法把最终生成的选项 JSON 输出到文件检查clicks数组是否符合预期。五、组合实战点击 表单输入 提交 等待点击最常见的实战场景是配合表单操作先输入内容、再点击提交按钮、等待跳转或结果渲染最后保存截图。这一点在原文档配套的 docs/miscellaneous-options/typing-on-the-page.md 中有完整的组合示例Browsershot::url(https://example.com) -type(#firstName, My name) -click(#submit) -delay($millisecondsToWait) -save($pathToImage);同样的组合模式也出现在 docs/miscellaneous-options/changing-the-value-of-a-dropdown.md 中加入了下拉选择Browsershot::url(https://example.com) -type(#firstName, My name) -selectOption(#state, MT) -click(#submit) -delay($millisecondsToWait) -save($pathToImage);这里涉及三个相互配合的方法方法作用执行时机Node 端type($selector, $text, $delay 0)向输入框键入文本types循环先于点击执行selectOption($selector, $value)设置下拉框的值selects循环先于点击执行click($selector)点击提交按钮clicks循环最后执行delay($ms)/setDelay($ms)点击后等待指定毫秒点击循环结束后统一等待delay方法在 src/Browsershot.php#L612-L620 中定义本质上就是setOption(delay, $delayInMilliseconds)。它在点击之后、截图之前生效见 bin/browser.cjs#L414-L416用于给页面留出提交后的跳转与渲染时间if (options.delay) { await new Promise(r setTimeout(r, options.delay)); }提示如果点击触发了大量的异步资源加载如 XHR、图片、脚本也可以改用waitUntilNetworkIdle()定义于 src/Browsershot.php#L262等待网络空闲后再截图详情可参阅 docs/miscellaneous-options/setting-the-timeout.md 与 docs/miscellaneous-options/performance.md。不过需要注意网络空闲等待发生在page.goto阶段见 bin/browser.cjs#L342-L349点击后触发的异步请求并不在其覆盖范围内此时应优先使用delay或配合evaluate自行等待。完整示例截取提交后的结果页use Spatie\Browsershot\Browsershot; Browsershot::url(https://example.com/form) -windowSize(1280, 800) // 固定视口保证截图尺寸一致 -type(#firstName, My name) // 填写姓名 -selectOption(#state, MT) // 选择州 -click(#submit) // 点击提交 -delay(3000) // 等待结果页渲染完成 -save(result.png); // 保存截图关于windowSize与save的更多说明可参考 docs/usage/creating-images.md。六、进阶locatorClick与自动等待点击在 src/Browsershot.php#L229-L238 中还有一个与click同源的locatorClick方法public function locatorClick(string $selector, string $button left, int $clickCount 1, int $delay 0): static { $locatorClicks $this-additionalOptions[locatorClicks] ?? []; $locatorClicks[] compact(selector, button, clickCount, delay); $this-setOption(locatorClicks, $locatorClicks); return $this; }它的参数与click完全一致区别在于 Node 端的执行方式。见 bin/browser.cjs#L392-L404if (options.locatorClicks) { for (const clickOptions of options.locatorClicks) { try { await page.locator(clickOptions.selector).click({ button: clickOptions.button, clickCount: clickOptions.clickCount, delay: clickOptions.delay, }); } catch (error) { console.error(Timeout error:, error); } } }从源码结构可以看出两点差异locatorClick走的是page.locator(selector).click()路径这是 Puppeteer 中基于 Locator 的自动等待式点击会在元素可交互可见、稳定、可点击后再执行点击更适合定位动态渲染的元素它的try/catch会捕获超时等错误并仅打印Timeout error而不是中断整个脚本这一点与click的“失败即抛错”行为不同page.click若找不到元素会直接导致截图失败。注意上述行为差异是基于 bin/browser.cjs 现有实现得出的观察结论locatorClick的具体能力取决于所用 Puppeteer 版本对 Locator API 的支持程度。七、注意事项与排查建议结合源码实现与测试用例使用click时有几点值得留意选择器要能唯一定位元素page.click依赖 CSS 选择器匹配页面存在多个匹配元素时可能点击到非预期目标如需精确到第 N 个匹配元素可考虑在evaluate中处理或使用更具体的选择器。点击目标必须是可交互的被点击的元素若尚未渲染、被遮挡或处于禁用状态点击可能无效或直接报错。对动态内容优先使用locatorClick的自动等待能力。点击后记得留出渲染时间提交表单、切换 Tab、展开菜单等操作后的页面状态变化需要时间务必配合delay()使用否则截图中可能仍是点击前的旧状态。多次点击是“串行”执行的每个点击都会等待上一个完成因此总耗时会随点击次数和delay累加批量生成截图时注意控制总时长。建议先输出选项文件验证使用writeOptionsToFile()见 docs/miscellaneous-options/writing-options-to-a-file.md检查生成的clicks数组确认button、clickCount、delay是否符合预期避免在无头浏览器中反复试错。总结click是 Browsershot 交互式截图能力的关键一环通过 src/Browsershot.php#L218-L227 的四个参数selector、button、clickCount、delay你可以精确描述“在哪里点、用什么键点、点几次、每次持续多久”并由 bin/browser.cjs#L382-L390 在真实 Chromium 中按序执行。配合type、selectOption与delay即可把表单提交、菜单展开、多次点击等真实用户操作完整地“演”出来并截取成图而 tests/BrowsershotTest.php#L650-L683 则从测试层面保证了点击参数能被正确序列化与传递。需要自动等待式点击时还可以使用同源的locatorClick方法。赞分享后端图像处理【免费下载链接】browsershotConvert HTML to an image, PDF or string项目地址https://gitcode.com/gh_mirrors/br/browsershot点击查看免费下载相关推荐Trix富文本编辑器现代Web富文本编辑的架构革命Trix富文本编辑器现代Web富文本编辑的架构革命 在Web开发领域富文本编辑器长期面临着浏览器兼容性、内容一致性、性能优化等核心挑战。传统基于 conte前端UI组件解决v-viewer项目中Canvas元素左键点击失效问题解决v viewer项目中Canvas元素左键点击失效问题 在使用v viewer项目时开发者可能会遇到一个特殊的问题当在modal模式下覆盖一层canva前端UI组件上一篇OpCore Simplify智能黑苹果配置引擎的技术架构解析下一篇告别龟速下载6大网盘通用的免费加速神器实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →