自动化测试截图时出现字符编码(乱码)问题求助
解决Headless Chrome在CentOS7上截图乱码的问题
我之前维护Ruby+Capybara自动化测试项目时,也碰到过一模一样的情况——本地截图显示正常,远程CentOS机器上的截图却出现方块乱码。结合你给出的环境信息,给你几个针对性的解决思路:
一、优先排查字体缺失问题(最常见原因)
CentOS 7默认没有预装中文字体,Headless Chrome渲染页面时找不到对应字体,就会用方块替代显示。解决步骤:
- 先检查系统已安装字体:
如果看不到宋体、黑体这类中文字体,就需要补充安装。fc-list - 安装常用中文字体,比如文泉驿微米黑:
yum install -y wqy-microhei-fonts - 安装完成后,重启测试服务或重新启动ChromeDriver,再运行测试用例验证。
二、调整Chrome启动参数优化渲染
在你的headless_chrome驱动配置里,添加几个和字体渲染相关的参数,强制规范渲染行为:
Capybara.register_driver :headless_chrome do |app| options = Selenium::WebDriver::Chrome::Options.new options.add_argument 'headless' options.add_argument 'disable-gpu' options.add_argument 'disable-popup-blocking' options.add_argument 'no-sandbox' # 添加以下优化参数 options.add_argument '--font-render-hinting=medium' options.add_argument '--default-font-size=14' options.add_argument '--force-device-scale-factor=1' options.add_argument '--disable-font-subpixel-positioning' Capybara::Selenium::Driver.new app, browser: :chrome, options: options end
三、检查文件名编码问题
你的截图文件名包含scenario.name,如果场景名称有中文,CentOS的文件系统编码环境可能导致文件名乱码,间接影响截图渲染逻辑。可以尝试把文件名转成纯英文格式:
# 把场景名称里的非英文字符替换为下划线 safe_name = scenario.name.gsub(/[^a-zA-Z0-9_\-]/, '_') page.save_screenshot("testResults/report_smoke_mobile/screenshot_#{safe_name}.png")
四、考虑升级ChromeDriver和Chrome版本
你当前使用的ChromeDriver 2.38对应Chrome 65-67版本,虽然版本匹配,但老版本的Headless模式在字体渲染上存在已知bug。建议升级到更稳定的版本组合,比如:
- ChromeDriver 2.41 对应 Chrome 67-69
- 或者直接升级到更晚的兼容版本(注意严格对应Chrome和ChromeDriver的版本号)
五、手动验证Headless环境
可以在远程CentOS机器上直接运行Headless Chrome截图,排除测试框架的影响:
google-chrome --headless --disable-gpu --screenshot --window-size=1280,720 https://你的测试页面地址
查看生成的screenshot.png是否乱码:
- 如果手动截图也乱码:确定是系统字体缺失或Chrome本身的环境问题
- 如果手动截图正常:那可能是Capybara的配置或截图代码的问题
内容的提问来源于stack exchange,提问作者Batuhan Kilic
相关产品推荐
相关产品推荐

