今天写的这个内容,主要是给自动化脚本补一块很多人忽略的功能:日志系统

我以前写 selenium 脚本的时候,报错全靠 print(),流程全靠猜,出问题要不是插一堆调试语句,要不就是翻控制台输出。后来干脆抽出一套轻量的日志封装,每一步操作、异常、截图路径,统统能打进 log 文件里,查问题就舒服太多了。


一、为啥一定要有日志系统?

原因很简单:

  • 多线程、批量跑时:控制台输出混乱不堪,看不清谁错了
  • 异步执行 / 定时任务:你根本看不到控制台输出,靠日志定位问题
  • 远程执行 / CI/CD:日志是唯一你能留下的线索
  • 调试失败截图:截图路径在哪,得靠日志记下来
  • 流程记录回溯:做过什么操作,操作是否成功?print 满地都不靠谱

二、推荐两种方案

  • 🧱 内置 logging:标准库,无依赖,略显繁琐
  • 🪄 loguru:强烈推荐,语法简洁,功能强大,适合个人项目/中型脚本

下面我主要用 loguru 展示(你也可以自己替换为 logging


三、快速接入 loguru

安装:

pip install loguru

封装为 log_utils.py(建议放在项目 utils 目录下):

from loguru import logger
import os
from datetime import datetime

def init_logger(log_dir="logs", log_name_prefix="auto"):
    os.makedirs(log_dir, exist_ok=True)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    log_path = os.path.join(log_dir, f"{log_name_prefix}_{timestamp}.log")

    logger.add(log_path,
               format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
               level="DEBUG",
               rotation="10 MB",
               retention="7 days",
               encoding="utf-8")
    return logger

然后在你的主脚本中用:

from log_utils import init_logger

logger = init_logger()

logger.info("开始执行测试脚本")
logger.debug("定位元素中...")
logger.error("找不到元素!")

每次运行,都会自动在 logs/ 目录下生成一份带时间戳的 log 文件,按天 / 大小分割。


四、log + selenium 实战场景举例

失败截图 + 日志:

from selenium.common.exceptions import NoSuchElementException

try:
    element = driver.find_element(By.ID, "search")
    element.send_keys("test")
except NoSuchElementException:
    take_screenshot(driver, "no_search_box")
    logger.error("找不到搜索框,已截图保存")

测试步骤打日志:

logger.info("打开登录页")
driver.get("https://example.com/login")

logger.info("输入用户名/密码")
driver.find_element(By.ID, "user").send_keys("admin")
driver.find_element(By.ID, "pwd").send_keys("123456")

logger.info("点击登录按钮")
driver.find_element(By.ID, "login").click()

五、封装日志 + 关键流程更稳

你可以把每个关键操作包一层“安全操作 + 日志”:

def safe_click(driver, by, value, description="点击某个按钮"):
    try:
        element = driver.find_element(by, value)
        element.click()
        logger.info(f"{description} 成功")
    except Exception as e:
        take_screenshot(driver, "click_error")
        logger.error(f"{description} 失败:{e}")
        raise e

然后你在主流程中可以这样调用:

safe_click(driver, By.ID, "submit", "点击提交按钮")

日志里就能看到每一步的状态,图也拍好了,出错就有痕迹。


六、如果你坚持用 logging 呢?

也行,不过语法稍繁琐,初始化建议也抽封装一下。

import logging

def init_logging(log_file="auto.log"):
    logging.basicConfig(
        filename=log_file,
        level=logging.INFO,
        format="%(asctime)s [%(levelname)s] %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S"
    )

不多赘述,用 loguru 简洁得多,尤其在控制台 + 文件双输出、切片、日志等级上。


七、总结

自动化不打日志,就像开车不装仪表盘。

我建议任何写 selenium 自动化的人都把日志封装进自己的工具包里。配合失败截图、异常记录,能帮你跑得更稳、调得更快。


添加微信