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

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

210 lines
7.0 KiB
Python

"""
导航测试模块
测试网站导航功能
"""
import pytest
from typing import Dict, Any
from pages.home_page import HomePage
class TestNavigation:
"""导航测试类"""
@pytest.mark.navigation
@pytest.mark.smoke
def test_navigate_to_home(self, home_page: HomePage):
"""测试导航到首页"""
home_page.navigate()
home_page.assert_url_equals(home_page._get_full_url("/"))
@pytest.mark.navigation
@pytest.mark.smoke
def test_navigate_to_contact_page(self, home_page: HomePage, contact_page):
"""测试导航到联系页面"""
contact_page.navigate()
contact_page.assert_url_equals(
home_page._get_full_url("/contact")
)
@pytest.mark.navigation
@pytest.mark.interactive
def test_click_navigation_to_about(self, home_page: HomePage):
"""测试点击导航到关于区域"""
home_page.navigate()
home_page.click_navigation_link("about")
home_page.assert_element_visible("#about", timeout=5000)
@pytest.mark.navigation
@pytest.mark.interactive
def test_click_navigation_to_services(self, home_page: HomePage):
"""测试点击导航到服务区域"""
home_page.navigate()
home_page.click_navigation_link("services")
home_page.assert_element_visible("#services", timeout=5000)
@pytest.mark.navigation
@pytest.mark.interactive
def test_click_navigation_to_products(self, home_page: HomePage):
"""测试点击导航到产品区域"""
home_page.navigate()
home_page.click_navigation_link("products")
home_page.assert_element_visible("#products", timeout=5000)
@pytest.mark.navigation
@pytest.mark.interactive
def test_click_navigation_to_news(self, home_page: HomePage):
"""测试点击导航到新闻区域"""
home_page.navigate()
home_page.click_navigation_link("news")
home_page.assert_element_visible("#news", timeout=5000)
@pytest.mark.navigation
@pytest.mark.interactive
def test_click_navigation_to_contact(self, home_page: HomePage):
"""测试点击导航到联系区域"""
home_page.navigate()
home_page.click_navigation_link("contact")
home_page.assert_element_visible("#contact", timeout=5000)
@pytest.mark.navigation
def test_smooth_scroll_to_section(self, home_page: HomePage):
"""测试平滑滚动到区域"""
home_page.navigate()
# 先滚动到页面底部
home_page.scroll_to_bottom()
# 然后滚动到顶部
home_page.scroll_to_top()
# 验证
home_page.assert_element_visible("header")
@pytest.mark.navigation
def test_scroll_to_each_section(self, home_page: HomePage):
"""测试滚动到每个区域"""
home_page.navigate()
sections = ["home", "about", "services", "products", "news", "contact"]
for section in sections:
home_page.scroll_to_section(section)
home_page.assert_element_visible(f"#{section}", timeout=5000)
@pytest.mark.navigation
def test_page_back(self, home_page: HomePage, contact_page):
"""测试返回上一页"""
# 先访问联系页面
contact_page.navigate()
contact_page.assert_url_equals(home_page._get_full_url("/contact"))
# 返回首页
home_page.go_back()
# 验证
home_page.assert_url_equals(home_page._get_full_url("/"))
@pytest.mark.navigation
def test_page_forward(self, home_page: HomePage, contact_page):
"""测试前进到下一页"""
# 访问首页
home_page.navigate()
# 后退(此时没有上一页,应该保持在首页)
home_page.go_back()
# 前进(此时没有下一页,应该保持在首页)
home_page.go_forward()
home_page.assert_url_equals(home_page._get_full_url("/"))
@pytest.mark.navigation
def test_page_reload(self, home_page: HomePage):
"""测试页面刷新"""
home_page.navigate()
home_page.reload()
home_page.verify_page_loaded()
@pytest.mark.navigation
def test_navigation_link_count(self, home_page: HomePage):
"""测试导航链接数量"""
home_page.navigate()
nav_links = home_page._find_all("nav a")
# 应该有6个导航链接
assert len(nav_links) >= 5, f"导航链接数量不足,当前{len(nav_links)}"
@pytest.mark.navigation
def test_navigation_link_text(self, home_page: HomePage):
"""测试导航链接文本"""
home_page.navigate()
expected_links = ["首页", "关于我们", "核心业务", "产品服务", "新闻动态", "联系我们"]
for link_text in expected_links:
link = home_page.page.locator(f"nav a:has-text('{link_text}')")
assert link.count() > 0, f"未找到导航链接: {link_text}"
@pytest.mark.navigation
@pytest.mark.responsive
def test_navigation_mobile(self, home_page: HomePage):
"""测试移动端导航"""
# 设置移动端视口
home_page.page.set_viewport_size({"width": 375, "height": 667})
home_page.navigate()
# 移动端应该显示汉堡菜单
menu_button = home_page.page.locator("button:has-text('菜单'), .mobile-menu")
if menu_button.count() > 0:
home_page.logger.info("移动端显示汉堡菜单")
else:
home_page.logger.info("移动端导航可能已内联显示")
@pytest.mark.navigation
def test_url_hash_navigation(self, home_page: HomePage):
"""测试URL哈希导航"""
home_page.navigate()
# 直接访问带哈希的URL
home_page.navigate(path="/#about")
home_page.wait_for_load()
# 验证滚动到指定区域
home_page.assert_element_visible("#about", timeout=5000)
@pytest.mark.navigation
def test_browser_back_button(self, home_page: HomePage, contact_page):
"""测试浏览器后退按钮"""
# 访问首页
home_page.navigate()
# 访问联系页面
contact_page.navigate()
# 使用浏览器后退
home_page.page.go_back()
# 验证返回首页
home_page.assert_url_equals(home_page._get_full_url("/"))
@pytest.mark.interactive
def test_cta_button_navigation(self, home_page: HomePage):
"""测试CTA按钮导航"""
home_page.navigate()
# 查找CTA按钮(如果有)
cta_button = home_page.page.locator(
"a[href*='contact'], a.cta, a.button:has-text('联系')"
)
if cta_button.count() > 0:
cta_button.first.click()
home_page.wait_for_load()
# 应该导航到联系区域
home_page.assert_element_visible("#contact", timeout=5000)