ARTICLE DETAIL

资讯详情

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

信创环境下CKEditor粘贴Word/WPS内容的适配测试方法与踩坑实录

信创环境下CKEditor粘贴Word/WPS内容的适配测试方法与踩坑实录 先交代一下背景我这半年一直在做政企信息化系统的信创适配测试最磨人的一项就是用户从 Word/WPS 复制一段图文粘贴到 CKEDITOR 富文本编辑器里内容能否完整、不乱地保存下来。这个动作看起来只是 CtrlC、CtrlV 两下但在信创环境下牵涉国产操作系统、国产浏览器、国产办公软件、前端编辑器四条链路基本每个组合都出过问题。这篇文章我把整套适配测试的方法、用例设计和踩坑经验整理出来给正在做同类项目的测试、前端和后端同学一个可直接复用的参考。先说明一下这套方法并不是什么高深理论就是我在实际项目里反复跑出来的流程。CKEDITOR 目前在很多存量系统里还是 4.x 版本所以下文以 CKEditor 4 的插件机制和配置为主来举例思路完全可以迁移到新版。重点解决的是环境矩阵怎么搭、素材库怎么建、用例怎么设计、问题怎么排查以及那些文档里不会写的小细节。1. 信创环境下粘贴场景的整体拆解1.1 用户在做什么一条看不见的四段链路表面上看粘贴就是一个动作但实际数据要经过四段链路第一段是来源端 Office 软件WPS、Word、永中把内容写入系统剪贴板第二段是浏览器从剪贴板里读数据触发 paste 事件第三段是 CKEDITOR 收到 HTML 后执行清洗、过滤、重写第四段是后端存储再回显。每一段都可能出问题而且问题现象常常要到第四段才暴露出来排查时特别费劲。先看第一段。Office 软件复制内容时写进剪贴板的并不只有纯文本还包括带格式的 HTML、RTF、OLE 对象等多种格式。以 WPS 为例它生成的 HTML 和微软 Word 生成的有差异尤其是表格、公式、自动编号部分。WPS 里复制一个带合并单元格的表格粘贴后 HTML 里colspan、rowspan的写法就经常不合规范直接导致 CKEDITOR 在清洗时丢掉部分单元格。第二段是浏览器。信创环境下的国产浏览器基本都是 Chromium 套壳但版本普遍偏低对 Clipboard API 的支持程度不完全一致。有些浏览器在 Linux 桌面上读剪贴板时只给到纯文本HTML 数据直接为空有些浏览器第一次粘贴会触发权限询问用户没注意点掉就导致粘贴失败。这些在 Windows 上几乎不会出现但在信创环境下属于高频问题。第三段是 CKEDITOR 的处理逻辑。它默认启用 pasteFromWord 插件会对 HTML 做过滤去掉 Word 的命名空间、清理多余的 class、把内置样式转换成内联样式。这个清洗逻辑是为微软 Office 的 HTML 设计的碰到 WPS 产出的 HTML 时容易出现两类毛病一类是清洗过度表格边框、背景色被删没了一类是清洗不到位留下大量mso-*样式导致页面样式被内联样式覆盖看起来又大又乱。第四段容易被忽略。粘贴进去的内容最终会存成 HTML 入库再加载回显。我在测试中碰到过一种情况前端页面看着没问题刷新后就乱套了。最后定位是后端数据库字段设计成了varchar长度两千多字符长文档保存时被截断。所以适配测试不是只测“粘贴”这一个动作从复制到保存、再回显整条闭环都得跑。1.2 为什么信创环境下问题格外多三座大山的叠加信创环境问题多的核心原因可以概括成一句话原来熟悉的组件全部换了一个更陌生的版本而且它们之间的兼容关系没人帮你验证过。第一座大山是 Office 换了。信创终端主用 WPS。WPS 与微软 Word 的剪贴板 HTML 格式有差异在图片、公式、批注上尤其明显。微软 Word 的公式在剪贴板里常以 OLE 对象存在浏览器根本读不到WPS 的公式复制到剪贴板有时给的是图片有时给的是 MathML得看具体版本。不同版本之间的差异本身就是测试要覆盖的变量。第二座大山是浏览器换了。国产浏览器多数基于 Chromium 开源项目改造但国内厂商普遍基于旧版本基线开发新特性跟进不及时。Chromium 91 和 Chromium 120 在剪贴板读取行为上就有差别。有些改造过的浏览器为了安全限制非用户手势下的剪贴板读取还有浏览器默认启用了强制 GPU 加速在老显卡的国产整机上渲染大文档时出现花屏、卡顿。这些跟编辑器本身没关系但都会表现为“粘贴后显示异常”。第三座大山是操作系统换了。基于 Linux 的麒麟、统信系统里剪贴板机制与 Windows 差别很大。X11 与 Wayland 两种显示协议下剪贴板数据的传递方式不同同一个 HTML 片段在 Wayland 环境下有时取不到自定义格式只能取到纯文本。中文字体命名规则也不一样Windows 下的“宋体”在 Linux 下可能叫“SimSun”也可能不存在导致粘贴过来的文字自动回退成默认字体。这三座大山叠加在一起就出现了信创环境下最典型的场景同一个系统、同一份素材在 A 组合麒麟 奇安信 WPS下正常在 B 组合统信 红莲花 WPS下表格边框丢失在 C 组合麒麟 360 安全浏览器 永中下图片直接不显示。没有环境矩阵这个问题根本摸不清边界。1.3 适配测试到底要回答哪些问题做适配测试不能上来就对着页面一顿点先要把问题域定清楚。我把粘贴适配需要回答的问题分成了四个域格式保真域、内容完整域、交互稳定域、数据安全域。格式保真域回答的是标题层级、字体字号、段落缩进、列表编号、表格结构是否和原文一致。内容完整域回答的是图片是否正常显示、公式是否可识别、超链接是否可点击、特殊符号是否乱码。交互稳定域回答的是粘贴时页面是否卡顿、粘贴后是否需要刷新才能显示、连续粘贴多次是否出错、粘贴大文档会不会直接崩溃。数据安全域回答的是清洗规则是否会误删必要内容、入库是否截断、回显是否变形。这四个域并不是并列关系优先级从高到低内容完整 格式保真 交互稳定 数据安全。如果一个文档粘贴过来内容丢了那格式做得再漂亮也没意义。实际执行时我是把每个域都拆成具体的检查点再把这些检查点映射到用例上保证每一条用例都有明确的问题域归属避免测试时只盯着页面好看不好看。2. 测试准备环境矩阵、素材库与用例设计2.1 环境矩阵先正交后补点别把组合铺到无穷信创适配测试最大的坑是组合爆炸。CPU 有龙芯、飞腾、鲲鹏、兆芯、海光系统有麒麟、统信、中科方德浏览器有奇安信、360、红莲花、搜狗Office 有 WPS、永中、金山政企版。全组合铺开是几十上百个环境资源再多也测不完。我的做法是先建优先级矩阵。按客户实际使用比例和风险大小把组合分成 P0、P1、P2 三级等级组合说明P0麒麟 V10 奇安信浏览器 WPS政务项目最常见组合必须覆盖P0麒麟 V10 360 安全浏览器极速模式 WPS存量客户量大必须覆盖P0统信 UOS 红莲花浏览器 WPS统信区重点项目必须覆盖P1麒麟 V10 奇安信浏览器 永中 Office有客户实际使用覆盖重点功能P1统信 UOS 360 安全浏览器 WPS组合变化不大覆盖回归用例P1中科方德 红莲花浏览器 WPS部分行业客户在用覆盖核心用例P2P0 组合下的 ARM 整机验证架构差异重点跑性能和长文档P2P0 组合下的飞腾/鲲鹏/龙芯整机主要验证 CPU 兼容性P0 组合全量用例跑P1 组合跑核心用例加冒烟P2 组合只跑关键路径。这样总测试量可以控制在合理范围同时保证主要风险被覆盖。环境矩阵要写成一份可视化表格贴在工位上每跑一个组合就更新一次状态防止测试人员测着测着忘了哪些环境已经跑完。2.2 素材库建设把 Word 材料当成资产来管理适配测试离不开测试素材。我发现很多团队犯同一个错误测试时随手找一个 Word 文档就粘贴粘完就扔根本没有素材库的概念。这样做的结果是问题复现困难——同一个问题换一份素材就提不出 bug开发也没法定位。素材库的建设有三条原则。第一素材要贴近真实业务。政务系统里最常见的不是花哨的排版而是公文正文、项目申报书、会议纪要、技术方案。公文里必备红头、多级标题、标准表格技术方案里必备图文混排、目录、图文说明申报书里必备复杂表格、合并单元格。这些场景都要有对应素材。第二素材要能追溯。每一份素材都要记录它的来源哪个 Office 版本生成的、用的什么字体、有没有特殊对象。我给素材编号的规则是S001_标准公文_含表格图片_WPS2022.docx一眼能看出用途和来源。素材文件不能随意改动改一次版本号更新一次否则测试时发现问题连“原材料是什么”都说不清楚。第三素材要分级。我习惯把所有素材分成 A、B、C 三级。A 类素材代表核心功能比如标准公文、复杂表格预期结果必须完全正确B 类素材允许降级比如长度超长的文档只要不丢核心内容就算通过C 类素材是可选验证比如特殊排版、艺术字这类内容允许不完全还原。分级的好处是避免把资源耗在“本来就不支持”的功能上同时让业务方提前知道边界。2.3 用例矩阵设计从真实业务开始反推用例设计这一点我踩过最大的坑是“只按功能点写用例”写出来一大堆但用户真实的操作路径覆盖不到。后来改成从业务场景反推用户拿到一份 Word 文档打开 WPS全选复制到网页里粘贴保存刷新再编辑。每一条用例都对应真实动作这样测出来的问题更贴近线上。用例矩阵至少有三个维度。第一维是来源 Office 类型微软 Word、WPS、永中。第二维是内容类型纯文本、带格式文本、图文混排、复杂表格、公式、多级编号、长文档。第三维是粘贴方式和目标状态CtrlV、右键粘贴、拖拽粘贴到空白页、粘贴到已有内容中间、粘贴后立即保存、连续粘贴多次。下面是我实际在用的一个用例模板用例编号PASTE_QT_001 前置条件麒麟 V10 SP1、奇安信浏览器、WPS 2022 测试素材S001 标准公文含标题、三段落、两图片、一表格 操作步骤 1. 用 WPS 打开 S001CtrlA 全选 2. CtrlC 复制 3. 打开业务系统进入 CKEDITOR 空白页 4. CtrlV 粘贴 5. 点击保存刷新页面 预期结果 - 标题、段落、表格结构完整 - 两张图片正常显示 - 表格列宽与原文一致 - 刷新后格式不变 实际结果填写 备注截图 HTML 源码 报错信息这种模板写进测试管理系统里每个环境组合对应一套用例集跑完一组就汇总一次。用例量不用太多覆盖 P0 组合的核心场景大概 40 到 60 条就够了关键是每一条都要可执行、可定位、可复现。3. 实操过程与核心环节实现3.1 三步走从复制到保存全流程跑通实际操作时我把一次完整的粘贴适配测试拆成三步复制、粘贴、保存回显。每一步都有必须盯住的细节。复制阶段要重点看“从哪里复制”。有些用户习惯在 WPS 里 CtrlA 全选整个文档这样会把分节符、页眉页脚区域的内容也带进来。CtrlA 复制出来的 HTML 经常包含奇怪的div和section标签粘贴到 CKEDITOR 里会产生大量空行或者多余框线。测试时必须同时验证“全选复制”和“光标选中正文复制”两条路径因为这两个动作的 HTML 差异很大。粘贴阶段的第一动作不是看页面渲染效果而是打开源码模式看 HTML 结构。我实测下来很多“看起来正常”的粘贴HTML 里已经埋了大量隐性垃圾。比如 WPS 会给表格外层的 div 加上styleborder-collapse: collapseCKEDITOR 清洗后可能留下无效的style属性影响后续编辑。看源码模式能第一时间判断清洗是否合理。保存回显阶段容易被忽视。粘贴完成后点击保存需要等页面重新加载再确认内容是否和粘贴时一致。我在测试中发现过一种情况粘贴时图片正常保存后刷新图片全部变成红叉。原因是图片以 base64 形式嵌入 HTML后端存储长度超限被截断。如果不做“保存-刷新-再编辑”的回归这种问题要等用户线上反馈才会暴露。3.2 CKEDITOR 关键配置与参数选择CKEditor 4 的粘贴行为主要受 pasteFromWord 插件配置控制。下面这套配置是我在信创项目里验证过比较稳的组合可以直接抄CKEDITOR.replace(editor1, { forcePasteAsPlainText: false, pasteFromWordRemoveFontStyles: true, pasteFromWordRemoveStyles: true, allowedContent: { h1: { attributes: [class] }, h2: { attributes: [class] }, h3: { attributes: [class] }, p: true, table: { attributes: [border, cellpadding, cellspacing, style], classes: [table] }, img: { attributes: [src, alt, title, width, height] }, ol: true, ul: true, li: true, strong: true, em: true, a: { attributes: [href, target] } } });逐个解读一下。forcePasteAsPlainText必须设成false否则粘贴进来的格式全部丢掉公文场景直接不可用。pasteFromWordRemoveFontStyles和pasteFromWordRemoveStyles我建议都设为true让粘贴结果尽量不携带内联样式统一走页面 CSS 控制。这样做的好处是显示一致数据量小坏处是 Word 里的特殊颜色、特殊字体效果会被抹掉需要业务方确认是否接受。allowedContent是 CKEditor 4 的内容过滤器白名单用来规定哪些标签和属性允许保留。白名单设置的原则是“够用就行”。如果白名单太松WPS 产生的o:p、v:shape等标签会留下如果太紧表格的宽度、高度属性会被砍掉导致粘贴后列宽全部丢失。我见过最激进的项目把table的style属性直接禁掉结果每一个表格贴进去都变成默认宽窄这就是白名单设置没做好平衡。CKEditor 5 的配置和 4 不完全一样核心思路差不多。5 里面更推荐用通用 HTML 支持功能配合全局的属性白名单考虑存量信创系统的现状大量项目其实还在用 4所以以 4 为主讲没有过时。3.3 表格、公式、多级标题的实际测试细节这几类内容是粘贴适配的重灾区单独拿出来说。表格方面WPS 生成的 HTML 里表格结构通常写得很随意table没有styletd的宽度靠colgroup控制有时干脆连colgroup都没有。CKEDITOR 清洗之后表格会丢失列宽和边框。我的处理方式是在afterPaste事件里对表格做一次后置纠正CKEDITOR.instances.editor1.on(afterPaste, function () { var tables CKEDITOR.instances.editor1.document.find(table).toArray(); tables.forEach(function (table) { table.setStyle(table-layout, fixed); table.setAttribute(border, 1); table.setAttribute(cellspacing, 0); }); });这个是示例实际部署时还要遍历每个td、th把宽度属性按比例分配。表格测试不只要看边框和列宽还要重点验证合并单元格WPS 里用“合并单元格”做出来的表格粘贴到网页里经常出现单元格错位本来合并了两行三列粘贴后只剩一行。这个问题的根因是清洗规则把colspan、rowspan处理丢了必须在用例里专门标记。公式方面MathType 公式在剪贴板里是 OLE 对象浏览器读不到用户最常用的做法是公式直接复制粘贴结果贴进 CKEDITOR 变成一串乱码。信创环境下 WPS 对公式的支持和老版本 Word 又有差异。测试时要准备两条路线一条是公式以图片形式粘贴一条是公式以 LaTeX 或 MathML 文本形式粘贴。如果业务要保留可编辑公式前端集成 MathJax 渲染后端解析 LaTeX 文本如果只是展示图片就够了但图片方案在保存回显时要重点验证。多级标题方面Word 里的自动编号粘贴到 HTML 后会丢失编号只留下纯文本的“一、”“一”等字符。这个问题在信创环境更明显因为 WPS 自动编号生成的 HTML 结构和微软 Word 不一样。测试时要看源码里ol、ul、li结构是否正确生成如果编号没生成前端用 CSS 计数器补一层编号样式而不是让用户手动加编号。3.4 一份可参考的适配测试报告模板写测试报告也是有套路的。一份能真正指导开发的报告不能只写“通过”“失败”至少包含测试环境、测试对象、测试素材、结果汇总、问题清单、遗留风险。下面是我实际在用的模板骨架环境素材用例数通过失败阻塞麒麟 V10 奇安信 WPSS001-S005484053麒麟 V10 360 WPSS001-S005484431统信 UOS 红莲花 WPSS001-S005483873问题清单推荐用编号管理字段包括问题编号、现象描述、复现步骤、严重程度、根因分析、处理建议、当前状态。举个例子实际提交过一个问题记录问题编号BUG-PASTE-023 现象WPS 中复制含公式的文档粘贴后公式区域显示为空白 步骤打开 S004_公式文档全选复制粘贴到 CKEDITOR查看公式区域 严重程度高 根因分析WPS 复制公式时以 OLE 对象写入剪贴板浏览器无法解析 处理建议前端提供公式粘贴替代方案图片或 LaTeX后端考虑用 POI 类组件对上传 Word 做解析转换 状态待开发评估测试报告里的截图要同时截“所见即所得渲染效果”和“HTML 源码视图”很多时候两个截图一对问题根因就能看出来。4. 常见问题与排查技巧实录4.1 高频问题速查表我把信创环境下 CKEDITOR 粘贴 Word 内容的高频问题整理成了速查表遇到相同现象直接对照查现象可能根因紧急措施长久方案粘贴后文字全部挤在一行换行符未转换或 forcePasteAsPlainText 配置错误检查相关配置项开启 pasteFromWord 插件统一内容清洗规则粘贴后字号突然变大变小内联字号与页面 CSS 冲突开启样式移除配置建立字体映射表图片显示为红叉或空白base64 数据过长被截断或剪贴板图片读取失败走后端图片上传通道粘贴时自动将图片转对象存储表格边框消失、列宽错乱WPS 表格 HTML 结构与清洗规则不兼容事件后置处理补 table 属性开发专门表格清洗模块粘贴大文档时浏览器卡死渲染大量 HTML 造成主线程阻塞分批插入或提示用户分段粘贴优化 DOM 插入逻辑保存刷新后格式全丢后端字段长度不足或过滤规则太激进扩展字段类型检查入库数据后端存储与过滤规则联合评审公式粘贴后变成乱码OLE 对象浏览器不识别以图片方式粘贴公式集成公式编辑器或 LaTeX 渲染中文文件名粘贴后乱码文件编码与数据库字符集不一致统一转 UTF-8规范字符集映射这张表不是万能的但能帮测试人员最快定位到排查方向。实际工作中我还会在表后面加两列“是否影响 P0 客户”和“是否阻塞版本发布”用来排迭代优先级。4.2 排查路径从现象到根因的顺序动作粘贴问题排查最怕一上来就乱改配置。我总结了一套顺序动作先做哪些、后做哪些是固定的。第一步是复现并固定操作路径。先关掉浏览器扩展、清掉缓存再按固定步骤操作确认问题能稳定复现。如果只是偶发配合录屏工具记录现场。第二步是导出剪贴板数据。CKEDITOR 的 paste 事件里能看到原始 HTML 和处理后的 HTML对比两者差异就能知道是浏览器没给到数据还是编辑器清洗出了问题。调试代码可以直接扔到控制台里CKEDITOR.instances.editor1.on(paste, function (e) { var raw ; if (e.data.dataTransfer e.data.dataTransfer.getData) { raw e.data.dataTransfer.getData(text/html) || ; } console.log(剪贴板原始 HTML 长度, raw.length); console.log(原始 HTML 开头, raw.substring(0, 1000)); console.log(编辑器处理后 HTML, e.data.dataValue.substring(0, 1000)); });第三步查 CKEDITOR 的过滤规则和 allowedContent确认是不是白名单把必要标签干掉了。第四步看浏览器 Console 和 Network有没有脚本报错、图片上传请求有没有发出。第五步才是改代码调配置。这五步走完大部分问题都能定位到“来源端”“浏览器端”“编辑器端”“后端”中的某一层。还有一个排查技巧把粘贴后的 HTML 源码完整保存成.html文件在浏览器里单独打开渲染对比业务系统里渲染的效果。这个操作能快速判断问题是编辑器数据问题还是后端存储再渲染的问题。4.3 实测下来的几点经验与避坑技巧最后说几条只有实际跑过才体会得到的经验。第一别只测 CtrlV。右键菜单粘贴和拖拽粘贴在有些国产浏览器里走的是不同的剪贴板读取路径。我测过一款浏览器CtrlV 正常右键粘贴只给纯文本数据直接丢。如果只测 CtrlV这个线上高发问题就漏掉了。第二第一次粘贴前弹权限提示不是 bug。很多国产浏览器第一次访问剪贴板会弹“是否允许访问剪贴板”用户点拒绝后后续粘贴就全失效。测试步骤里要把这个动作写进去同时产品层面要加一个“粘贴失败”的引导提示否则用户不知道是自己点了拒绝。第三素材文件不要通过 U 盘中转。内网环境里用 U 盘拷贝的 Word 文件如果文件名是中文且编码不一致读取时可能出现文件名乱码粘贴内容也跟着乱。素材统一放在内网服务器上文件命名用“数字英文”避免编码问题。第四斜线表头大概率要改造。Word/WPS 里的斜线表头粘贴到网页里基本都会变成普通线条或消失。这个功能很少是刚需测试结论建议直接写成“不支持需业务侧确认”不要在这个点死磕。第五多次保存回归比单次粘贴更能发现问题。我惯用的做法是粘贴 → 保存 → 刷新 → 重新打开编辑器 → 再粘贴一次 → 再保存。很多问题不是第一次粘贴时暴露的而是第二次保存后出现的数据被重复清洗格式越搞越乱。第六有些粘贴异常根本不是前端问题。比如粘贴一个大表格保存异常后端日志报字段超长查一遍数据库 schema 发现是varchar(255)。这类情况要能在排查路径里想到后端不然在编辑器配置上折腾一整天都找不对方向。写在最后的个人体会我自己这一轮信创适配测试做下来最大的感受是粘贴这个功能在传统测试里就是“能粘就行”但到了信创环境它就是一套完整的兼容性工程。Office 换了、浏览器换了、操作系统换了每个环节的差异都在这里集中爆发。我个人的建议是做这个测试之前先别急着看代码把环境矩阵排好优先级素材库做成标准资产用例围绕真实业务展开这三个基础打扎实了后面所有问题都会变得有迹可循。至于那些“粘贴后卡死”“表格全乱”的疑难问题基本都是组合差异导致的回到剪贴板数据本身去查往往比在页面上一遍遍试验更有效。最后再分享一个很小的技巧凡是粘贴出问题第一步永远是先把剪贴板里的 HTML 导出来看一眼八成场景当场就能定位。很多问题修不对真不是代码写得少而是还没看到那一行数据。
返回列表