Files
novalon-website/e2e-tests/tests/test_contact_form.py
T
张翔 f14002559e feat(e2e-tests): 添加端到端测试框架及测试用例
refactor(components): 调整头部和页脚布局样式
style(hero-section): 更新徽章动画效果

docs: 添加测试框架README文档
test: 实现首页、导航和联系表单的测试用例
ci: 添加CI测试脚本和配置
2026-02-02 19:36:33 +08:00

263 lines
8.6 KiB
Python

"""
联系表单测试模块
测试联系表单的各项功能和验证
"""
import pytest
from typing import Dict, Any
from pages.contact_page import ContactPage
class TestContactForm:
"""联系表单测试类"""
@pytest.mark.smoke
@pytest.mark.form
def test_contact_page_loads(self, contact_page: ContactPage):
"""测试联系页面加载"""
contact_page.navigate()
contact_page.verify_page_loaded()
@pytest.mark.smoke
def test_contact_page_title(self, contact_page: ContactPage):
"""测试联系页面标题"""
contact_page.navigate()
contact_page.assert_title_contains("四川睿新致远")
@pytest.mark.regression
@pytest.mark.form
def test_contact_page_structure(self, contact_page: ContactPage):
"""测试联系页面结构"""
contact_page.navigate()
contact_page.verify_page_structure()
@pytest.mark.regression
def test_contact_page_company_info(self, contact_page: ContactPage):
"""测试公司信息显示"""
contact_page.navigate()
contact_page.verify_company_info()
@pytest.mark.regression
def test_contact_page_form_fields(self, contact_page: ContactPage):
"""测试表单字段"""
contact_page.navigate()
contact_page.verify_form_fields()
@pytest.mark.form
def test_form_validation_required_fields(self, contact_page: ContactPage):
"""测试必填字段验证"""
contact_page.navigate()
contact_page.verify_form_validation()
@pytest.mark.form
def test_form_submission_success(self, contact_page: ContactPage, test_data_generator):
"""测试表单提交成功"""
contact_page.navigate()
# 生成测试数据
data = test_data_generator.generate_contact_form_data(use_valid=True)
# 填写并提交表单
contact_page.fill_contact_form(data)
contact_page.submit_form()
# 验证成功
contact_page.verify_form_submission_success()
@pytest.mark.form
def test_form_submission_with_minimal_data(self, contact_page: ContactPage):
"""测试表单提交(最小数据)"""
contact_page.navigate()
# 最小数据
data = {
"name": "测试用户",
"email": "test@example.com",
"subject": "测试主题",
"message": "这是一条测试消息。"
}
# 填写并提交表单
contact_page.fill_contact_form(data)
contact_page.submit_form()
# 验证成功
contact_page.verify_form_submission_success()
@pytest.mark.form
def test_form_with_empty_name(self, contact_page: ContactPage):
"""测试姓名为空的表单验证"""
contact_page.navigate()
data = {
"name": "",
"email": "test@example.com",
"subject": "测试主题",
"message": "这是一条测试消息。"
}
contact_page.fill_contact_form(data)
# 点击提交按钮
contact_page._click("form_submit_button")
# 应该显示验证错误
try:
contact_page.assert_element_visible("form_name_input:invalid", timeout=2000)
except Exception:
# 可能通过后端验证
pass
@pytest.mark.form
def test_form_with_invalid_email(self, contact_page: ContactPage):
"""测试无效邮箱验证"""
contact_page.navigate()
data = {
"name": "测试用户",
"email": "invalid-email",
"subject": "测试主题",
"message": "这是一条测试消息。"
}
contact_page.fill_contact_form(data)
# 检查邮箱字段
email_input = contact_page._find("form_email_input")
validity = email_input.evaluate("""
el => ({
valid: el.validity.valid,
typeMismatch: el.validity.typeMismatch
})
""")
# 验证邮箱格式
assert not validity["valid"] or validity["typeMismatch"], \
"无效邮箱应该被标记为无效"
@pytest.mark.form
def test_form_submission_performance(self, contact_page: ContactPage, test_data_generator):
"""测试表单提交性能"""
contact_page.navigate()
data = test_data_generator.generate_contact_form_data(use_valid=True)
result = contact_page.test_form_submission_performance(data, max_duration=5.0)
assert result["passed"], f"表单提交耗时 {result['duration']:.2f}s 超过5秒阈值"
@pytest.mark.responsive
def test_contact_page_mobile_layout(self, contact_page: ContactPage):
"""测试联系页面移动端布局"""
contact_page.verify_responsive_layout(375)
@pytest.mark.responsive
def test_contact_page_tablet_layout(self, contact_page: ContactPage):
"""测试联系页面平板端布局"""
contact_page.verify_responsive_layout(768)
@pytest.mark.responsive
def test_contact_page_desktop_layout(self, contact_page: ContactPage):
"""测试联系页面桌面端布局"""
contact_page.verify_responsive_layout(1920)
@pytest.mark.interactive
def test_extract_contact_details(self, contact_page: ContactPage):
"""测试提取联系详情"""
contact_page.navigate()
details = contact_page.extract_contact_details()
assert "phone" in details or "email" in details or "address" in details
@pytest.mark.interactive
def test_get_working_hours(self, contact_page: ContactPage):
"""测试获取工作时间"""
contact_page.navigate()
hours = contact_page.get_working_hours()
assert isinstance(hours, dict)
@pytest.mark.regression
def test_form_reset_after_submission(self, contact_page: ContactPage, test_data_generator):
"""测试提交后表单重置"""
contact_page.navigate()
data = test_data_generator.generate_contact_form_data(use_valid=True)
# 第一次提交
contact_page.fill_contact_form(data)
contact_page.submit_form()
contact_page.verify_form_submission_success()
# 刷新页面后表单应该重置
contact_page.reload()
contact_page.assert_element_visible("contact_form", timeout=5000)
@pytest.mark.form
@pytest.mark.performance
def test_form_typing_performance(self, contact_page: ContactPage, test_data_generator):
"""测试表单输入性能"""
import time
contact_page.navigate()
data = test_data_generator.generate_contact_form_data(use_valid=True)
# 测量填充时间
start_time = time.time()
contact_page.fill_contact_form(data)
end_time = time.time()
fill_time = (end_time - start_time) * 1000
# 填充时间应该在5秒内
assert fill_time < 5000, f"表单填充时间 {fill_time:.2f}ms 超过5秒阈值"
@pytest.mark.regression
def test_form_with_special_characters(self, contact_page: ContactPage):
"""测试包含特殊字符的表单提交"""
contact_page.navigate()
data = {
"name": "测试用户-Name",
"email": "test+special@example.com",
"subject": "特殊字符测试: @#$%",
"message": "这是一条包含特殊字符的消息!测试...end"
}
contact_page.fill_contact_form(data)
contact_page.submit_form()
# 验证成功
try:
contact_page.verify_form_submission_success()
except Exception:
# 可能需要等待
contact_page.page.wait_for_timeout(2000)
@pytest.mark.regression
def test_form_with_long_content(self, contact_page: ContactPage):
"""测试长内容表单提交"""
contact_page.navigate()
# 生成长内容
long_message = "这是一条很长的消息。" * 50
data = {
"name": "长内容测试用户",
"email": "longtest@example.com",
"subject": "长内容测试主题" * 10,
"message": long_message
}
contact_page.fill_contact_form(data)
contact_page.submit_form()
# 验证成功
try:
contact_page.verify_form_submission_success()
except Exception:
contact_page.page.wait_for_timeout(2000)