如何优化Python Selenium表单测试代码,避免新增字段重复编码?
问题解决:Selenium表单自动化测试的可扩展优化
核心痛点
当前测试代码中,新增表单字段(如Name)时,需要重复编写输入逻辑和错误检查逻辑,导致代码冗余、维护成本高。希望通过配置化方式实现字段的批量处理,避免重复代码。
解决方案:配置化字段管理
通过定义字段配置列表,将每个字段的Excel列名、页面元素定位信息、对应的错误规则统一管理,然后通过循环完成输入和错误检查,新增字段仅需添加配置项即可。
优化后的完整代码
import datetime import time import pandas as pd from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By ProjectName = 'Automated UAT' # Excel路径与数据转换规则 ExcelPath = 'Excel Path' ExcelConverters = {'IC': str, 'Postcode': str, 'VehRegNum': str, 'Name': str} # 新增字段直接加在这里 # Web表单地址 url = 'url' # ChromeDriver路径 DriverPath = 'Driver Path' driver = webdriver.Chrome(executable_path=DriverPath) # -------------------------- # 字段配置:新增字段仅需添加此列表的项 # 格式:(Excel列名, 页面元素ID, 错误信息列表) field_configs = [ ('IC', 'icno', [ ('IC number is mandatory', 'e1'), ('Invalid IC format', 'e2') ]), ('Postcode', 'postcode', [ ('Postcode number is mandatory', 'e3') ]), ('VehRegNum', 'registerno', [ ('Vehicle Registration Number is mandatory', 'e4') ]), # 新增Name字段示例 ('Name', 'name', [ ('Name is mandatory', 'e5'), ('Invalid Name format', 'e6') ]) ] # -------------------------- # 初始化结果DataFrame,自动生成列名 result_columns = [err_code for _, _, errs in field_configs for _, err_code in errs] result_df = pd.DataFrame(columns=result_columns) try: # 读取Excel测试数据 df = pd.read_excel(ExcelPath, header=0, converters=ExcelConverters) df = df.replace(pd.NA, '', regex=True) maxrow = df.shape[0] # 循环处理每一行测试数据 for i in range(maxrow): print(f"处理第 {i+1} 行数据") driver.get(url) driver.maximize_window() entry = df.loc[i] # 1. 批量输入表单字段 for col_name, elem_id, _ in field_configs: input_elem = driver.find_element(By.ID, elem_id) input_elem.send_keys(entry[col_name]) time.sleep(1) # 2. 提交表单 button = driver.find_element(By.NAME, 'btnGenQuote') button.click() time.sleep(5) # 3. 批量检查错误信息 current_result = {} for _, _, err_list in field_configs: for err_msg, err_code in err_list: try: driver.find_element(By.XPATH, f"//*[contains(text(), '{err_msg}')]") current_result[err_code] = 'T' print(f"找到错误:{err_msg}") except NoSuchElementException: current_result[err_code] = 'F' print(f"未找到错误:{err_msg}") # 4. 记录测试结果 new_result = pd.DataFrame([current_result]) result_df = pd.concat([result_df, new_result], ignore_index=True) print(result_df) # 5. 保存截图 driver.get_screenshot_as_file(f"{ProjectName}_row_{i+1}.png") time.sleep(2) except KeyError as e: print(f"错误:Excel列名与配置不匹配 - {e}") print("测试流程已完成") finally: # 保存结果到Excel result_df.to_excel('Result.xlsx', sheet_name='result', index=False) driver.quit()
关键优化点说明
- 配置化字段管理:
field_configs列表集中管理所有字段的信息,新增字段只需添加一个元组,无需修改业务逻辑代码;自动生成结果DataFrame的列名,避免手动维护e1,e2... - 消除重复代码:通过循环遍历配置列表,统一处理字段输入和错误检查,彻底消除重复的
find_element和send_keys代码 - 精简依赖与逻辑:移除冗余的
openpyxl依赖,直接用df.shape[0]获取Excel行数;结果记录改用字典生成DataFrame,更简洁易读
额外优化建议
- 替换time.sleep为显式等待:使用
WebDriverWait等待元素可见/可交互,提升测试稳定性和速度,示例:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待输入框可见后再输入 input_elem = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, elem_id)) ) - 函数化拆分代码:将字段输入、错误检查、结果记录拆分为独立函数,提升代码可读性和可维护性
- 使用Page Object模式:将页面元素和操作封装为类,进一步解耦业务逻辑和页面定位
- 日志代替print:使用
logging模块记录测试过程,便于问题排查 - 参数化配置:将Excel路径、Driver路径、URL等配置项移到单独的配置文件(如config.ini)中,避免硬编码
内容的提问来源于stack exchange,提问作者Taetoro
相关产品推荐
相关产品推荐

