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

如何做自己的公司网站高级网页设计师证书

如何做自己的公司网站,高级网页设计师证书,ui设计招聘,房屋装修流程步骤二、装饰器核心原理:函数式编程的“语法糖” 在 UI 自动化测试的实际场景中,页面加载超时、元素定位失败、网络波动等异常问题频繁出现。传统的try-except嵌套方式虽然能捕获异常,但会导致业务代码与处理逻辑高度耦合,造成代码冗…

二、装饰器核心原理:函数式编程的“语法糖”

在 UI 自动化测试的实际场景中,页面加载超时、元素定位失败、网络波动等异常问题频繁出现。传统的try-except嵌套方式虽然能捕获异常,但会导致业务代码与处理逻辑高度耦合,造成代码冗余、可读性差等问题。

装饰器作为 Python 的核心特性之一,能够以非侵入式的方式将异常处理逻辑从业务代码中剥离,实现代码解耦与复用。通过装饰器,我们可以将通用的异常处理逻辑封装为可复用的组件,让测试代码更简洁、易维护。

装饰器是Python中函数式编程的重要特性,本质是通过高阶函数实现代码增强,遵循以下核心原则:

  • 不修改原函数代码:通过嵌套函数包裹原逻辑
  • 透明性:调用者无需感知装饰逻辑
  • 复用性:一个装饰器可作用于多个函数

1. 两层装饰器(无参数版)

结构解析

def decorator(func):         # 第一层:接收被装饰函数def wrapper(*args, **kwargs):  # 第二层:包装函数(命名为wrapper)# 前置逻辑(如异常处理)result = func(*args, **kwargs)  # 执行原函数# 后置逻辑(如返回值处理)return resultreturn wrapper             # 返回包装函数

执行流程

@decorator                  # 等价于 func = decorator(func)
def original_func(): pass

2. 三层装饰器(带参数版)

结构解析

def decorator_with_param(param):  # 第一层:接收装饰器参数def decorator(func):         # 第二层:接收被装饰函数def wrapper(*args, **kwargs):  # 第三层:包装函数# 使用装饰器参数(param)和原函数参数(*args)result = func(*args, **kwargs)return resultreturn wrapperreturn decorator             # 返回第二层函数

执行流程

@decorator_with_param("参数值")  # 等价于 func = decorator_with_param("参数值")(func)
def original_func(): pass

关键区别对比

类型层数参数传递时机典型场景
无参数装饰器2层装饰器定义时统一日志记录
带参数装饰器3层装饰器调用时多场景配置(如重试次数)

二、装饰器在异常处理中的应用:替代try/catch的优雅方案

在UI自动化中,传统try/catch会导致测试用例臃肿,通过装饰器可将异常处理逻辑移至框架层,实现:

  • 关注点分离:测试用例仅关注业务逻辑
  • 集中管理:异常处理逻辑统一维护
  • 可配置性:通过参数动态调整处理策略

1. 基础异常处理装饰器(两层结构)

from selenium.common.exceptions import WebDriverException
import logginglogger = logging.getLogger("UI_Handler")def handle_ui_exception(func):def wrapper(*args, **kwargs):try:return func(*args, **kwargs)  # 执行原操作except WebDriverException as e:  # 捕获UI技术异常logger.error(f"UI操作失败:{str(e)}")raise  # 抛给上层处理或添加重试except Exception as e:logger.error(f"未知异常:{str(e)}")raisereturn wrapper

应用在Page Object层(示例:处理元素不存在异常)

from selenium import webdriver
from selenium.webdriver.common.by import Byclass LoginPage:def __init__(self, driver):self.driver = driver@handle_ui_exception  # 装饰器应用于操作方法def click_submit(self):# 可能抛出NoSuchElementExceptionself.driver.find_element(By.ID, "submit").click()

测试用例层无感知调用

def test_login(driver):login_page = LoginPage(driver)login_page.click_submit()  # 异常处理在中间层完成assert DashboardPage(driver).is_displayed()

2. 参数化异常处理装饰器(三层结构)

需求:不同场景下异常处理策略不同(如重试次数、是否截图)
示例:处理NoSuchElementException并应对业务空值

from selenium.common.exceptions import NoSuchElementException
from functools import wraps
import logging
import timelogger = logging.getLogger("UI_Handler")def handle_element_exceptions(retry_times=3, default_value="N/A"  # 业务空值默认返回值
):"""处理元素定位异常和业务空值的装饰器"""def decorator(func):@wraps(func)def wrapper(*args, **kwargs):self = args[0]  # 假设第一个参数是Page Object实例driver = self.driver# 技术异常处理:重试机制for attempt in range(retry_times + 1):try:result = func(*args, **kwargs)# 业务空值处理:文本为空时返回默认值if isinstance(result, str) and len(result.strip()) == 0:logger.warning("检测到业务空值,返回默认值")return default_valuereturn resultexcept NoSuchElementException as e:  # 捕获元素不存在异常if attempt < retry_times:logger.error(f"元素未找到(重试{attempt+1}/{retry_times}):{str(e)}")time.sleep(1)  # 重试间隔1秒else:logger.error(f"最终失败:{str(e)}")return default_value  # 超过重试次数返回默认值except Exception as e:logger.error(f"未知异常:{str(e)}")return default_valuereturn wrapperreturn decorator

Page Object层应用示例

class SearchPage:def __init__(self, driver):self.driver = driverself.driver.get("https://example.com")@handle_element_exceptions(retry_times=2, default_value="无搜索结果")def get_search_result_text(self):"""获取搜索结果文本,可能返回空字符串或抛出异常"""element = self.driver.find_element(By.CSS_SELECTOR, "#search-result")return element.text.strip()  # 可能返回空字符串(业务空值)

测试用例层逻辑

def test_search_functionality():driver = webdriver.Chrome()search_page = SearchPage(driver)result = search_page.get_search_result_text()assert result != "无搜索结果", "搜索功能异常"  # 直接断言有效值driver.quit()

三、避免测试用例冗余的核心原则

1. 三层架构设计

层级职责描述异常处理位置
测试用例层业务流程验证、断言无try/catch
中间层(Page Object)具体UI操作(元素定位、点击)装饰器应用层
框架底层通用工具(驱动管理、日志、截图)装饰器定义层

2. 装饰器的优势对比

传统try/catch装饰器方案
测试用例代码臃肿代码简洁,聚焦业务逻辑
异常处理逻辑分散集中管理,修改成本低
难以复用可复用至所有类似操作

四、多项目场景下的装饰器实践:策略模式与动态配置

当多个项目共用自动化框架时,通过策略模式实现差异化异常处理:

1. 定义项目级异常处理策略

# project_strategies.py
STRATEGY_A = {  # 电商项目:严格重试+默认空值"retry_times": 3,"default_value": "商品无库存"
}STRATEGY_B = {  # 后台项目:快速失败+截图"retry_times": 0,"default_value": "数据为空","screenshot_path": "/error_logs/"
}

2. 装饰器动态加载策略

def load_strategy(project_name):strategies = {"project_a": STRATEGY_A,"project_b": STRATEGY_B}return strategies.get(project_name, {})def ui_action_with_strategy(project_name):strategy = load_strategy(project_name)return handle_element_exceptions(**strategy)  # 解包策略参数

3. 项目级Page Object应用

# project_a/pages.py
class ProductPage:@ui_action_with_strategy("project_a")def check_stock(self):return self.driver.find_element(By.CSS_SELECTOR, ".stock").text# project_b/pages.py
class ReportPage:@ui_action_with_strategy("project_b")def get_report_data(self):return self.driver.find_element(By.ID, "data").text

五、总结:装饰器的核心价值

  1. 解耦业务逻辑与技术细节:测试用例仅关注“验证什么”,框架层处理“如何处理异常”
  2. 提升可维护性:异常处理逻辑集中在装饰器中,修改时无需触及测试用例
  3. 支持复杂场景:通过参数化和策略模式,轻松应对多项目、多场景需求

最佳实践建议

  • 装饰器命名遵循 handle_xxxxxx_strategy 规范
  • functools.wraps 保留原函数元信息
  • 在框架底层统一管理装饰器,避免重复定义

通过装饰器模式,UI自动化测试代码将更简洁、更健壮,真正实现“一次编写,多处复用”的工程化目标。


文章转载自:

http://DWsdHPE2.srbfp.cn
http://A3v03MAC.srbfp.cn
http://rEHmL2Mn.srbfp.cn
http://IzmHCy31.srbfp.cn
http://Rg5jWXrH.srbfp.cn
http://fQ5cPJT3.srbfp.cn
http://GC1u3vWu.srbfp.cn
http://4muAFHSI.srbfp.cn
http://uxGiAAHu.srbfp.cn
http://AwkmLX58.srbfp.cn
http://loJMkrd3.srbfp.cn
http://J5FUlQkW.srbfp.cn
http://hXJEPq3S.srbfp.cn
http://SrrbLTUV.srbfp.cn
http://mdXZXVjc.srbfp.cn
http://6l9wj6bN.srbfp.cn
http://R2hxmuy6.srbfp.cn
http://rcgRLnoq.srbfp.cn
http://W2nQ2RQL.srbfp.cn
http://mVu43I7n.srbfp.cn
http://JxBaw4wa.srbfp.cn
http://Pu7AWLsO.srbfp.cn
http://cnLsAe0r.srbfp.cn
http://qxMnRjo7.srbfp.cn
http://g7pWIb7u.srbfp.cn
http://VIUrlKP2.srbfp.cn
http://YUDqJSvO.srbfp.cn
http://MZbtbNvV.srbfp.cn
http://aooIF55C.srbfp.cn
http://tqBkmGVK.srbfp.cn
http://www.dtcms.com/wzjs/639794.html

相关文章:

  • 政工网站建设方案软件平台是什么意思
  • 京东企业的电子网站建设网站运维
  • 宣传部网站建设策划书模板下载失败
  • 海南免费做网站云梦模板网站优缺点
  • 服饰东莞网站建设深圳网站设计成功刻
  • 织梦网站建设实验报告网红自助下单网站
  • 高端网站建设赣州白银建设工程网站
  • 什么叫网站维护建设网站第一步
  • jeecg 3.7 网站开发wordpress移动导航
  • 亚运村网站建设化妆网站模板下载免费
  • ftp免费网站空间wordpress 显示文章标题
  • 网站移动端开发公司wordpress自定义段
  • 从0建设一个网站网站建设策划优点
  • 哪个网站网页做的好看如何建立免费网站
  • 无水印视频素材下载免费网站棋牌网站建设多少钱
  • 阿里云建网站教程电商平台怎么加入
  • 百度站长网站文件验证允许发外链的网站
  • 青岛品牌网站建设价格cms+wordpress+国内
  • 想找做海报的超清图片去哪个网站找app开发费用一般多少钱
  • 手机app制作网站北京 顺义 网站制作
  • 四级a做爰片免费网站h5 技术做健康类网站
  • 上海网站建设高端自己做网站发信息
  • 网站设计自学平价网站平价网站建设建设
  • 网站内容收录怎么给网站做关键词
  • 洛阳住房和城乡建设部网站曹鹏wordpress建站seo视频
  • 商务网站开发的基本原则张家界网站定制
  • 网站空间3个g多少钱网站平台建设工作总结
  • 常州网站开发培训书店网站建设方案
  • 嘉兴市海盐建设局网站云南SEO网站建设
  • 怎么做购物型网站专业设计网站