Python-Selenium报错截图

news2025/12/14 20:33:37

报错截图设计方案:

​ 功能:截图层主要用来存放selenium运行时的报错截图信息

1. 截图路径管理

  • 分层存储:在项目根目录下创建 screenshots 文件夹,并按日期进一步分类(如 20250601)。
  • 命名规范:截图文件名包含错误类型和精确时间戳(如 error_el_message_20250601_143022.png),便于快速定位问题。
  • 自动创建目录:使用 os.makedirs(exist_ok=True) 确保目录存在,避免手动创建。

2. 多类型错误检测

  • 多样化定位策略:支持 XPath、ID、ClassName、CSS 选择器等多种定位方式,覆盖不同框架的错误组件(如 Element UI、Ant Design)。
  • 关键词扫描:若未找到特定错误组件,扫描页面源码中的错误关键词(如 error错误异常)。
  • 自定义错误类型:为不同定位方式设置专属错误类型标签(如 el_messageant_message),便于后续分析。

3. 智能错误捕获

  • 显式等待机制:使用 WebDriverWait 等待错误元素出现,避免因页面加载延迟导致的误判。

  • 异常处理

    • 捕获 TimeoutExceptionNoSuchElementException 以跳过不存在的定位器。
    • 处理页面源码扫描时的异常,并记录为 page_source_error
  • 多轮检测:先检查特定错误组件,再扫描页面源码,确保全面覆盖。

4. 信息完整性

  • 错误信息记录:截图时保存错误文本内容(如 用户名不存在/密码错误),便于后续分析。
  • 操作反馈:通过打印日志提示截图路径和错误详情,支持自定义消息。

5. 扩展性设计

  • 可配置定位器:错误定位器以元组形式存储在列表中,便于添加新的定位方式。
  • 错误类型分类:支持自定义错误类型标签,方便后续统计和筛选。

6. 异常安全保障

  • 多层异常捕获:在不同层级捕获异常,确保即使某个检测环节失败,仍能生成通用错误截图。
  • 健壮的路径生成:使用 os.path 模块处理路径,确保跨平台兼容性。

示例代码:

class ErrorChecker:
    def __init__(self, driver):
        self.driver = driver
        
    def get_screenshot_path(self, error_type="unknown"):
        """获取截图保存路径"""
        # 获取项目根目录
        project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        # 在项目根目录下创建screenshots文件夹
        screenshot_dir = os.path.join(project_root, "screenshots")
        # 创建截图目录(如果不存在)
        os.makedirs(screenshot_dir, exist_ok=True)

        # 获取当前日期作为子文件夹名
        date_folder = time.strftime("%Y%m%d")
        screenshot_path_dir = os.path.join(screenshot_dir, date_folder)
        # 创建日期子目录(如果不存在)
        os.makedirs(screenshot_path_dir, exist_ok=True)

        # 生成带完整日期时间的截图文件名
        timestamp = time.strftime("%Y%m%d_%H%M%S")
        return os.path.join(screenshot_path_dir, f"error_{error_type}_{timestamp}.png")

    def save_screenshot(self, error_type="unknown", message=""):
        """保存截图并打印消息"""
        screenshot_path = self.get_screenshot_path(error_type)
        self.driver.save_screenshot(screenshot_path)
        if message:
            print(message)
        print(f"📸 错误截图已保存至: {screenshot_path}")
        return True

    def check_and_capture_error(self):
        """检查页面是否存在错误提示,并在发现时截图"""
        # 定义多种定位方式的错误提示元素
        error_locators = [
            # XPath定位
            (By.XPATH, "//div[contains(@class, 'el-message--error')]//p", "el_message"),
            (By.XPATH, "//div[contains(@class, 'ant-message-error')]", "ant_message"),
            (By.XPATH, "//div[contains(@class, 'error-text')]", "error_text"),
            (By.XPATH, "//div[contains(@class, 'toast-error')]", "toast_error"),

            # ID定位
            (By.ID, "errorMessage", "error_message_id"),
            (By.ID, "error-container", "error_container_id"),

            # Class Name定位
            (By.CLASS_NAME, "error-message", "error_message_class"),
            (By.CLASS_NAME, "alert-danger", "alert_danger_class"),

            # CSS选择器定位
            (By.CSS_SELECTOR, ".error-box .message", "error_box_css"),
            (By.CSS_SELECTOR, "#errorContent", "error_content_css"),

            # Name属性定位
            (By.NAME, "error-display", "error_display_name"),
            (By.NAME, "errorInfo", "error_info_name")
        ]

        try:
            # 遍历所有可能的错误提示元素
            for locator_type, locator_value, error_type in error_locators:
                try:
                    error_element = WebDriverWait(self.driver, 1).until(
                        EC.visibility_of_element_located((locator_type, locator_value))
                    )
                    error_text = error_element.text
                    return self.save_screenshot(error_type, f"⚠️ 捕获到错误: {error_text}")
                except (TimeoutException, NoSuchElementException):
                    continue

            # 如果没有找到自定义错误提示,则检查页面是否存在其他错误
            try:
                # 获取页面源码
                page_source = self.driver.page_source

                # 如果页面中包含常见的错误关键词,则进行截图
                error_keywords = ['error', 'exception', 'failed', '错误', '异常', '失败']

                for keyword in error_keywords:
                    if keyword.lower() in page_source.lower():
                        return self.save_screenshot(f"keyword_{keyword}", f"⚠️ 捕获到错误关键词: {keyword}")

                print("✅ 未发现任何错误")
                return False

            except Exception as e:
                return self.save_screenshot("page_source_error", f"❌ 检查错误时发生异常: {str(e)}")

        except Exception as e:
            return self.save_screenshot("general_error", f"❌ 检查错误时发生异常: {str(e)}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

乾元通渠道商中标青海省自然灾害应急能力提升工程基层防灾项目

近日,乾元通渠道商中标青海省自然灾害应急能力提升工程基层防灾项目,乾元通作为设备厂家,为项目提供通信指挥类装备(多链路聚合设备)QYT-X1。 青岛乾元通数码科技有限公司作为国家应急产业企业,深耕于数据调…

openssl-aes-ctr使用openmp加速

openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发;因为aes-ctr加解密模式中,不依赖与上一个模块的加/解密的内容,所以对于aes-ctr加解密模式是比较适合进行并行加速的…

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南

随着互联网技术的不断发展,在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分,用户可以在线下单、查询订单状态,管理员可以处理订单、管理…

计算机网络第1章(上):网络组成与三种交换方式全解析

目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换(Circuit Switching)3.2 报文交换(Message Switching)3.3 分组交换(Pa…

Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)

我们已经讲过了okhttp和登录系统的使用,我们今天做一个完整的登录系统,后端用springmybatis去做 数据库内容 -- 创建学生信息表 CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,…

计算机网络第1章(下):网络性能指标与分层模型全面解析

目录 一、计算机网络的性能指标1.1 性能指标1:速率1.2 性能指标2:带宽1.3 性能指标3:吞吐量1.4 性能指标4:时延1.5 性能指标5:时延带宽积1.6 性能指标6:往返时延1.7 性能指标7:信道利用率 二、计…

恶意软件清理工具,让Mac电脑安全更简单

​你的Mac最近是不是开始表演"电子迷惑行为"?浏览器主页突然变成澳门赌场,风扇转得比直升机螺旋桨还猛......恭喜你!可能中奖获得"恶意软件大礼包"!别慌,今天就教你用恶意软件清理工具化身数字特工…

HackMyVM-Jabita

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…

112 Gbps 及以上串行链路的有效链路均衡

通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案,例如发射机加重均衡、接收机CTLE(连续时间线性均衡器)、FFE(前馈均衡器)、DFE(判决反馈均衡器)和FEC(前向纠错&…

Python-13(永久存储)

创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名,如果没有添加路径,那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式,r表示读取(…

记录一次session安装应用recyclerview更新数据的bug

首先抛出异常日志,在 先说结论:因为session安装监听是在点击事件里面,所以会保留旧的对象数据 直接上代码,原有的逻辑是点击时执行session安装,并注册监听回调 private fun installApk(position: Int) {val packageIns…

大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART

点一下关注吧!!!非常感谢!!持续更新!!! 大模型篇章已经开始! 目前已经更新到了第 22 篇:大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…

力扣面试150题--二叉树的锯齿形层序遍历

Day 56 题目描述 思路 锯齿形就是一层是从左向右,一层是从右向左,那么我们可以分析样例,对于第奇数层是从左向右,第偶数层是从右向左,于是可以采取一个计数器,采取链表方式,从左向右就是正常插…

如何在 CentOS / RHEL 上修改 MySQL 默认数据目录 ?

MySQL 是一个广泛使用的开源关系数据库管理系统(RDBMS),为无数的 web 应用程序和服务提供支持。默认情况下,MySQL 将其数据存储在预定义的目录中,这可能并不总是适合您的需求。您可能希望将数据目录移动到另一个位置以获得更好的性能和安全性…

简历制作要精而不简

不得不说,不管是春招,还是秋招,我们在求职时,第一步便是制作一份简历。不得不承认,好的简历,就像一块敲门砖,能让面试官眼前一亮,让应聘成功的概率增添一分。 对于一个初次求职者来…

SPA-RL:通过Stepwise Progress Attribution训练LLM智能体

SPA-RL:通过Stepwise Progress Attribution训练LLM智能体 在大语言模型(LLM)驱动智能体发展的浪潮中,强化学习(RL)面临着延迟奖励这一关键挑战。本文提出的SPA-RL框架,通过创新的分步进度归因机…

【深度学习】9. CNN性能提升-轻量化模型专辑:SqueezeNet / MobileNet / ShuffleNet / EfficientNet

SqueezeNet / MobileNet / ShuffleNet / EfficientNet 一、背景与动机 随着深度神经网络在图像识别任务上取得巨大成功,它们的结构越来越深、参数越来越多。然而在移动端或嵌入式设备中: 存储资源有限推理计算能力弱能耗受限 因此,研究者…

Relational Algebra(数据库关系代数)

目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product(笛卡尔积) Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…

Chorme如何对于youtube视频进行画中画背景播放?

画中画可以让你小窗播放,然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放,游览器最小化就可以,但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…

017搜索之深度优先搜索——算法备赛

深度优先搜索 如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…