""" 导航测试模块 测试网站导航功能 """ 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, section:has(h2:has-text('关于'))", 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, section:has(h2:has-text('业务')), section:has(h2:has-text('服务'))", 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, section:has(h2:has-text('产品'))", 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, section:has(h2:has-text('新闻')), section:has(h2:has-text('动态'))", 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, section:has(h2:has-text('联系')), section:has(h2:has-text('联系方式'))", 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"] section_selectors = { "home": "#home, section:first-of-type", "about": "#about, section:has(h2:has-text('关于'))", "services": "#services, section:has(h2:has-text('业务')), section:has(h2:has-text('服务'))", "products": "#products, section:has(h2:has-text('产品'))", "news": "#news, section:has(h2:has-text('新闻')), section:has(h2:has-text('动态'))", "contact": "#contact, section:has(h2:has-text('联系')), section:has(h2:has-text('联系方式'))" } for section in sections: home_page.scroll_to_section(section) selector = section_selectors.get(section, f"#{section}") try: home_page.assert_element_visible(selector, timeout=5000) except Exception: home_page.logger.warning(f"区域 {section} 未找到,跳过验证") @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("header", 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('联系'), a:has-text('立即咨询')" ) if cta_button.count() > 0: cta_button.first.click() home_page.wait_for_load() # 应该导航到联系页面或包含contact的URL current_url = home_page.page.url # 如果URL包含contact或页面有表单,则测试通过 if "contact" in current_url: home_page.logger.info("✅ CTA按钮导航到联系页面") else: # 检查页面是否有联系表单 form = home_page.page.locator("form") if form.count() > 0: home_page.logger.info("✅ CTA按钮导航到包含表单的页面") else: home_page.logger.warning(f"CTA按钮导航到: {current_url}") else: home_page.logger.warning("未找到CTA按钮,跳过测试")