当前位置: 首页 > news >正文

4. 继承基类实现浏览器_Chrome

继承基类实现浏览器_Chrome

代码架构解析

1. 异常体系定义

class BrowserTypeError(Exception):def __init__(self, _type):self._type = _typedef __str__(self):return f"Browser type {self._type} is not supported"
  • 作用:自定义浏览器类型校验异常
  • 功能
    • 继承Python标准Exception基类
    • 存储引发异常的类型信息
    • 重写__str__方法提供友好错误提示
  • 触发场景:当传入不支持的浏览器类型时抛出

2. 基类BROWSER定义

2.1 类常量配置
class BROWSER:CHROME_DRIVER_PATH = 'drivers/chrome_driver.exe'EDGE_DRIVER_PATH = '../drivers/edge_driver.exe'FIREFOX_DRIVER_PATH = '../drivers/gecko_driver.exe'IE_DRIVER_PATH = '../drivers/IEDriverServer.exe'WINDOWS_SIZE = (1024, 768)IMP_TIME = 30PAGE_LOAD_TIME = 20SCRIPT_TIME_OUT = 20HEADLESS = True
  • 作用:统一管理浏览器配置参数
  • 参数说明
    • *_DRIVER_PATH:各浏览器驱动路径
    • WINDOWS_SIZE:默认窗口尺寸
    • *_TIME:等待策略超时阈值
    • HEADLESS:无头模式开关
2.2 初始化方法
def __init__(self, browser_type: Type[Union[Chrome, Firefox, Ie, Edge]] = Chrome,option_type: Type[Union[ChromeOptions,...]] = ChromeOptions,driver_path: str = CHROME_DRIVER_PATH):# 类型校验if not issubclass(browser_type, (Chrome, Firefox, Ie, Edge)):raise BrowserTypeError(browser_type)if not issubclass(option_type, (ChromeOptions,...)):raise BrowserTypeError(option_type)if not isinstance(driver_path, str):raise TypeError# 参数存储self._path = driver_pathself._browser = browser_typeself._option = option_type
  • 作用:执行浏览器类型安全校验
  • 关键技术
    • 使用TypeUnion进行类型注解
    • issubclass校验类继承关系
    • isinstance验证路径类型
    • 存储实例化参数
2.3 抽象属性方法
@property
def option(self):"""浏览器选项配置接口"""return@property
def browser(self):"""浏览器实例生成接口"""return
  • 设计目的
    • 定义统一接口规范
    • 强制子类实现具体逻辑
    • 分离配置与实例化过程

3. CHROME子类实现

3.1 类常量覆盖
class CHROME(BROWSER):IMP_TIME = 30PAGE_LOAD_TIME = 30SCRIPT_TIME_OUT = 30WINDOWS_SIZE = (1920, 900)HEADLESS = FalseSTART_MAX = '--start-maximized'EXP = {'excludeSwitches': ['enable-automation']}
  • 作用:定制化Chrome参数
  • 参数调整
    • 延长各类等待时间
    • 设置更大窗口尺寸
    • 关闭无头模式
    • 添加窗口最大化参数
    • 配置自动化开关排除项
3.2 选项配置实现
@property
def options(self):chrome_option = self._option()chrome_option.add_argument(self.START_MAX)for k, v in self.EXP.items():chrome_option.add_experimental_option(k, v)chrome_option.headless = self.HEADLESSreturn chrome_option
  • 功能
    • 创建ChromeOptions实例
    • 添加窗口最大化参数
    • 设置实验性选项
    • 控制无头模式状态
3.3 驱动实例化实现
@property
def browser(self):chrome = self._browser(service=Service(self._path),options=self.options)chrome.implicitly_wait(self.IMP_TIME)chrome.set_script_timeout(self.SCRIPT_TIME_OUT)chrome.set_page_load_timeout(self.PAGE_LOAD_TIME)return chrome
  • 实现细节
    • 使用Service类管理驱动路径(Selenium 4+特性)
    • 应用配置好的浏览器选项
    • 设置隐式/显式等待参数
    • 返回实例化后的浏览器对象

类关系图示

«Abstract»
BROWSER
+ CHROME_DRIVER_PATH
+ EDGE_DRIVER_PATH
+ WINDOWS_SIZE
+ IMP_TIME
+ PAGE_LOAD_TIME
+ SCRIPT_TIME_OUT
+ HEADLESS
- _path
- _browser
- _option
+__init__()
+option()
+browser()
CHROME
+ IMP_TIME = 30
+ PAGE_LOAD_TIME = 30
+ SCRIPT_TIME_OUT = 30
+ HEADLESS = False
+ START_MAX
+ EXP
+WINDOWS_SIZE =(1920, 900)
+options()
+browser()

关键设计模式

1. 工厂方法模式

  • 封装浏览器对象的创建过程
  • 统一不同浏览器的实例化接口

2. 模板方法模式

  • 基类定义算法框架
  • 子类实现具体步骤

3. 策略模式

  • 通过配置切换浏览器类型
  • 运行时动态选择实现

代码特点总结

  1. 类型安全

    • 参数类型注解
    • 运行时动态校验
    • 严格继承关系控制
  2. 配置集中化

    • 路径统一管理
    • 参数分类存储
    • 常量与实现分离
  3. 扩展性设计

    • 通过继承支持新浏览器
    • 预留标准扩展接口
    • 支持参数动态覆盖
  4. 防御式编程

    • 参数合法性校验
    • 异常精准捕获
    • 错误快速失败

使用示例

with CHROME().browser as _chrome:_chrome.get('http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx')from time import sleepsleep(3)

全部代码

"""
Python :3.13.3
Selenium: 4.31.0
"""from selenium.webdriver import *
from selenium.webdriver.chrome.service import Service
from typing import Type, Unionclass BrowserTypeError(Exception):def __init__(self, _type):self._type = _typedef __str__(self):return f"Browser type {self._type} is not supported"class BROWSER:CHROME_DRIVER_PATH = 'drivers/chrome_driver.exe'EDGE_DRIVER_PATH = '../drivers/edge_driver.exe'FIREFOX_DRIVER_PATH = '../drivers/gecko_driver.exe'IE_DRIVER_PATH = '../drivers/IEDriverServer.exe'WINDOWS_SIZE = (1024, 768)IMP_TIME = 30PAGE_LOAD_TIME = 20SCRIPT_TIME_OUT = 20HEADLESS = Truedef __init__(self,browser_type: Type[Union[Chrome, Firefox, Ie, Edge]] = Chrome,option_type: Type[Union[ChromeOptions, FirefoxOptions, IeOptions, EdgeOptions]] = ChromeOptions,driver_path: str = CHROME_DRIVER_PATH):# 类型校验if not issubclass(browser_type, (Chrome, Firefox, Ie, Edge)):raise BrowserTypeError(browser_type)if not issubclass(option_type, (ChromeOptions, FirefoxOptions, IeOptions, EdgeOptions)):raise BrowserTypeError(option_type)if not isinstance(driver_path, str):raise TypeError# 实例参数存储self._path = driver_pathself._browser = browser_typeself._option = option_type@propertydef option(self):"""浏览器特定的操作,在子类中实现:return:"""return@propertydef browser(self):"""启动浏览器,返回浏览器实例:return:"""returnclass CHROME(BROWSER):IMP_TIME = 30PAGE_LOAD_TIME = 30SCRIPT_TIME_OUT = 30WINDOWS_SIZE = (1920, 900)HEADLESS = FalseSTART_MAX = '--start-maximized'EXP = {'excludeSwitches': ['enable-automation'],#'mobileEmulation': {'deviceName': 'iPhone 6'}}@propertydef options(self):chrome_option = self._option()chrome_option.add_argument(self.START_MAX)for k, v in self.EXP.items():chrome_option.add_experimental_option(k, v)chrome_option.headless = self.HEADLESSreturn chrome_option@propertydef browser(self):# 使用 Service 传递驱动路径chrome = self._browser(service=Service(self._path),options=self.options)chrome.implicitly_wait(self.IMP_TIME)chrome.set_script_timeout(self.SCRIPT_TIME_OUT)chrome.set_page_load_timeout(self.PAGE_LOAD_TIME)# chrome.set_window_size(*self.WINDOWS_SIZE)return chromewith CHROME().browser as _chrome:_chrome.get('http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx')from time import sleepsleep(3)

“优秀的基类设计是自动化测试框架成功的基石” —— 《Selenium高级编程》


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

相关文章:

  • 6.1.多级缓存架构
  • 【Axure高保真原型】动态折线图
  • MongoDB Ubuntu 安装
  • 智能文档解析系统架构师角色定义
  • 智驭未来:NVIDIA自动驾驶安全白皮书与实验室创新实践深度解析
  • Axure按钮设计分享:打造高效交互体验的六大按钮类型
  • Anomize: Better Open Vocabulary Video Anomaly Detection
  • 3.第三章:数据治理的战略价值
  • 初识Redis · 持久化
  • 配置 Nginx 的 HTTPS
  • 分布式理论和事务
  • Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)
  • 从Nacos derby RCE学习derby数据库的利用
  • 【Linux】冯诺依曼体系结构及操作系统架构图的具体剖析
  • Redisson Watchdog实现原理与源码解析:分布式锁的自动续期机制
  • 蚊子的搜索距离可达60公里:对一些特殊气味有所偏爱
  • vue3 el-table 右击
  • 深入理解 java synchronized 关键字
  • 用高斯溅射技术跨越机器人模拟与现实的鸿沟:SplatSim 框架解析
  • 本文通俗简介-优雅草星云物联网AI智控系统软件介绍-星云智控是做什么用途的??-优雅草卓伊凡
  • 大家聊中国式现代化|彭羽:为国家试制度探新路,推进高水平对外开放
  • 著名水声学家陆佶人逝世,曾参加我国第一代核潜艇主动声纳研制
  • 教皇方济各逝世,外交部:表示哀悼,愿同梵方共同推动中梵关系持续改善
  • 2025年度“沪惠保”今日开售:保费维持129元/人,进一步扩增国内外特药种类
  • 商务部:支持外籍医生开设诊所,优化罕见病药品进口抽检模式
  • “代课老师被男友杀害案”一审开庭,将择期宣判