from pathlib import Path import sys import allure import pytest from playwright.sync_api import expect PROJECT_ROOT = Path(__file__).resolve().parents[1] if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from config.settings import settings from utils.logger import get_logger logger = get_logger(__name__) @allure.feature("登录登出") @allure.story("邮箱验证码登录") @allure.title("校验用户登录成功后可退出登录") def test_login_success_then_logout_wait_3s_and_close_browser(page, ensure_guest_user): logger.info("使用 pytest-playwright 统一无头浏览器配置") logger.info("打开链接地址: %s", settings.base_url) page.goto(settings.base_url, wait_until="domcontentloaded") ensure_guest_user() logger.info("点击登录入口打开登录弹窗") page.locator("aside button").first.click() logger.info("动态获取登录弹窗输入框并输入邮箱: %s", settings.login_email) login_inputs = page.locator('input[type="text"]') expect(login_inputs.first).to_be_visible(timeout=settings.default_timeout) login_inputs.nth(0).fill(settings.login_email) logger.info("输入验证码") login_inputs.nth(1).fill(settings.verification_code) logger.info("动态勾选登录确认项") confirmation_items = page.locator("div.inline-flex.cursor-pointer") expect(confirmation_items.nth(0)).to_be_visible(timeout=settings.default_timeout) expect(confirmation_items.nth(1)).to_be_visible(timeout=settings.default_timeout) confirmation_items.nth(0).click() confirmation_items.nth(1).click() logger.info("提交登录") submit_button = page.locator("button").last expect(submit_button).to_be_enabled(timeout=settings.default_timeout) submit_button.click() logger.info("等待登录成功后出现退出按钮") logout_button = page.locator("aside button").first expect(logout_button).to_be_visible(timeout=settings.default_timeout) logger.info("登录成功,停留 2 秒") page.wait_for_timeout(2_000) logger.info("点击 Logout 退出登录") logout_button.click() logger.info("校验退出登录成功后重新出现登录入口") expect(page.locator("aside button").first).to_be_visible(timeout=settings.default_timeout) logger.info("退出登录成功,停留 3 秒") page.wait_for_timeout(3_000) if __name__ == "__main__": raise SystemExit(pytest.main([str(Path(__file__))]))