今天这篇就是补一个很简单但非常好用的小技巧:失败截图

写自动化脚本时,如果脚本跑挂了,尤其跑在 CI/CD、Docker、远程服务器上,你根本看不到发生了啥。这时候有一张“事发现场”的截图,往往能帮你节省一大堆排查时间。


一、核心方法:driver.save_screenshot(filename)

Selenium 的截图功能其实非常简单:

driver.save_screenshot("screenshot.png")

就是保存当前浏览器的可视区域截图。


二、最常见的用法:失败时自动截图

建议你把每个操作包一层 try/catch,一旦失败就立刻截图保存:

import time

def safe_click(driver, by, value, screenshot_prefix="error"):
    try:
        element = driver.find_element(by, value)
        element.click()
    except Exception as e:
        filename = f"{screenshot_prefix}_{int(time.time())}.png"
        driver.save_screenshot(filename)
        print(f"点击失败,已截图保存为:{filename}")
        raise e

你还可以扩展为自动截图并记录日志,或者发送通知。


三、搭配 WebDriverWait 的失败截图

比如等待超时了,也可以加上截图:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "main-content"))
    )
except Exception:
    driver.save_screenshot("wait_failed.png")
    raise

四、建议封装一个截图辅助函数

不要每次都写 save_screenshot,可以写个工具函数统一管理:

import os

def take_screenshot(driver, name="debug"):
    folder = "screenshots"
    os.makedirs(folder, exist_ok=True)
    path = os.path.join(folder, f"{name}_{int(time.time())}.png")
    driver.save_screenshot(path)
    print(f"[截图已保存] {path}")

你在任何地方只要调用:

take_screenshot(driver, "search_box_missing")

就能留下一张现场证据图,特别适合排查页面结构变动问题。


五、截图之外的思考

截图只是辅助调试的一种方式,如果你要把自动化跑稳,建议:

  • 每个关键步骤都包 try/except,别裸奔
  • 每个异常都记录日志 + 截图,方便复盘
  • 可以配合日志系统 / 通知工具(如钉钉、企业微信)自动提醒
  • 用时间戳 + 流水线 ID 命名,避免截图覆盖

六、补一个实战场景

之前我在某个电商后台跑脚本,结果 UI 改版了,导致元素定位失效。脚本一直卡在 .click() 那一步,但页面已经变了。

如果没有截图,我可能需要花很久才知道哪里出问题。但截图一看就清楚:按钮根本不见了,改成了下拉菜单。

所以这就是自动化调试的 x 光


七、总结

失败截图说实话不是啥高级功能,但真的实用。

建议你哪怕懒得写封装,也要在主流程加几个关键截图点,能省你很多 debug 的时间,尤其是远程执行 / 容器化部署时。


添加微信