Selenium 工程化模板(日志+异常截图,可直接复制使用)

适配你的业务快照监控场景:自动记录运行日志,发生异常时自动保存页面截图,程序结构规范,方便后续接入定时任务。

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException
import logging
import os
from datetime import datetime

# -------------------------- 配置区域 --------------------------
TARGET_URL = "https://xxx业务页面"
WAIT_SECONDS = 10
# 截图保存目录
SCREENSHOT_DIR = "./screenshot"
# 日志保存目录
LOG_DIR = "./log"
# -------------------------------------------------------------

# 创建文件夹
os.makedirs(SCREENSHOT_DIR, exist_ok=True)
os.makedirs(LOG_DIR, exist_ok=True)

# 日志配置
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler(f"{LOG_DIR}/selenium_run.log", encoding="utf-8"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)


def get_chrome_driver() -> webdriver.Chrome:
    """获取无头Chrome驱动"""
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    # 关闭图片加载可进一步提速(可选)
    # chrome_options.add_argument("--blink-settings=imagesEnabled=false")

    driver = webdriver.Chrome(
        service=Service(ChromeDriverManager().install()),
        options=chrome_options
    )
    driver.set_page_load_timeout(30)
    driver.implicitly_wait(2)
    return driver


def save_screenshot(driver: webdriver.Chrome, mark: str):
    """保存截图,文件名带时间戳"""
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"{SCREENSHOT_DIR}/{mark}_{timestamp}.png"
    try:
        driver.save_screenshot(filename)
        logger.info(f"截图已保存:{filename}")
    except Exception as e:
        logger.error(f"截图保存失败: {str(e)}")


def run_page_check():
    driver = None
    try:
        driver = get_chrome_driver()
        logger.info(f"开始访问页面:{TARGET_URL}")
        driver.get(TARGET_URL)

        # 等待页面核心容器加载,根据你的页面修改定位器
        WebDriverWait(driver, WAIT_SECONDS).until(
            EC.presence_of_element_located((By.ID, "main-container"))
        )
        logger.info("页面核心元素加载完成")

        # 正常页面快照
        save_screenshot(driver, "normal")

        # 这里可以增加业务校验逻辑,例如读取页面文本、校验状态
        # text = driver.find_element(By.ID, "status").text
        # assert "正常" in text

    except TimeoutException:
        logger.error("页面等待超时")
        if driver:
            save_screenshot(driver, "timeout_error")
    except NoSuchElementException:
        logger.error("找不到页面元素")
        if driver:
            save_screenshot(driver, "element_error")
    except WebDriverException as e:
        logger.error(f"浏览器驱动异常:{str(e)}")
        if driver:
            save_screenshot(driver, "driver_error")
    except Exception as e:
        logger.error(f"未知异常:{str(e)}", exc_info=True)
        if driver:
            save_screenshot(driver, "unknown_error")
    finally:
        if driver:
            driver.quit()
            logger.info("浏览器已关闭")


if __name__ == "__main__":
    run_page_check()

使用说明

  1. 修改配置区:TARGET_URL 替换为你的业务页面;By.ID, "main-container" 修改为页面上代表页面加载完成的核心元素
  2. 运行后自动生成两个文件夹:log 日志文件、screenshot 截图文件
  3. 正常访问 :生成 normal_时间戳.png;异常:自动保存对应错误类型截图,便于问题排查
  4. 日志同时输出到控制台+本地文件,方便长期运维审计
相关推荐
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 15-Django 内置Admin系统
后端·python·django
夜晚回家1 小时前
Python 变量入门详解 | 用 BMI 案例串起赋值、乘方与取整
android·python
Wokoo71 小时前
Selenium:元素定位、动态适配与性能优化(二)
前端·selenium·自动化
技术人生0011 小时前
Selenium4 Python 完整教程(适合网页自动化、页面数据采集、UI自动化测试)
python·ui·自动化
小小张说故事1 小时前
Python 里 a is b 有时 True 有时 False?小整数缓存和常量折叠的底层真相
python
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 16-Django 内置Admin认证系统
后端·python·django
ZGonce8191 小时前
vLLM 使用实战:在 8GB 显卡上完成模型部署、并发压测与显存调优
python
XZ-0700012 小时前
week8-代码解析2
python
小虎牙^O^2 小时前
棋盘格隐写:基于奇偶相位的双图隐藏与还原
图像处理·python·安全