https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-debugging-with-devtools

Web组件支持使用DevTools工具调试前端页面。DevTools是Web前端开发调试工具,支持在电脑上调试移动设备前端页面。开发者通过setWebDebuggingAccess()接口开启Web组件前端页面调试能力,使用DevTools在电脑上调试移动前端网页,设备需为4.1.0及以上版本。

调试步骤

应用代码开启Web调试开关

调试网页前,需要应用侧代码调用setWebDebuggingAccess()接口开启Web调试开关。

如果没有开启Web调试开关,则DevTools无法发现被调试的网页。

  1. 在应用代码中开启Web调试开关,具体如下:

     
    1. // xxx.ets
    2. import { webview } from '@kit.ArkWeb';
    3. @Entry
    4. @Component
    5. struct WebComponent {
    6. controller: webview.WebviewController = new webview.WebviewController();
    7. aboutToAppear() {
    8. // 配置Web开启调试模式
    9. webview.WebviewController.setWebDebuggingAccess(true);
    10. }
    11. build() {
    12. Column() {
    13. Web({ src: 'www.example.com', controller: this.controller })
    14. }
    15. }
    16. }
  2. 开启调试功能需要在DevEco Studio应用工程hap模块的module.json5文件中增加如下权限,添加方法请参考在配置文件中声明权限

     
    1. "requestPermissions":[
    2. {
    3. "name" : "ohos.permission.INTERNET"
    4. }
    5. ]

将设备连接至电脑

请将设备连接至电脑,随后开启开发者模式,为后续的端口转发操作做好准备。

  1. 请开启设备上的开发者模式,并启用USB调试功能。

    (1) 终端系统查看“设置 > 系统”中是否有“开发者选项”,如果不存在,可在“设置 > 关于本机”连续七次单击“版本号”,直到提示“开启开发者模式”,点击“确认开启”后输入PIN码(如果已设置),设备将自动重启。

    (2) USB数据线连接终端和电脑,在“设置 > 系统 > 开发者选项”中,打开“USB调试”开关,弹出的“允许USB调试”的弹框,点击“允许”。

  2. 使用hdc命令连接上设备。

    打开命令行执行如下命令,查看hdc能否发现设备。

     
    1. hdc list targets
    • 如果命令返回设备的ID,表示hdc已连接上设备。

    • 如果命令返回 [Empty],则说明hdc还没有发现设备。

  3. 进入hdc shell。

    连接设备后,执行以下命令进入hdc shell。

     
    1. hdc shell

端口转发

当应用代码调用setWebDebuggingAccess接口开启Web调试开关后,ArkWeb内核将启动一个domain socket的监听,以此实现DevTools对网页的调试功能。也可以参考自动映射WebView调试链接

Chrome浏览器无法直接访问到设备上的domain socket, 因此需要将设备上的domain socket转发到电脑上。

  1. 先在hdc shell里执行如下命令,查询ArkWeb在设备里创建的domain socket。

     
    1. cat /proc/net/unix | grep devtools
    • 如果前几步操作无误,该命令的执行结果将显示用于查询的domain socket端口。

    • 如果没有查询到结果, 请再次确认。

      (1) 应用开启了Web调试开关。

      (2) 应用使用Web组件加载了网页。

  2. 将查询到的domain socket转发至电脑的TCP 9222端口。

    执行exit退出hdc shell。

     
    1. exit

    在命令行里执行如下命令转发端口。

     
    1. hdc fport tcp:9222 localabstract:webview_devtools_remote_38532
    说明

    "webview_devtools_remote_" 后面的数字,代表ArkWeb所在应用的进程号, 该数字不是固定的。请将”webview_devtools_remote_“后面的数字改为自己查询到的值。

    如果应用的进程号发生变化,例如,应用重新启动,则需要重新配置端口转发。

    命令执行成功示意图:

  3. 在命令行里执行如下命令,检查端口是否转发成功。

     
    1. hdc fport ls
    • 如果有返回端口转发的任务,则说明端口转发成功。

    • 如果返回 [Empty], 则说明端口转发失败。

在Chrome浏览器上打开调试工具页面

  1. 在电脑端Chrome浏览器地址栏中输入调试工具地址 chrome://inspect/#devices 并打开该页面。

  2. 修改Chrome调试工具的配置。

    需要从本地的TCP 9222端口发现被调试网页,所以请确保已勾选 "Discover network targets"。然后再进行网络配置。

    (1) 点击 "Configure" 按钮。

    (2) 在 "Target discovery settings" 中添加要监听的本地端口localhost:9222。

  3. 为了同时调试多个应用,请在Chrome浏览器的调试工具网页内,于“Devices”选项中的“configure”部分添加多个端口号。

等待发现被调试页面

如果前面的步骤执行成功,Chrome的调试页面将显示待调试的网页。

开始网页调试

便捷脚本

Windows平台

请复制以下信息建立bat文件,开启调试应用后执行。

 
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: Initialize port number and PID list
  4. set PORT=9222
  5. set PID_LIST=
  6. :: Get the list of all forwarded ports and PIDs
  7. for /f "tokens=2,5 delims=:_" %%a in ('hdc fport ls') do (
  8. if %%a gtr !PORT! (
  9. set PORT=%%a
  10. )
  11. for /f "tokens=1 delims= " %%c in ("%%b") do (
  12. set PID_LIST=!PID_LIST! %%c
  13. )
  14. )
  15. :: Increment port number for next application
  16. set temp_PORT=!PORT!
  17. set /a temp_PORT+=1
  18. set PORT=!temp_PORT!
  19. :: Get the domain socket name of devtools
  20. for /f "tokens=*" %%a in ('hdc shell "cat /proc/net/unix | grep devtools"') do (
  21. set SOCKET_NAME=%%a
  22. :: Extract process ID
  23. for /f "delims=_ tokens=4" %%b in ("!SOCKET_NAME!") do set PID=%%b
  24. :: Check if PID already has a mapping
  25. echo !PID_LIST! | findstr /C:" !PID! " >nul
  26. if errorlevel 1 (
  27. :: Add mapping
  28. hdc fport tcp:!PORT! localabstract:webview_devtools_remote_!PID!
  29. if errorlevel 1 (
  30. echo Error: Failed to add mapping.
  31. pause
  32. exit /b
  33. )
  34. :: Add PID to list and increment port number for next application
  35. set PID_LIST=!PID_LIST! !PID!
  36. set temp_PORT=!PORT!
  37. set /a temp_PORT+=1
  38. set PORT=!temp_PORT!
  39. )
  40. )
  41. :: If no process ID was found, prompt the user to open debugging in their application code and provide the documentation link
  42. if "!SOCKET_NAME!"=="" (
  43. echo No process ID was found. Please open debugging in your application code using the corresponding interface. You can find the relevant documentation at this link: [https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/web/web-debugging-with-devtools.md]
  44. pause
  45. exit /b
  46. )
  47. :: Check mapping
  48. hdc fport ls
  49. echo.
  50. echo Script executed successfully. Press any key to exit...
  51. pause >nul
  52. :: Try to open the page in Edge
  53. start msedge chrome://inspect/#devices
  54. :: If Edge is not available, then open the page in Chrome
  55. if errorlevel 1 (
  56. start chrome chrome://inspect/#devices
  57. )
  58. endlocal

Linux或Mac平台

请复制以下信息建立sh文件,注意chmod以及格式转换,开启调试应用后执行。

本脚本会先删除所有的端口转发,如果有其他的工具(如:DevEco Studio)也在使用端口转发功能,会受到影响。

 
  1. #!/bin/bash
  2. # Get current fport rule list
  3. CURRENT_FPORT_LIST=$(hdc fport ls)
  4. # Delete the existing fport rule one by one
  5. while IFS= read -r line; do
  6. # Extract the taskline
  7. IFS=' ' read -ra parts <<< "$line"
  8. taskline="${parts[1]} ${parts[2]}"
  9. # Delete the corresponding fport rule
  10. echo "Removing forward rule for $taskline"
  11. hdc fport rm $taskline
  12. result=$?
  13. if [ $result -eq 0 ]; then
  14. echo "Remove forward rule success, taskline:$taskline"
  15. else
  16. echo "Failed to remove forward rule, taskline:$taskline"
  17. fi
  18. done <<< "$CURRENT_FPORT_LIST"
  19. # Initial port number
  20. INITIAL_PORT=9222
  21. # Get the current port number, use initial port number if not set previously
  22. CURRENT_PORT=${PORT:-$INITIAL_PORT}
  23. # Get the list of all PIDs that match the condition
  24. PID_LIST=$(hdc shell cat /proc/net/unix | grep webview_devtools_remote_ | awk -F '_' '{print $NF}')
  25. if [ -z "$PID_LIST" ]; then
  26. echo "Failed to retrieve PID from the device"
  27. exit 1
  28. fi
  29. # Increment the port number
  30. PORT=$CURRENT_PORT
  31. # Forward ports for each application one by one
  32. for PID in $PID_LIST; do
  33. # Increment the port number
  34. PORT=$((PORT + 1))
  35. # Execute the hdc fport command
  36. hdc fport tcp:$PORT localabstract:webview_devtools_remote_$PID
  37. # Check if the command executed successfully
  38. if [ $? -ne 0 ]; then
  39. echo "Failed to execute hdc fport command"
  40. exit 1
  41. fi
  42. done
  43. # List all forwarded ports
  44. hdc fport ls

无线调试

上述的调试步骤中,由于端口转发这一步骤需频繁查询Domain Socket并转发端口,给页面调试造成不便。因此,从API version 20开始,可使用无线调试接口setWebDebuggingAccess,来简化调试流程。

  1. 应用代码开启Web调试开关。

    这此步骤中,应用需要调用setWebDebuggingAccess接口,设置TCP Socket端口号并启用Web调试功能。

     
    1. // xxx.ets
    2. import { webview } from '@kit.ArkWeb';
    3. import { BusinessError } from '@kit.BasicServicesKit';
    4. @Entry
    5. @Component
    6. struct WebComponent {
    7. controller: webview.WebviewController = new webview.WebviewController();
    8. aboutToAppear(): void {
    9. try {
    10. // 配置Web开启无线调试模式,指定TCP Socket的端口。
    11. webview.WebviewController.setWebDebuggingAccess(true, 8888);
    12. } catch (error) {
    13. console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
    14. }
    15. }
    16. build() {
    17. Column() {
    18. Web({ src: 'www.example.com', controller: this.controller })
    19. }
    20. }
    21. }
    说明

    代码中使用的8888端口仅作为示例展示,开发者使用过程中,应保证端口号可以被应用使用。如果因为端口被占用或者应用无权限使用等因素导致端口无法被应用使用,会导致接口抛出异常或者ArkWeb无法开启调试模式。

  2. 将设备连接至电脑。

    如果ArkWeb成功开启了无线调试模式,此步骤可省略。

  3. 端口转发。

    如果ArkWeb成功开启了无线调试模式,此步骤可省略。

  4. 在Chrome浏览器上打开调试工具页面。

    在Chrome浏览器上打开调试工具页面的第2步"修改Chrome调试工具的配置"的第(2)条,改为:

    在 "Target discovery settings" 中添加被调试设备的IP地址和setWebDebuggingAccess接口中指定的port端口,比如:192.168.0.3:8888。

    说明

    调试工具和被调试设备要在同一局域网下,并且能够相互访问。如果被调试设备有多个IP地址,要使用与调试工具同一个网段的IP地址。

  5. 等待发现被调试页面。

    无变化。

  6. 开始网页调试。

    无变化。

常见问题与解决方法

hdc无法发现设备

问题现象

在命令行里执行如下命令后,没有列出设备ID。

 
  1. hdc list targets

解决方法

  • 请确保设备上的USB调试开关已开启。
  • 请确保设备与电脑相连。

hdc的命令显示设备"未授权"或"unauthorized"

问题现象

执行hdc命令时,提示设备"未授权"或"unauthorized"。

问题原因

设备没有授权该台电脑进行调试。

解决方法

开启USB调试开关的设备连接没有授权的电脑后,会弹框提示"是否允许USB调试?",请选择允许。

找不到DevTools的domain socket

问题现象

在hdc shell里执行如下命令后,没有结果。

 
  1. cat /proc/net/unix | grep devtools

解决方法

端口转发不成功

问题现象

在命令行里执行如下命令后,没有列出之前设置过转发任务。

 
  1. hdc fport ls

解决方法

  • 请确保设备里的domain socket存在。
  • 请确保电脑端的tcp:9222没有被占用。

    如果tcp:9222被占用,可以将domain socket转发到其他未被占用的TCP端口, 比如9223等。

    如果转发到了新的TCP端口, 需要同步修改电脑端Chrome浏览器"Target discovery settings"中的端口号。

端口转发成功后,电脑端Chrome无法发现被调试网页

问题现象

电脑端Chrome浏览器无法发现被调试网页。

问题原因

端口转发失效可能是以下原因:

  • 设备与电脑断连,会导致hdc里的所有转发任务被清空。
  • hdc服务重启,也会导致hdc里的所有转发任务被清空。
  • 设备里应用的进程号发生了变更(应用重新启动等),会导致hdc里旧的转发任务失效。
  • 多个转发任务转发到了同一个端口等异常配置,会导致转发异常。

解决方法

  • 请确保电脑端的本地tcp:9222(其他TCP端口同理)没有被占用。

  • 请确保设备端的domain socket还存在。

  • 请确保domain socket名称里的进程号与被调试的应用的进程号相同。

  • 请删除hdc里其他不必要的转发任务。

  • 转发成功后,请用电脑端的Chrome浏览器打开网址 http://localhost:9222/json ,URL里的9222需要改为自己实际配置的TCP端口。

使用DevTools工具调试前端页面的更多相关文章

  1. 使用开发者工具调试jsp页面中的脚本

    只举例火狐和谷歌.如果是火狐,一般是用firebug,首先确保开启脚本调试: 然后刷新一下要调试的页面,点击firebug中的行内,选择当前页面: js文件一般直接显示的是js文件的名字,而页面一般是 ...

  2. 配合前端开发,调试前端页面bug

    同事开发的H5页面  在iOS10.1的手机上会有bug 先下载ios10.1的模拟器,安装到xcode上,注意给电脑腾出足够的空间 https://stackoverflow.com/questio ...

  3. 使用微信web开发者工具调试微信企业号页面(前端页面,已发布在服务器上的)

    前几天写了一篇使用fiddler调试微信端页面的,然后博友评论说使用fiddler太麻烦了,推荐使用微信web开发者工具调试微信页面,这两天弄着玩了一下,很强大.这篇文章只是做一个记录,方便自己以后使 ...

  4. 微信web开发者工具调试

    微信web开发者工具调试 前几天写了一篇使用fiddler调试微信端页面的,然后博友评论说使用fiddler太麻烦了,推荐使用微信web开发者工具调试微信页面,这两天弄着玩了一下,很强大.这篇文章只是 ...

  5. 一个基于React整套技术栈+Node.js的前端页面制作工具

    pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量.此项目创意来自网易乐得内部项目nfop中的pagemaker项目.原来项目的前 ...

  6. 前端教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-资源汇总

    内容精简 资源这么多,多看看多学习再总结肯定是好的.多读读就算看重了不算浪费时间,毕竟一千个读者就有一千个林黛玉,还有温故而知新,说不定多读一些内容,就发现惊喜了呢.不过,在此也精简一些内容,就1~2 ...

  7. 前端-页面性能调试:Hiper

    前端-页面性能调试:Hiper   我们写单页面应用,想看页面修改后性能变更其实挺繁琐的.有时想知道是「正优化」还是「负优化」只能靠手动刷新查看network.而Hiper很好解决了这一痛点(其实Hi ...

  8. Chrome DevTools开发者工具调试

    1-1 Chrome DevTools 功能简介 (九大功能面板) (1)Elements元素面板 检查和调整页面,调试DOM,调试CSS (2)Network网络面板 调试请求,了解页面静态资源分布 ...

  9. 使用eclipse+fiddler+微信web开发者工具调试本地微信页面

    前面已经说了调试服务器上的微信页面,放链接:http://www.cnblogs.com/Gabriel-Wei/p/5977850.html 还有fiddler调试链接:http://www.cnb ...

  10. 移动前端页面与Chrome的远程真机调试

    一年不见,博客园都长草啦...... 前几日刚入手新手机小米5,系统真心流畅呀.为啥要买小米5呢,因为要提高生产力呀,好好玩移动前端开发呀哈哈哈 那么问题来了,要怎么调试手机上的前端页面呢? 很久很久 ...

随机推荐

  1. DA指令通俗理解

    DA指令通俗理解 最近在学微机的过程中,学到DA指令时对其底层实现感兴趣,但是搜集了网上的资料并没有讲的很清楚易懂的,遂有此文章,来分享一些我对这个指令的理解. 1.DA指令的作用 DA A这条指令书 ...

  2. springboot添加ssl实现https访问(http自动跳转)

    目录 Step1 Step2 Step3 Step4 Step5 Tips: 直接docker部署的时候端口号问题 Step1 去搞一个证书,我的是腾讯买域名送的 Step2 下载jks格式的 Ste ...

  3. 如何基于three.js(webgl)引擎架构,实现3D密集架库房,3D档案室智能巡检

      前言: 看了一下 距离上篇课程发布,一年多了.这一年多来也迷茫,也怀疑,在AI时代,是不是失去了写文章的意义了.切身感受到那种面对科技浪潮时的迷茫和无力感.当AI能写出流畅.结构清晰的文章,甚至模 ...

  4. Dify实战案例:MySQL查询助手!嘎嘎好用

    有了 AI 之后,我们在查询数据库的时候就不需要使用数据库客户端或程序(如 Java.Python)来查询了,我们可以直接使用 AI 来查询数据库,并且查询语句都不用你来写了,AI 会自动帮你生成. ...

  5. 第2周2_神经网络基础之Python与向量化

    神经网络基础之Python与向量化¶ 1. 向量化¶ ① 深度学习算法中,数据量很大,在程序中应该尽量减少使用loop循环语句,而可以使用向量运算来提高程序运行速度. ② 向量化(Vectorizat ...

  6. 冲刺 CSP 联训模拟2

    题面 温馨提示 代码中的变量名可能与题意.题解不同. 代码不删缺省源,可以直接拿来对拍. T1 挤压 Solution 众所周知,异或是一种按位运算,不好进行十进制的数间合并.我们考虑将每个数拆分为二 ...

  7. Luogu P10501 Cutting Game 题解

    P10501 Cutting Game 博弈论经典题目,考虑使用 SG 函数解决. 但是这一题和有向图游戏的定义不同,在有向图游戏不能操作者判负,而这一题中操作出某个状态者判胜.因此,我们需要进行转化 ...

  8. 密度泛函理论(DFT)简介

    密度泛函理论(DFT)简介 密度泛函理论(Density Functional Theory,DFT)是一种现代量子力学计算方法,广泛应用于原子.分子和固体材料的电子结构研究. DFT 的基本思想: ...

  9. java 中的序列化与反序列化

    简介 简单来说, java 为了在网络和硬盘上进行传输和存储进行的设计, 将一个序列化是将对象转为字节码, 然后反序列话将字节码回复成对象. 其中有一个 serialVersionUID 参数, 是为 ...

  10. vmtools 安装 灰色

    简介 vmtools 的快照功能相当给力有很多的测试可以放在虚拟机中执行而不用当心搞坏系统 vmtools 安装后屏幕的大小能自适应,带来一种比较新的体验.值得一试!!! 基本的安装步骤可以参考 他人 ...