Selenium+Python页面对象模型:Web元素抽象及批量元素方法优化
最优实现方案
针对你遇到的Options表格元素管理冗余、代码过长的问题,可以通过结构化枚举+通用操作封装的方式解决,以下是具体落地方法:
1. 重构Enum:按功能分组,合并关联状态
将零散的ON/OFF定位器按选项名称分组,用数据类绑定关联状态,同时把同类型的单选按钮单独归类,大幅减少枚举条目数量:
from enum import Enum from dataclasses import dataclass # 定义数据类,绑定单个选项的ON/OFF定位器 @dataclass class OptionToggle: on_locator: str off_locator: str class Option(Enum): # 开关类选项:绑定ON/OFF定位器 PAYMENT_TYPE = OptionToggle("yPaymentType", "nPaymentType") USE_POST_MESSAGE = OptionToggle("yPostMessage", "nPostMessage") ORDER_ABSTRACTION = OptionToggle("yuID", "nuID") # 单选按钮组:单独定义子枚举 PAYMENT_METHOD = Enum("PAYMENT_METHOD", { "CREDIT_CARD": "Credit_Card", "ECP": "ECP", "SAFETECH": "SAFETECH" })
2. 封装通用操作方法,避免重复代码
不要为每个选项单独写操作方法,而是编写通用切换/选择方法,通过枚举参数动态获取定位器并执行对应操作:
from selenium.webdriver.common.by import By class OptionsPage: def __init__(self, driver): self.driver = driver # 如果用XPATH/CSS定位,可定义模板统一管理 self.locator_template = "//input[@id='{}']" def _get_element(self, locator_value: str): """根据定位值获取元素(统一定位策略)""" return self.driver.find_element(By.XPATH, self.locator_template.format(locator_value)) def toggle_option(self, option: Option, target_state: str): """通用切换开关状态方法(支持复选框/单选按钮)""" target_state = target_state.upper() if target_state not in ["ON", "OFF"]: raise ValueError("仅支持ON/OFF状态切换") # 获取目标状态对应的定位器 locator = option.value.on_locator if target_state == "ON" else option.value.off_locator element = self._get_element(locator) # 根据元素类型执行对应操作 elem_type = element.get_attribute("type") if elem_type in ["checkbox", "radio"]: if not element.is_selected(): element.click() elif elem_type == "text": # 文本框类型的开关逻辑,根据实际需求调整 element.clear() element.send_keys("ENABLED" if target_state == "ON" else "DISABLED") def select_payment_method(self, method: Option.PAYMENT_METHOD): """通用选择支付类型方法""" element = self._get_element(method.value) if not element.is_selected(): element.click()
3. 可选:配置文件分离定位器(适合大量元素维护)
如果30个选项的定位器需要频繁调整,可以将定位器存入YAML/JSON配置文件,实现代码与配置分离:
# config.yaml options: PAYMENT_TYPE: on: yPaymentType off: nPaymentType USE_POST_MESSAGE: on: yPostMessage off: nPostMessage payment_methods: CREDIT_CARD: Credit_Card ECP: ECP
加载配置并生成枚举:
import yaml with open("config.yaml", "r") as f: config = yaml.safe_load(f) class Option(Enum): PAYMENT_TYPE = OptionToggle( config["options"]["PAYMENT_TYPE"]["on"], config["options"]["PAYMENT_TYPE"]["off"] ) PAYMENT_METHOD = Enum("PAYMENT_METHOD", config["payment_methods"])
内容的提问来源于stack exchange,提问作者Yaroslav Makovskiy
相关产品推荐
相关产品推荐

