Linux无障碍环境搭建:13年UI测试工程师实战指南
|
接口超时告警那一刻,我正蹲在工位底下掏咖啡渣——咖啡机坏了,漏了一地,黏脚。监控大盘上那条绿色的线一直在抖,跟去年过年期间那个无障碍环境搭到一半时一模一样。你记不记得?那会儿产品硬说“语音导航只要念出按钮文字就行”,结果测到第七个页面,NVDA根本没声儿,log里刷得全是“AT_BRIDGE_NOT_READY”,日志刷得太快看不清,我就把终端字号调到12,还是扫不出错在哪行。 我原以为是AT-SPI2装漏了模块,结果发现是dbus-user-session没启,systemd --user那块直接跪着。但没人敢动它——老王年前回家前改过一次,发版后登录页全变黑屏,回滚都没用,最后靠他远程手敲`loginctl enable-linger $USER`才续上命。现在谁提`--user`都像提雷管。可问题是你不启它,`at-spi-bus-launcher`连socket都不建,NVDA连桥都搭不上,更别说读取GTK3的`atk_object`了。优胜劣汰?对。活下来的不是最健壮的,是最后一次没被灰度切掉的。 机箱嗡嗡响。李工坐我斜后方,边敲键盘边打电话谈房租,声音压得很低,但“押金不退”那句我听清了。他上周还在改表结构,加了个`aria_label_override`字段,本意是让前端覆盖无障碍描述,结果没配幂等校验,灰度时两个定时任务同时往同一行写,脏数据直接把读屏器导到404页——不是报错,是静音跳转。你见过盲人用户卡在空路由里反复 swipe 吗?没有错误提示,没有焦点反馈,只有手机喇叭一声不吭。我们那天复盘三个小时,就为确认:是不是真没声儿,还是声儿被 mute 了。后来查 log,发现是 PulseAudio 的`flat-volume`默认开,而 NVDA 自己又去 set_volume(0),两头拧着干。
文章配图,仅供参考 外卖筷子掉在地上。我捡的时候看见隔壁组小张在工位隔断上贴的便签卷了边,上面写着“`/usr/share/a11y/locales/zh_CN.UTF-8` → 删”。她删完没跑测试,第二天晨会说“语音包体积太大,影响冷启动”,其实只是嫌`espeak-ng`编译太慢。可这玩意儿删了,`orca`连中文标点都分不清顿挫,用户划到句号,它念成“点儿”,再划一下,才补“句号”。不是 bug,是语义塌方。去年过年期间我们就在这坑里陷过两天——测试用例跑通了,人眼看着也OK,结果用户反馈:“你们的‘提交’按钮,念的是‘tiān jiāo’”。历史代码与祖传逻辑。那个`gtk+3.0`的`ATK_ROLE_IMAGE`判断逻辑,十年前抄的GNOME官方示例,里面有一行`if (g_strcmp0(role, "image") == 0) return FALSE;`,意思是图像元素默认不读,除非你手动加`accessible-name`。但没人记得为什么是FALSE,只记得当年线上爆过一次读屏器把加载中菊花念了三百遍,运维连夜加限流。后来大家就默认“图像一律不曝名称”,哪怕那是带操作语义的图标按钮。没人敢动它,因为上个月新需求要加个“语音搜索麦克风图标”,前端按规范写了`aria-label="语音搜索"`,后端接口却悄悄把`role=image`透传过去了——字段改了,但中间层缓存没清,老缓存键还在用旧字段名。雪崩?不至于。但用户点了七次,才等到一句“正在识别”。 所以现在我搭Linux无障碍环境,第一步不是装Orca、不是配Pipewire、更不是跑`a11y-test-suite`,而是翻`.bashrc`里有没有`export NO_AT_BRIDGE=1`——上次是谁加的?忘了。但我知道,只要这行还在,整个AT-SPI链就死在第一跳。第二步,看`loginctl show-user $USER | grep -i linger`,必须是`yes`。第三步……算了,第三步我也不信自己,每次都要`journalctl -u at-spi-dbus-bus --since "2 hours ago" | tail -20`再扫一遍。反正日志刷太快,扫完也记不住。但我知道,绿线抖的时候,别先看QPS,先拔网线——有次抖得特别规律,一秒三下,最后发现是隔壁运维在跑`ping -i 0.33`测延迟,撞上了D-Bus的heartbeat timeout窗口。谁碰过那个窗口?我没。你碰过? 小陈昨天问我:“能不能把无障碍支持打包进CI?”我说可以啊,加个`orca --debug`跑三秒,看exit code。他试了,code是0。但log里最后一行是“`WARNING: Failed to connect to AT-SPI bus`”。他截图问我,“算通过吗?”我盯着那行字看了四十秒,没说话。你知道为什么?因为去年过年期间,我们就是靠这个exit code上线的。七台测试机,六台报failed,一台莫名其妙pass,我们就把它当基线。后来才发现,那台机器上残留着老版本`at-spi2-core`,自带一个兜底的fallback socket路径——路径不对,但恰好能连上。别的机器连不上,是因为新版默认删了兼容路径。没人改代码,没人修文档,就靠那一台机子活着。现在想想,所谓优胜劣汰,有时候汰的不是弱者,是那个没凑巧装对路径的人。 我今晚准备重装一遍Debian 12,从最小镜像开始,不装desktop,就`apt install orca at-spi2-core pipewire-pulse`。装完立刻`loginctl enable-linger`,然后关机。明天早上来,先看机箱嗡嗡声有没有变调——上次变调,是硬盘坏前四十八小时。其他的,再说。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux深度学习环境搭建:从报错到运行的完整排障路径
Linux环境搭建太慢?3步绕过90%配置陷阱
Linux与Windows服务器选型的5大性能陷阱
Linux新手避坑指南:11年开发者亲授安装配置
Linux老手也常踩的5个Unix环境搭建坑
Linux安全环境搭建:18年导航优化师的生产级配置指南
Linux数据库环境搭建七步实操指南