Flutter for OpenHarmony:puppeteer 远程控制 Chrome 浏览器,实现截图与自动化操作(Headless Chrome 适配) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:puppeteer 远程控制 Chrome 浏览器,实现截图与自动化操作(Headless Chrome 适配) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

请添加图片描述

前言

puppeteer 是一个 Node.js 库的 Dart 移植版,它提供了一套高级 API 来通过 DevTools 协议控制 Chrome 或 Chromium。通常用于爬虫、生成 PDF、截图或自动化测试。

在 OpenHarmony 移动设备上,直接启动一个 Headless Chrome 进程是不现实的(受限于系统权限和架构)。但是,我们可以利用 puppeteer 的远程连接能力,让 OpenHarmony 应用控制部署在服务器或局域网 PC 上的浏览器实例,实现强大的远程自动化功能。本文将介绍如何在 OpenHarmony 环境下使用 puppeteer 连接并控制远程浏览器。

一、puppeteer 简介与适用场景

1.1 核心功能

  • 生成截图与 PDF:将网页转换为图片或文档。
  • 爬取内容:抓取单页应用(SPA)的动态渲染内容。
  • 自动化操作:模拟键盘输入、表单提交、UI 点击。

1.2 OpenHarmony 适配策略

由于移动端无法直接运行 Chrome 二进制文件,我们采用 Client-Server 模式

  1. Server (PC/云端): 运行 Chrome 并开启远程调试端口 (--remote-debugging-port)。
  2. Client (OpenHarmony): 使用 puppeteer.connect 连接至 Server。

远程浏览器 (PC/Server)OpenHarmony 应用远程浏览器 (PC/Server)OpenHarmony 应用启动时开启远程调试端口 (--remote-debugging-port)puppeteer.connect(ws://ip:port) - 建立 Websocket 连接newPage() - 新建页面page.goto(url) - 打开目标网页页面加载完成page.screenshot() - 执行自动化截图返回图片字节流 (bytes)在应用内显示图片内容

二、环境准备与配置

2.1 添加依赖

pubspec.yaml 中:

dependencies:puppeteer: ^3.20.0 

2.2 服务端配置(PC端)

你需要在一台电脑或服务器上启动 Chrome,允许远程调试。

# macOS 示例 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9222\ --headless \ --disable-gpu 

确保 OpenHarmony 设备能 ping 通这台机器的 IP(例如 192.168.1.100)。

在这里插入图片描述

三、核心 API 详解与示例

3.1 示例一:连接远程浏览器

在 OpenHarmony 应用中连接到远程 Chrome 实例。

import'package:puppeteer/puppeteer.dart';Future<void>connectToBrowser()async{// 替换为你 PC 的 IP 地址final browser =await puppeteer.connect( browserUrl:'http://192.168.1.100:9222',);print('已连接到浏览器版本: ${await browser.version}');// 记得关闭连接,但通常不关闭远程浏览器本身await browser.disconnect();}
在这里插入图片描述

3.2 示例二:远程截图

让远程浏览器打开网页截图,并将图片数据返回给 OpenHarmony 显示。

import'dart:typed_data';import'package:flutter/material.dart';import'package:puppeteer/puppeteer.dart';Future<Uint8List>takeScreenshot(String url)async{final browser =await puppeteer.connect( browserUrl:'http://192.168.1.100:9222',);final page =await browser.newPage();await page.goto(url, wait:Until.networkIdle);// 截取全屏final screenshot =await page.screenshot(fullPage:true);await page.close();await browser.disconnect();return screenshot;// 返回二进制图片数据}
在这里插入图片描述

3.3 示例三:生成 PDF

类似截图,生成 PDF 并保存(需配合文件权限)。

Future<void>generatePdf(String url)async{final browser =await puppeteer.connect( browserUrl:'http://192.168.1.100:9222',);final page =await browser.newPage();await page.goto(url);final pdfData =await page.pdf(format:PaperFormat.a4);print('PDF 生成成功,大小: ${pdfData.length} 字节');await page.close();await browser.disconnect();}

四、OpenHarmony 平台适配

4.1 网络权限

连接远程调试端口需要 Internet 权限。在 module.json5 中配置:

"requestPermissions":[{"name":"ohos.permission.INTERNET"}]

4.2 异常处理

移动网络不稳定,连接远程实例时极易超时。务必添加 try-catch 和超时设置。

try{await puppeteer.connect(..., timeout:Duration(seconds:10));}catch(e){// 提示用户检查网络或服务状态}

五、完整实战示例:网页截图查看器

本示例是一个 OpenHarmony 应用,用户输入网址,点击按钮后,应用控制局域网内的 Chrome 截图并显示在屏幕上。

5.1 示例代码

import'dart:typed_data';import'package:flutter/material.dart';import'package:puppeteer/puppeteer.dart';voidmain(){runApp(constMaterialApp(home:PuppeteerDemoPage()));}classPuppeteerDemoPageextendsStatefulWidget{constPuppeteerDemoPage({super.key});@overrideState<PuppeteerDemoPage>createState()=>_PuppeteerDemoPageState();}class _PuppeteerDemoPageState extendsState<PuppeteerDemoPage>{finalTextEditingController _urlController =TextEditingController(text:'https://www.baidu.com');// ⚠️ 请根据实际情况修改调试地址finalString _debugUrl ='http://192.168.1.5:9222';Uint8List? _imageData; bool _isLoading =false;String _status ='准备就绪';Future<void>_captureScreen()async{setState((){ _isLoading =true; _status ='正在连接远程浏览器...'; _imageData =null;});try{// 1. 连接final browser =await puppeteer.connect( browserUrl: _debugUrl, timeout:constDuration(seconds:5),// 设置超时);setState(()=> _status ='正在加载页面...');// 2. 打开页面final page =await browser.newPage();// 设置视口大小以获得更好的截图效果await page.setViewport(constDeviceViewport(width:375, height:812));await page.goto(_urlController.text, wait:Until.networkIdle);setState(()=> _status ='正在截图...');// 3. 截图final screenshot =await page.screenshot();// 4. 清理await page.close();await browser.disconnect();if(mounted){setState((){ _imageData = screenshot; _status ='截图成功';});}}catch(e){if(mounted){setState(()=> _status ='错误: $e');}}finally{if(mounted){setState(()=> _isLoading =false);}}}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('Puppeteer 远程截图')), body:Column( children:[Padding( padding:constEdgeInsets.all(16.0), child:Row( children:[Expanded( child:TextField( controller: _urlController, decoration:constInputDecoration( labelText:'输入网址', border:OutlineInputBorder(),),),),constSizedBox(width:16),ElevatedButton( onPressed: _isLoading ?null: _captureScreen, child: _isLoading ?constSizedBox( width:20, height:20, child:CircularProgressIndicator(strokeWidth:2),):constText('截图'),),],),),Text(_status, style:constTextStyle(color:Colors.grey)),constDivider(),Expanded( child: _imageData !=null?SingleChildScrollView( child:Image.memory( _imageData!, fit:BoxFit.contain,),):constCenter( child:Icon(Icons.image, size:64, color:Colors.grey),),),],),);}}
在这里插入图片描述

六、总结

虽然 OpenHarmony 移动设备无法直接运行 puppeteer 驱动的本地 Chrome,但通过远程连接模式,我们可以将繁重的网页渲染和处理任务卸载到服务端,让 OpenHarmony 应用轻松拥有“超级浏览器”的能力。

最佳实践

  1. 仅在受信任的网络环境中使用远程调试,注意安全。
  2. 对于简单的网页展示,优先使用 webview_flutter
  3. puppeteer 适合用于需要服务端生成复杂内容(如报表 PDF)并回传给客户端的场景。

Read more

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk