源码教程:生命周期、导航与页签
本章从 PlaywrightService.start、BrowserInstance 和页签操作方法入手。共享浏览器策略详见浏览器与登录态。
1. 启动不是每个任务都创建一个浏览器
start 先解析 browser、headless、profile 等配置,再复用或创建共享浏览器,将任务 ID 与 BrowserInstance 关联。任务持有自己的页签集合和当前 Page;多个任务可能共用同一个 BrowserContext,所以页签隔离不等于 Cookie 隔离。
注册层默认 headless=true,没有指定 ID 时由服务生成。返回不仅有 id,还有请求浏览器与实际浏览器信息、参数是否被采纳、profile 是否见过等诊断字段。选中某浏览器不能证明账号已经登录,仍要读实际页面。
{"method":"start","params":{"headless":true,"browser":"chrome"}}
先保存返回 ID,再调用后续命令。共享进程首次启动未完成时,先用 list_tasks 观察状态,不重复创建同一任务。
close 只关闭指定任务拥有的页签并移除任务;最后一个任务结束后才释放共享浏览器。shutdown 则关闭全部任务与共享浏览器,但不终止 Java 服务。二者不应混用。
2. 导航实现与结果校验
| 命令 | 实现方式与注意点 |
|---|---|
navigate、go_to_url | 导向 goToUrl 的导航流程;调用 Page 导航并检查当前 URL,处理已跳转但底层异常的情形 |
go_back | 调用当前 Page 的历史后退,不能保证前一页是指定业务页面 |
go_forward | 调用历史前进,无可前进项时不等于应用故障 |
reload | 刷新当前 Page,可能丢失表单和一次性验证状态 |
get_url | 从当前 Page 取 URL |
get_title | 从当前 Page 取标题,不根据地址猜标题 |
导航成功后应重取快照,旧 DOM 索引属于旧页面。页面 URL 相同也可能经过 SPA 重建,不能据此长期缓存 Locator 的索引映射。
{"id":"1001","method":"go_to_url","params":{"url":"https://example.com"}}
3. 页签是任务内的列表
get_tabs 返回任务拥有的页签;new_tab 在共享上下文创建 Page,登记到当前任务,并按可选 URL 导航。由网页弹出的页签也需要被事件监听归属到任务。不能直接使用整个 Context 的 Page 列表替代任务列表,否则会操作其他任务的页面。
| 命令 | Java 层的关键行为 |
|---|---|
switch_tab | 校验任务内 pageIndex,切换当前 Page,并重置或更新相关快照 |
switch_tab_by_url | 在任务页签中匹配 URL,切到命中的页面;调用前先检查实际列表 |
close_tab | 关闭指定任务页签;当前页被关闭时需要选取剩余 Page |
close_other_tabs | 保留指定或当前页,关闭该任务的其他页签 |
bring_to_front | 将指定或当前 Page 提到前台,便于人工操作;不是登录完成信号 |
pageIndex 从 0 开始。文本形式的 browser_state 展示序号可能从 1 开始,不可照抄为参数。新页签出现也不保证当前 Page 已切换,先 get_tabs 再决定。
4. 本地验证
在本地测试页面加入一个 target="_blank" 链接,启动两个任务。验证新页签只属于触发它的任务;关闭其中一个任务后,另一个仍能读取标题。再验证最后一个任务关闭后的资源释放,以及不存在 ID、越界 pageIndex 的错误返回。
人工验证页面不要用 reload 作为常规排障手段。关闭或重启浏览器前,也要考虑其他任务是否仍在使用共享上下文。
注册参数与 Java 入口
以下按 CommandTable 实际读取参数整理。* 表示注册层使用必填读取器;其余字段省略后由服务决定默认行为。带条件的入口仍需满足正文说明,例如上传文件来源、元素定位二选一。外层 id 不重复列出。
| 命令 | params 字段 | Java 入口 |
|---|---|---|
start | headless、browser | browserInfo / start |
close | 无 | close |
shutdown | 无 | shutdown |
navigate | url* | navigate |
go_to_url | url* | goToUrl |
go_back | 无 | goBack |
go_forward | 无 | goForward |
reload | 无 | reload |
get_url | 无 | getUrl |
get_title | 无 | getTitle |
get_tabs | 无 | getTabs |
new_tab | url | newTab |
switch_tab | pageIndex* | switchTab |
switch_tab_by_url | url* | switchTabByUrl |
close_tab | pageIndex* | closeTab |
close_other_tabs | pageIndex | closeOtherTabs |
bring_to_front | pageIndex | bringToFront |
