feat(e2e-tests): 添加端到端测试框架及测试用例
refactor(components): 调整头部和页脚布局样式 style(hero-section): 更新徽章动画效果 docs: 添加测试框架README文档 test: 实现首页、导航和联系表单的测试用例 ci: 添加CI测试脚本和配置
This commit is contained in:
@@ -0,0 +1,262 @@
|
||||
"""
|
||||
联系表单测试模块
|
||||
测试联系表单的各项功能和验证
|
||||
"""
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user