如何在Selenium+C#中为单个登录页编写多函数测试用例
如何用函数编写登录页面的测试脚本
核心思路很简单:把通用的登录逻辑封装成可复用函数,然后针对每条测试用例,传入不同的参数调用这个函数,再验证结果即可。这样既能减少重复代码,也能让测试用例的逻辑更清晰。
我以 Python + Selenium 为例(换成 Cypress、Playwright 等框架思路完全一致),给你拆解具体步骤:
第一步:封装通用登录函数
先写一个只负责完成登录操作的函数,它接受用户名、密码作为输入,执行输入、提交动作后,返回登录的结果(比如是否成功、错误提示内容)。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def login(driver, username, password): # 等待并定位用户名输入框,清空后输入内容 username_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "username")) ) username_input.clear() username_input.send_keys(username) # 同理处理密码输入框 password_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "password")) ) password_input.clear() password_input.send_keys(password) # 点击登录按钮 login_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "login-btn")) ) login_btn.click() # 判断登录结果(这里假设成功跳转到dashboard,失败显示错误提示) try: # 等待仪表盘元素出现,说明登录成功 WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.ID, "dashboard")) ) return {"success": True, "message": "登录成功"} except: # 获取错误提示文本 error_msg = driver.find_element(By.ID, "error-message").text return {"success": False, "message": error_msg}
第二步:编写测试用例
根据你的10条测试用例,有两种写法可选:
方式1:独立测试函数(直观易懂,适合新手)
每条测试用例对应一个函数,逻辑清晰,方便单独调试:
def test_valid_login(): driver = webdriver.Chrome() driver.get("https://your-login-page-url.com") result = login(driver, "valid_user", "valid_pass123") assert result["success"] == True, f"预期登录成功,实际结果:{result['message']}" driver.quit() def test_empty_username(): driver = webdriver.Chrome() driver.get("https://your-login-page-url.com") result = login(driver, "", "valid_pass123") assert result["success"] == False, "预期登录失败,实际成功了" assert "用户名不能为空" in result["message"], f"错误提示不符合预期:{result['message']}" driver.quit() def test_wrong_password(): driver = webdriver.Chrome() driver.get("https://your-login-page-url.com") result = login(driver, "valid_user", "wrong_pass") assert result["success"] == False, "预期登录失败,实际成功了" assert "密码错误" in result["message"], f"错误提示不符合预期:{result['message']}" driver.quit() # 剩下的7条测试用例可以照这个模式扩展,比如: # - 空密码测试 # - 不存在的用户名测试 # - 密码长度不足测试 # - 含特殊字符的用户名/密码测试 # - 大小写敏感的用户名测试 # - 登录后退出再登录测试 # - 记住密码功能测试
方式2:参数化测试(简洁高效,减少重复代码)
用 pytest 的参数化装饰器,把所有测试用例的参数和预期结果整理成列表,一次性执行所有测试:
import pytest @pytest.mark.parametrize("username, password, expected_success, expected_msg", [ ("valid_user", "valid_pass123", True, "登录成功"), ("", "valid_pass123", False, "用户名不能为空"), ("valid_user", "", False, "密码不能为空"), ("valid_user", "wrong_pass", False, "密码错误"), ("non_exist_user", "any_pass", False, "用户名不存在"), ("short", "valid_pass123", False, "用户名长度不能少于6位"), # 继续添加剩下的4条测试用例... ]) def test_login_cases(username, password, expected_success, expected_msg): driver = webdriver.Chrome() driver.get("https://your-login-page-url.com") result = login(driver, username, password) assert result["success"] == expected_success, f"测试用例失败:{username}/{password}" assert expected_msg in result["message"], f"错误提示不符:{result['message']}" driver.quit()
几个关键注意点
- 单一职责:登录函数只做登录操作,测试函数只负责验证结果,不要把逻辑混在一起。
- 可复用性:这个登录函数后续可以在所有需要登录的测试场景中调用(比如测试个人中心、订单页面),不用重复写登录代码。
- 断言明确:每个测试用例都要有清晰的断言,确保预期结果和实际结果一致。
- 资源清理:每次测试后记得关闭浏览器(或者用 fixture 自动管理),避免资源浪费。
如果你的测试用例涉及验证码、多因素认证等复杂场景,只需要在登录函数里添加对应的逻辑即可,测试用例还是一样调用这个函数传参。
内容的提问来源于stack exchange,提问作者Sumit Garg
相关产品推荐
相关产品推荐

