ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

鸿蒙真机调试三板斧:Playwright 为什么驱动不了 Electron-on-鸿蒙

鸿蒙真机调试三板斧:Playwright 为什么驱动不了 Electron-on-鸿蒙 你以为鸿蒙真机上跑 Electron 应用拿hdc fport把端口映射到本地再用 Playwright 连上去就能自动化这条路走不通不是工具不行是鉴权围栏把它焊死了。看完这篇你拿到一套照抄就能用的真机调试三板斧。本文讲四件事外部浏览器为什么进不去、主进程 inspector 怎么用、uitest 和 hilog 怎么配合、输入框到底怎么填。一、先排雷为什么外部浏览器驱动不了你可能会想宿主不是起了个 webserver 吗我hdc fport把端口映射出来再用 Playwright 连上去不就行了不行。原因藏在 dsh 的 RPC 鉴权里宿主的每个 RPC 方法都需要一个浏览器会话GET /只接受?tokenlaunchToken形式的启动令牌校验通过后才下发一个与 authority 绑定的签名 cookie。缺 cookie会在 RPC 分发之前就直接返回 401。而启动令牌从不落日志dsh 的web-runtime以printUrl: false运行渲染进程交换完令牌后还会重定向到干净的/。结果就是外部浏览器哪怕你经hdc fport把端口映射出来了拿不到令牌、完不成鉴权。这条路死。所以真机调试得另起炉灶——我总结成「三板斧」全是踩坑踩出来的。二、板斧一主进程 inspector能力最强首选既然外部进不去那就从内部进去。运行时启动 Electron 时默认带了--inspect主进程始终在 9229 端口暴露一个 Node inspector。这个上下文里require可用、能拿到electron既能查 dsh 宿主也能驱动渲染进程。三步走# ① 先建立无线调试连接端口见设备 开发者选项 → 无线调试hdc tconn设备IP:端口# ② 端口转发本地 19229 → 设备 9229本地用非默认端口避免冲突exportMSYS_NO_PATHCONV1# Git Bash 否则会把 /data/... 重写成 Windows 路径hdc fport tcp:19229 tcp:9229# ③ 拿调试入口记下 webSocketDebuggerUrlcurl-shttp://127.0.0.1:19229/json/list拿到webSocketDebuggerUrl后用 Node 自带的全局WebSocketNode ≥ 22走 CDP 求值。两条最常用的表达式// 有哪些窗口、各自在什么 URL(async(){const{BrowserWindow}require(electron);returnJSON.stringify(BrowserWindow.getAllWindows().map(ww.webContents.getURL()));})()// 读取渲染进程可见文本(async(){const{BrowserWindow}require(electron);returnawaitBrowserWindow.getAllWindows()[0].webContents.executeJavaScript(document.body.innerText);})()第一句确认「窗口加载到了正确的局域网 IP 端口」第二句直接读页面文本做断言——比截图还省事。三、板斧二uitest渲染进程 UI 自动化仅点击如果只想做「点一下」级别的 UI 自动化鸿蒙自带的uitest够用hdc shell uitest dumpLayout-p/data/local/tmp/layout.json hdcfilerecv /data/local/tmp/layout.json ./layout.json# 拿到每个节点的文本与坐标hdc shell uitest uiInput clickxy# 点击可以触达 Web 内容但注意两个坑⚠️uitest uiInput text和uiInput keyEvent无法触达 Web 内容编辑器不是原生控件——文本输入得靠板斧一的Input.insertText见第五节。⚠️ dump 覆盖整屏系统设置等其他窗口会一起出现。点击前先aa start把应用调到前台再重新 dump 确认坐标。四、板斧三hilog fport确认宿主状态调试第一步永远是「宿主到底起来没、在哪个端口」。一句话hdc shellhilog -x | grep dsh-harmony | tail -20# 找「host 就绪: http://局域网IP:端口/」再经hdc fport探测http://127.0.0.1:端口/返回401就说明 webserver 可达、且鉴权围栏生效——宿主是活的。五、最难的一下Input.insertText 填输入框这是我在真机自动化里卡最久的一下输入框是contenteditable富文本编辑器不是textarea而且受 React 受控——直接赋value/innerText不会被识别。正确姿势是走 CDP 的Input.insertText(async(){const{BrowserWindow}require(electron);constwcBrowserWindow.getAllWindows()[0].webContents;constSEL[contenteditabletrue][roletextbox];awaitwc.executeJavaScript(document.querySelector(${SEL}).focus());if(!wc.debugger.isAttached())wc.debugger.attach(1.3);awaitwc.debugger.sendCommand(Input.insertText,{text:…});returnawaitwc.executeJavaScript(document.querySelector(${SEL}).innerText.length);})()写完后点aria-label为「发送消息」的按钮即可发出。六、安全提示务必看--inspect是把双刃剑任何拿到hdc的人都能完全控制宿主进程那个上下文里require可用。这个参数来自上游运行时的默认配置不是本工程引入的。本地调试可以接受但上架 AppGallery 前必须评估在 release 构建里把它移除。七、三板斧速查板斧作用关键能力适用场景主进程 inspectorCDP 求值最强--inspecthdc fportWebSocket查状态、读文本、填输入框uitest只点击dumpLayoutuiInput click简单点击级 UI 自动化hilog fport状态探测hilog -x 端口探测确认宿主起来没、端口对不对一句话记住外部进不去从主进程 inspector 进去输入框别硬填走Input.insertText。八、写在最后以上就是鸿蒙真机调试的三板斧主进程 inspectorCDP 求值最强→ uitest点击自动化→ hilog fport状态探测外加两个关键认知——外部浏览器驱动不了鉴权围栏输入框要Input.insertText。如果你也在做鸿蒙 / Electron-on-鸿蒙的真机自动化这套直接抄。代码已开源https://github.com/fellow99/dsh-desktop-hos欢迎star支持。下一篇我写适配踩坑 8 连把 Electron 应用搬进鸿蒙坑不在 Electron在鸿蒙的沙箱和网络模型。关注并设为星标别错过。相关开源工程DeepSeek Harness上游项目https://github.com/deepseek-ai/deepseek-harnessdsh-market插件市场https://github.com/dsh-market/dsh-marketharmonypc-electronElectron-on-鸿蒙运行时https://atomgit.com/jianguoxu/harmonypc-electrondeepseek-harness-workspace工作区总览https://github.com/fellow99/deepseek-harness-workspacedsh-desktop桌面端https://github.com/fellow99/dsh-desktopdsh-desktop-hos鸿蒙端https://github.com/fellow99/dsh-desktop-hos感谢各位关注欢迎访问我的GitHub主页https://fellow99.github.io/
返回列表