Python代码拆分优化:Selenium项目中优雅隔离稳定代码块
解决Python Selenium脚本中代码隔离与多变量传递的问题
针对你遇到的B部分代码隔离、多变量传递的问题,这里有几个Pythonic的解决方案:
1. 使用数据类(dataclasses)封装返回值
数据类是Python 3.7+引入的特性,能简洁地定义用于存储数据的类,无需手动编写__init__等方法,既保留了面向对象的清晰结构,又不会增加额外复杂度。
from dataclasses import dataclass from selenium import webdriver # 定义存储B部分输出的data class @dataclass class AutomationBResult: username: str order_id: str shipping_address: str total_amount: float # 按需求添加所有需要传递给C的变量 def execute_part_b(driver: webdriver.Chrome) -> AutomationBResult: # 原B部分的500行稳定代码 # 执行各类Selenium操作,提取所需数据 username = driver.find_element("id", "username").text order_id = driver.find_element("css selector", ".order-id").text shipping_address = driver.find_element("name", "address").text total_amount = float(driver.find_element("class name", "total").text.strip("$")) # 返回封装好的结果对象 return AutomationBResult( username=username, order_id=order_id, shipping_address=shipping_address, total_amount=total_amount ) # 主流程示例 if __name__ == "__main__": driver = webdriver.Chrome() # 执行A部分代码 # ... # 调用隔离后的B部分 b_result = execute_part_b(driver) # 执行C部分代码,直接通过对象属性访问数据 print(f"处理订单 {b_result.order_id},用户 {b_result.username}") print(f"配送地址:{b_result.shipping_address},金额:{b_result.total_amount}") driver.quit()
这种方式的优势是:变量有明确的命名和类型标注,可读性强,后续维护时只需修改AutomationBResult的字段即可,比返回元组或无结构字典更可靠。
2. 用字典封装返回值(快速迭代方案)
如果不想定义类,字典是更轻量化的选择,适合快速验证或临时场景:
def execute_part_b(driver): # B部分代码执行 result = { "username": driver.find_element("id", "username").text, "order_id": driver.find_element("css selector", ".order-id").text, "shipping_address": driver.find_element("name", "address").text, "total_amount": float(driver.find_element("class name", "total").text.strip("$")) # 添加其他变量 } return result # 主流程中使用 b_result = execute_part_b(driver) print(f"订单ID:{b_result['order_id']}")
注意:字典的键名需要保持一致,避免拼写错误,长期维护建议还是用数据类。
3. 面向对象封装整个自动化流程
把A、B、C三部分作为类的方法,共享变量作为实例属性,彻底避免变量传递的问题:
from selenium import webdriver class OrderAutomation: def __init__(self): self.driver = webdriver.Chrome() # 初始化所有需要共享的变量 self.username = None self.order_id = None self.shipping_address = None self.total_amount = None def run_part_a(self): # 原A部分的100行代码,比如登录、导航到订单页 self.driver.get("https://example.com/login") # ...其他操作 def run_part_b(self): # 原B部分的500行稳定代码,提取数据到实例属性 self.username = self.driver.find_element("id", "username").text self.order_id = self.driver.find_element("css selector", ".order-id").text self.shipping_address = self.driver.find_element("name", "address").text self.total_amount = float(self.driver.find_element("class name", "total").text.strip("$")) def run_part_c(self): # 原C部分的100行代码,直接使用实例属性 print(f"开始处理订单:{self.order_id}") print(f"用户信息:{self.username},配送地址:{self.shipping_address}") # ...其他后续操作 def teardown(self): self.driver.quit() # 执行整个流程 if __name__ == "__main__": automation = OrderAutomation() try: automation.run_part_a() automation.run_part_b() automation.run_part_c() finally: automation.teardown()
这种方案把整个自动化逻辑封装成类,代码结构更清晰,B部分执行后直接把数据存在实例里,C部分直接取用,完全不需要传递变量,适合复杂的长期维护的自动化项目。
内容的提问来源于stack exchange,提问作者Ned Hulton
相关产品推荐
相关产品推荐

