You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:54:18