必须等待页面完全加载后再截图,推荐显式等待关键元素出现并固定窗口大小与缩放比例,差异比对应缩放降噪后计算SSIM或MSE,优先裁剪ROI区域以避免干扰。

截图前必须等页面完全加载完成,否则 selenium 截的可能是空白或残缺页
很多同学一上来就调用 driver.get(url) 紧接着就 driver.save_screenshot(),结果发现截图里按钮没渲染、文字错位、甚至整个页面是白的。这是因为 get() 只保证 HTML 文档加载完毕,JS 渲染、图片加载、CSS 动画都可能还在跑。
推荐做法是组合使用显式等待:
- 等待某个关键元素出现(比如
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "main-content")))) - 必要时加短延时(
time.sleep(1)),尤其对含懒加载图片或动态水印的页面 - 避免用
driver.implicitly_wait()全局设置——它不适用于判断“视觉就绪”,只管 DOM 节点
Pillow 打开截图后做差异比对,别直接用像素逐点比较
两张图哪怕只有 1px 像素偏移或抗锯齿轻微变化,逐点比对就会全红报警。真实场景要容忍渲染抖动。
更靠谱的做法是:
- 先统一缩放为小尺寸(如 320×240),降噪 + 加速计算:
img1.resize((320, 240), Image.LANCZOS) - 转灰度后计算均方误差(MSE)或结构相似性(SSIM),
skimage.metrics.structural_similarity比纯 PIL 更稳 - 若只关心 UI 区域变动(比如只比对商品列表区域),先用
crop()切出 ROI,再比对,避开 header/footer 的时间戳、广告等干扰项
用 Selenium 截图时,窗口大小和缩放比例必须固定
同一页面在不同分辨率或系统缩放(如 Windows 设置为 125%)下,driver.get_screenshot_as_png() 输出的图尺寸、字体渲染、甚至布局都会变,导致误报差异。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
务必在初始化 driver 时锁定视口:
- Chrome 启动参数加
--window-size=1920,1080(不要用maximize_window(),它依赖系统 DPI) - 禁用缩放影响:
--force-device-scale-factor=1 - 如果测试多分辨率,不要靠 resize 窗口去模拟——每次应新建独立 driver 实例并设对应
--window-size
保存差异图时,Pillow 的 ImageChops.difference() 只适合快速预览,不适合判定是否“有差异”
这个函数返回的是两张图对应像素的绝对差值图,看起来直观(差异处发亮),但亮度≠差异严重程度。它无法区分“按钮颜色从 #007bff 变成 #0077bb”和“整个区块消失”这种量级不同的变更。
真正用于断言的逻辑建议:
- 先算整图 SSIM 得分(范围 [−1, 1]),
score 才视为显著差异 - 再用
numpy统计差异图中非零像素占比:(np.array(diff_img) > 10).sum() / diff_img.size,超过 0.5% 再存图供人工复核 - 差异图本身用
Image.blend(img1, img2, alpha=0.5)叠加显示,比纯红框更易定位问题区域
实际跑起来最常卡住的不是代码写错,而是 Chrome 驱动版本和浏览器不匹配、无头模式下字体缺失导致渲染异常、或者 CI 环境没装好字体库——这些不会抛 Python 异常,但截图就是不对。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










