news 2026/10/24 1:32:43

LTE测试入门:TM500 TMA用户手册核心要点与自动化实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LTE测试入门:TM500 TMA用户手册核心要点与自动化实战

简介:《TM500 LTE Test Mobile Application用户指南》是Aeroflex(艾法斯)官方发布的TD-LTE基站测试工具手册,面向华为、中兴、大唐、诺基亚-西门子等设备厂商的研发与测试工程师,解决基站射频性能、协议栈和系统级行为的验证难题。这份指南详细介绍了TM500测试终端如何模拟真实移动终端,如何在实验室重现实际网络条件,并给出了测试场景搭建、设备配置、操作步骤、示例配置与故障排查等完整流程。手册覆盖多种网络制式,支持TD-LTE基站的射频一致性、协议一致性与应用层性能测试,同时提供文本约定、文档套件指引、支持培训渠道及反馈机制,方便不同层级用户快速找到所需信息。资源共1个文件,为DOCX格式文档,压缩包大小4.62MB,文档目录清晰、模块化组织,适合按需查阅。目前已有278人学习下载,尤其适合需要在实验室环境中精准验证LTE基站性能的工程师参考。

1. 一张 2010 年的用户手册,为什么仍是 LTE 测试入门的必修课:TM500 LTE Test Mobile Application 是什么

第一次拿到 TM500 测试手机的人,打开 PC 端的 TMA(Test Mobile Application)通常都是同一个反应:窗口七八个、菜单十几条、测试步骤上百种,没人告诉你某个信道参数该填整数还是枚举,也没人告诉你日志转换失败到底是格式选错还是日志没写完。这份 2010 年 2 月 26 日发布的《TM500 LTE Test Mobile Application User Guide》,原厂文档号 46882/878 Issue 16,在 LTE 基站研发与生产测试圈子里几乎算得上入门教材。

它解决的不是“哪个按钮干什么”,而是“怎么把测试场景想清楚再落到 TMA 里”。TM500 本身是一台模拟真实终端的网络测试仪,用来验证基站的射频指标、协议栈行为和数据业务能力,而这份手册讲的就是如何操作 TMA 把这个验证过程跑起来。适合三类人:刚接手 LTE 基站测试的新手,从其他仪表平台转过来想快速上手的老手,以及要给团队搭自动化回归环境的人。

2. 把 TMA 驯服成自己的测试工具:主窗口、工具窗口与 11 组 Preferences 的取舍

TMA 是运行在 PC 上的 TM500 控制端软件,测试人员看到的界面就是它的主窗口:上方是菜单和工具栏,中间是工作区,底部是状态栏。真正干活全靠那些 Tool Windows——Test Manager、测量视图、日志窗口、Command Line、Error Monitor、会话历史,每个都可以独立停靠、浮动和重新排列。布局这东西很玄学,同一个项目组里,两个人屏幕上的 TMA 往往是两副面孔,但测试结果必须对齐,所以第一步别急着点按钮,先把窗口和偏好设置统一。

2.1 主窗口与工具窗口:先认识布局再干活

TMA 主窗口本身不承载具体测试逻辑,它更像一个容器,所有功能都以工具窗口的形式挂在上边。默认打开时,Test Manager 通常占据左侧或中央,测量和日志窗口分布在下方或右侧,Error Monitor 平时处于收起状态。工具窗口可以拖出来变成浮动窗,也可以停靠到任意边缘,双击标题栏还能自动收缩成侧边条。

我一般会按“左侧测试管理、中间测量视图、下方日志与错误监视、右侧会话历史”的方式排,把最常用的几个窗口固定,不常用的收进自动隐藏。这样跑一个长时测试时,眼睛不需要在屏幕上找窗口。文档里专门有一节讲 Arranging Tool Windows,就是告诉你怎么把窗口排成自己顺手的样子。注意一点:窗口布局是随会话保存的,如果 TMA 异常退出,布局可能回滚到上一次正常关闭的状态,所以别在界面卡死时直接杀进程。

2.2 11 组 Preferences 分别管什么

Preferences 对话框里能看到全部运行参数,文档把它们分成 11 组。这 11 组不是都可以乱动的,我按影响面排了个序,表格里标注了每组跟日常操作的关联度。

Preferences 分组主要配置内容对日常测试的影响
ConnectionTM500 设备标识、连接链路类型、端口参数连不上设备时先查这里
Data Log日志保存目录、文件命名规则、写入方式决定后处理找不找得到文件
Conversionlog 文件转换的目标格式与输出目录转换失败时首先排查
Command Line命令行窗口行为、外部命令调用自动化场景必须设对
Error Monitor错误监视的显示策略与触发条件排障时信息全不全看这里
External Tools外部辅助工具的路径和调用参数扩展分析能力时用
Session History会话历史的保存策略与深度影响回放和界面性能
Performance Tuning日志缓冲大小、处理线程优先级长时间测试卡不卡看这里
Performance Charting Priority图表刷新优先级与绘图节流界面响应速度直接受影响
Test Manager测试管理器的默认行为和显示选项写脚本的效率
Incident Reporting事件报告的产生条件与收集范围故障定位辅助

这里面 Connection、Data Log、Conversion 和 Performance 四组是日常最常动的,下面展开说。

2.3 连接偏好与性能偏好:最影响实操的两组

Connection preferences 决定了 TMA 能挂上哪台 TM500。常见配置项包括设备地址、连接端口、终端编号,以及是否需要拨号建立链路。如果状态栏一直显示 Offline,先别怀疑仪表坏了,多数情况是这里的终端编号和 TM500 面板上的编号对不上,或者连接方式选错了。文档里提到的 TMA remote automation 也依赖这一组配置,远程自动化模式下,连接参数是否正确直接决定脚本能在哪台机器上跑起来。

Performance Tuning 是另一组容易被忽略但很关键的设置。TM500 长时间跑自动测量时,数据量会持续灌进日志缓冲,如果缓冲太小而界面又在实时刷新图表,TMA 会越来越迟钝。做长时间稳定性测试之前,我一般会把日志缓冲调到较大档位,把 Performance Charting Priority 里的图表刷新优先级调低,让界面绘制给数据处理让路。这个思路跟做服务器压测时关掉可视化是一个道理,界面好看不如数据完整。

2.4 数据日志、转换与会话历史偏好:把后路铺好

Data Log preferences 设置的是测量日志写到哪里、文件名怎么生成。很多团队一开始用默认目录,跑几天测试后发现日志散落一堆,连哪条对应哪次测试都分不清。我习惯把输出目录改成按日期命名的子目录,一天一个文件夹,文件名里带测试场景名,这样后处理省事很多。

Conversion preferences 关系到日志后处理。TMA 记录的原始 log 文件格式并不适合直接做数据分析,通常要转成更通用的文本或表格格式。这里需要指定目标格式、转换后的输出目录,以及是否保留协议原始数据。Session History preferences 则控制会话历史保留多长时间、记录哪些操作。它看起来只是“留个操作记录”,但真到了复现问题、对比两次测试差异的时候,会话历史就是后悔药。

3. 用 Test Manager 组织测试流程:套件、用例、脚本和 Test Steps 参数的填法

Test Manager 是 TMA 里组织测试用例的核心窗口。新手最容易犯的错是直接在某个测试步骤上改参数跑一次,跑完就丢,下次要用再重新配一遍。文档的第 4 章和第 5 章合起来看,才知道 Test Manager 的层级和 Test Steps 的参数规则是一套完整的组织方法。

3.1 Test Manager 的层级:套件、用例、脚本、命令

Test Manager 的层次关系很清晰:测试套件(Test Suite)是最顶层,套件下面挂测试用例(Test Case),用例里面是测试脚本(Test Script),脚本由一条条命令(Command)组成,而命令本质上就是在执行具体的测试步骤。模板和快捷方式在这一层很实用,模板可以把一组配置好的步骤存下来反复引用,快捷方式则能跨套件直接跳转到某个用例。

文档里提到的 Working with Test Suites、Test Cases、Test Scripts、Commands 四节,对应的就是这四级结构。实际项目里我建议按“套件对应一轮测试任务、用例对应一个测试场景、脚本对应场景里的一组操作”来划分,而不是把几十个用例平铺在同一个套件里。层级分好了,后面加注释、做筛选、生成报告都方便。

3.2 生成一个简单脚本的五个动作

文档里有个“How to generate a simple script”的专题,它给出的路径其实可以压缩成五个动作:

  1. 在 Test Manager 窗口新建一个测试套件,命名时带上项目名和日期。
  2. 在套件下新建测试用例,写清楚验证目标。
  3. 在用例里添加测试脚本,脚本名建议按测试步骤顺序编号。
  4. 在脚本中添加测试步骤,从步骤列表里拖入 System Control、Channel Configuration、Measurement 等节点。
  5. 逐个配置步骤参数,确认无误后保存。

这五个动作看起来简单,但第 4 步和第 5 步才是真正的门槛。测试步骤有一百多种,每种步骤的参数类型和取值范围都不同,后面单独讲。保存之后,整个套件可以整体导出、复制或归档,下次做回归测试直接把历史套件调出来改参数就行,不用从零搭。

3.3 测试步骤组速查表

文档第 5 章给了一份完整的测试步骤列表,按功能分成了 12 组。我把它整理成一张速查表,日常写脚本时对着这张表找步骤会快很多。

步骤组典型用途常用参数
System Control系统复位、电源状态控制、等待时间复位模式、延时
Script Control脚本内分支、循环、等待和跳转条件参数、循环次数
Measurement发起手动或自动测量,控制日志记录测量组、类别、记录时长
Layers 1/2物理层和数据链路层行为配置调制方式、重传次数
Channel Configuration配置上下行物理信道参数频点、带宽、RB 起始位置
Channel Deletion删除已配置的信道,复位信道状态信道索引
Test Features打开或关闭专项测试特性特性开关、特性参数
Higher Layers配置 RRC 等高层协议行为消息类型、内容字段
NAS控制附着、去附着等 NAS 信令流程附着类型、APN
APT与 APT 相关的测试流程控制APT 模式、触发条件
Data Service Generator产生上下行数据业务流量包大小、速率、持续时间
Override Tables覆盖协议栈默认参数表参数 ID、覆盖值

这张表不需要背,但它能帮你在写脚本时迅速判断“我要做的动作属于哪一组该去哪里找”。其中 Override Tables 最容易忽略,它适用于想强制测试边界参数的场景,比如把某个定时器设成协议允许的最小值。

3.4 测试步骤参数怎么填:枚举、数值与边界

测试步骤参数的类型大致分四类:整数、枚举、布尔、字节串。整数参数有范围限制,枚举参数只能选下拉列表里的值,布尔参数就是开或关,字节串参数按十六进制填。参数填错时系统会报 invalid value,但不会告诉你具体是哪个字段,只能自己排查,这个坑后面第 5 章会具体讲。

举个例子,配置一个下行信道时,频点、带宽、RB 起始位置和调制方式是典型的四类参数。常见做法是先在界面上把这些参数填好,再把脚本导出看内部结构,大致会长这样:

<!-- 一个典型的测试步骤参数配置示例,实际结构与TMA导出格式相关 --> <testStep type="ChannelConfiguration" name="配置PDSCH"> <parameter name="band" value="38"/> <parameter name="dlEarfcn" value="38000"/> <parameter name="bandwidth" value="20"/> <parameter name="rbStart" value="0"/> <parameter name="rbCount" value="100"/> <parameter name="modulation" value="QPSK"/> </testStep>

这里几个参数的填法很有代表性:band 和 bandwidth 是整数,bandwidth 的取值必须是协议规定的集合之一;rbStart 和 rbCount 是整数,但 rbStart 加 rbCount 不能超过带宽对应的 RB 总数;modulation 是枚举,只能填 QPSK、16QAM、64QAM 这类固定值。如果你把 modulation 填成小写 qpsk,或者把 rbCount 填成超出范围的值,保存时就会报错。所以我建议在界面里选参数而不是直接手敲,界面会约束取值范围。

3.5 模板与快捷键:减少重复劳动

同一个测试场景反复跑的时候,模板的价值就体现出来了。把一组配好的 Channel Configuration 步骤存成模板,新用例里直接拖进来再改个别参数,比重新填一遍快得多,而且不容易填错。文档里提到 Creating Shortcuts 也是这个思路,把常用的用例或脚本加到快捷方式里,避免每次都在套件树里层层展开。

另外文档还专门讲了 Adding and Editing Comments,这一步别偷懒。测试步骤加上注释,说明“这个参数为什么这样设”,两周后你自己回来看脚本都省力,更别说团队其他人要接手你的测试套件。注释不多占资源,但排障时能省几个小时。

4. 测量、日志与会话回放:从 L3 Status 到星座图的完整数据链路

Test Script 跑起来之后,真正要盯的是测量结果和日志。文档第 6 章把测量和日志放在一起讲是有道理的——测量配置决定采集什么数据,日志决定数据落到哪里,而会话历史决定了事后能不能把现场完整还原。这一整条链路理顺了,测试才不是黑匣子。

4.1 三种日志类型怎么选

文档把 Logging Types 分成三大类:Layer 3 Status 日志、手动测量日志、自动测量日志。三者的区别不只是触发方式,而是适用场景完全不同。

日志类型适用场景特点
L3 Status Logging观察 RRC、NAS 等协议状态变迁记录信令状态流,适合协议调测
Manual Measurements手动触发专项测量,跑一次看一次数据量小,适合定位问题
Automatic Measurements长时间稳定性测试、回归测试按事件或周期自动记录,适合批跑

L3 Status 日志在排查“终端为什么没附着上”这类问题时最有用,它能看到协议状态走到哪一步断掉的。手动测量适合单点验证,比如刚改完一个射频参数,立刻拉一次测量看结果。自动测量则是长时间跑测试的主力,日志按预设条件触发,磁盘占用可控,不会把所有原始波形都存下来。

4.2 测量组和类别:附录 A 的 ID 表怎么查

文档附录 A 是一张 Measurement Group and Category ID 对照表,这是配置 Measurement 测试步骤时的核心依据。测量组是大类,比如射频信号质量、传输性能、协议行为,每个组下面再分若干 Category,对应具体测量项。配置步骤时要先选 Group 再选 Category,然后指定日志类型和记录时长。

这里有个易踩的坑:不同软件版本下,Group 和 Category 的 ID 编号可能调整过,不要凭记忆填数字。配置时从界面下拉列表里选,或者对照手册附录 A 的当前版本核对。表结构大致是这样,具体 ID 以文档附录为准:

Group 用途常见 Category记录内容
射频信号质量EVM、频率误差、发射功率调制精度与功率参数
传输性能BLER、吞吐量数据面传输质量
协议行为状态迁移、定时器超时信令流程与状态

测量配好之后,TMA 生成的星座图是判断调制质量的直观手段。看星座图时盯着 EVM 数值和散点分布,点位聚拢且偏离理想点小,说明射频链路质量好;散点发散成环形或者云状,大概率是相位噪声或放大器线性度问题。

4.3 数据日志选项与 log 文件转换

Data Logging Options 控制日志以什么规则写入磁盘,包括文件命名、保存目录、是否记录协议原始数据、以及磁盘满时是否循环覆盖。长时间跑测试建议开启循环覆盖,同时把日志目录放在剩余空间充足的盘上,避免日志写满系统盘导致 TMA 卡死。

原始 log 文件转成通用格式的操作,文档里专门有 Converting Log Files 一节。基本流程是:

  1. 在测量视图或会话历史里选中要转换的日志文件。
  2. 打开 Conversion 设置,选择目标格式和输出目录。
  3. 确认源日志没有还在写入的状态,日志记录完全停止后再转。
  4. 执行转换,等进度条走完。
  5. 用文本编辑器或表格工具打开结果,抽查几个关键字段确认没有乱码。

转换失败的常见原因,一是目标格式选错,二是日志文件本身损坏或没写完整,三是记录过程中 TMA 异常退出导致文件头缺失。判断标准很简单:先用 TMA 自带的测量视图打开这个日志,如果 TMA 自己都打不开,转出来大概率也是废文件。

4.4 会话历史:排查问题的后悔药

Session History 会记录 TMA 的完整操作轨迹,包括每次跑了哪些测试步骤、改了哪些参数、产生了哪些日志。文档里的 Using Session History、Exporting and Importing Sessions、Generate Command Log Files、Generate Data Files from the Session History 这几节,讲的都是怎么利用这份历史。

排查问题时我的习惯是:先打开会话历史,看测试执行时间线,定位到出问题的那一次,再看当时的参数和日志。这样比凭记忆复现现场可靠得多。会话历史还可以导出导入,换一台机器或者把测试现场发给同事分析,都能保持现场原样。

5. 常见问题与排查:接不上、找不到、参数不生效的五个翻车现场

用了这份手册之后,最常见的求助不是“这个功能怎么用”,而是“为什么设置对了还是不行”。下面这五个场景我基本都撞过,写出来省得你再翻一遍文档。

5.1 连不上 TM500

现象:TMA 状态栏一直显示 Offline,连接操作没有任何反应。

原因:Connection Preferences 里的终端编号和 TM500 面板不一致,或者连接链路类型配置错误;还有一种情况是 TM500 本身没有处于可连接状态。

解决:先看 TM500 面板状态,确认它已经上电并进入等待连接状态,然后逐项核对 Connection 配置里的设备标识和端口参数,最后打开 Error Monitor 看底层错误信息。换一台确认正常的 TM500 试一下,能快速判断是不是仪表侧的问题。经验是,八成情况出在终端编号填错,不是设备坏了。

5.2 调好的窗口布局重启就乱

现象:前一天排好的工具窗口位置、显示状态,第二天开机全回到默认布局。

原因:布局状态是随会话保存的,TMA 异常退出时配置没有写回,回滚到了上一次正常关闭时的样子;或者当前使用的 Profile 本身没有保存布局信息。

解决:调好布局后,正常退出 TMA 之前确认会话历史里有对应的关闭记录,同时把配置存成一个专用 Profile。不要直接结束进程退出 TMA,尽量走正常关闭流程。

5.3 测试步骤参数报非法值

现象:保存测试脚本时提示 invalid value,但对话框没标出是哪个参数不合法。

原因:枚举参数填了自由文本,或者整数参数越界;还有一种情况是参数之间存在联动关系,比如 RB 起始位置加 RB 数量超过当前带宽允许的最大值。

解决:鼠标悬停在字段上查看类型提示,枚举参数必须从下拉列表里选;整数参数先确认取值范围,再确认跟其他参数的联动约束。最稳妥的方式是从已验证的脚本里复制一个同类型步骤改参数,而不是从空步骤开始填。填入成功后立即保存一次,把“合法值”固化下来。

5.4 日志转换结果打不开

现象:转换完成后的文件在文本编辑器里是乱码,或者打不开。

原因:Conversion 偏好里的目标格式选错,源日志和输出格式不匹配;另一个常见原因是日志还在写入时就启动了转换,读到了半个文件。

解决:等日志记录完全停止再执行转换;转换前用 TMA 自带的测量视图先打开日志确认文件完整;检查 Conversion 偏好里的输出格式设置,改成实际需要的文本或表格格式。

5.5 长时间测试越跑越卡

现象:自动测量跑了半小时后,界面点击延迟越来越高,日志窗口刷新肉眼可见地慢。

原因:Performance Tuning 里的日志缓冲设得太小,或者 Performance Charting Priority 里图表刷新优先级太高,界面绘制抢占了数据处理资源。

解决:在 Preferences 里调大日志缓冲,把图表刷新优先级降低。如果只是做自动化回归,不需要人工盯界面,就进入远程控制模式,让 TMA 在后台跑,把界面刷新降到最低。跑长任务前先做一个 10 分钟的短任务验证稳定性,再放开跑整晚。

6. 用 RCI 把 TMA 变成自动化黑匣子:远程连接、命令分类与批处理封装

TMA 本身支持远程自动化,文档第 11 章讲的 Remote Control Interface(RCI)就是干这个的。日常手工操作 Test Manager 写脚本只能算第一步,真正提升效率的是把 TMA 纳入自动化测试框架,让脚本调度仪器而不是人去点按钮。

6.1 远程连接的两种姿势

一种是在本机的 Windows 命令行里启动 TMA,带参数直接进入测试场景;另一种是从另一台电脑通过网络连接到 TM500,由 TM500 上的 TMA 接收外部命令并执行。后一种适合把测试终端放在实验室、人在办公室调度的场景。RCI 是 TMA 暴露给外部程序的接口,通过它可以实现连接的建立和断开、日志配置和测试执行控制。

6.2 LC_GRP 与 LC_CAT 和日志控制命令

RCI 命令大体分成四类:连接与断开、日志配置、日志控制、状态指示。日志配置里最常用的是 LC_GRP 和 LC_CAT,分别用来选择测量组和测量类别。比如先执行 LC_GRP 选射频信号质量这一组,再用 LC_CAT 选 EVM 这个类别,最后用日志控制命令启动记录。状态指示消息则把测量结果和执行状态回传给外部脚本,供上层框架判断测试是否通过。

一个最小自动化流程的命令序列大致是这样:

@echo off REM 最小自动化流程:连接 TM500 -> 配置测量 -> 启动日志 -> 执行测试 -> 停止日志 -> 断开 RCI_CONNECT 192.168.1.100 LC_GRP 1 LC_CAT 3 LOGGING_START REM 这里插入测试场景触发命令,比如配置信道或启动数据业务 LOGGING_STOP RCI_DISCONNECT

这段脚本的逻辑很直白:先建立连接,接着选测量组和类别,启动日志,等测试场景执行完再停止日志,最后断开连接。实际项目中,中间那段注释位置通常是一条或一组控制测试步骤执行的命令,具体命令名取决于你的测试场景编排方式。封装成批处理之后,整个回归流程可以被外部框架反复调用,每次测试的日志文件还能按时间戳自动归档。

我刚做自动化那阵子,总想一口气把所有命令写进一个脚本,结果一跑就卡在某个环节,翻日志排查半天。后来固定了一个习惯:每次搭批处理之前,先手动跑一遍最小流程,确认连接、测量组、日志控制三个环节都通,再往脚本里补测试动作。从那以后,我每次写 RCI 脚本都强制走一遍这个最小验证,翻车率降了大半。这份用户指南的 PDF 版我已经整理进下载资源,里面包含完整的测量分组附录和命令参考,做自动化搭建时可以直接对照着查。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 1:32:34

Agent沙箱技术选型与落地:从进程隔离到云原生安全基建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/24 1:31:58

Java iText7实战:生成带中文字体与Excel样式的水印PDF表格

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/24 1:31:57

电阻抗层析成像EIT/ECT从仿真到重建的完整技术链路与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/24 1:30:58

AI对话模板:面向落地的结构化人机协作协议

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/24 1:30:24

基于JavaWeb的人脸识别与GPS定位考勤系统防代打卡实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华