from framework.core.base_ui import BaseUI from framework.config.settings import Config from framework.core.logger import get_logger import time logger = get_logger("LoginPage") class LoginPage(BaseUI): # --- 元素定位器 --- USERNAME_INPUT = "input[placeholder*='账号'], #account" PASSWORD_INPUT = "input[placeholder*='密码'], #password" LOGIN_BUTTON = "button.loginBtn" SUCCESS_INDICATOR = ".ant-layout-sider, .user-name" def __init__(self, headless=False): super().__init__(headless=headless) def login(self, username, password): """执行登录流程""" # 直接使用 Config.LOGIN_URL login_url = Config.LOGIN_URL self.navigate(login_url) logger.info("等待登录页面加载...") self.wait_for_selector(self.USERNAME_INPUT) self.fill(self.USERNAME_INPUT, username) self.fill(self.PASSWORD_INPUT, password) logger.info("正在点击登录按钮...") time.sleep(1) self.click(self.LOGIN_BUTTON) logger.info("登录请求已发送,等待进入系统...") try: # 1. 强制等待关键 UI 元素出现 (证明已经跳过 SSO 到了主页) self.page.wait_for_selector(self.SUCCESS_INDICATOR, timeout=10000) # 2. 二次确认 URL 是否已经离开 SSO,回到业务主域名 if "robogo-fat" in self.page.url: logger.info(f"🎉 登录流程圆满成功!进入主系统 URL: {self.page.url}") return True except Exception as e: logger.warning(f"等待主站 UI 加载超时 (可能是 SSO 跳转慢): {e}") # 兜底:如果还是在 login 或 sso 页面则失败 if "/login" in self.page.url or "sso" in self.page.url: self.page.screenshot(path="login_failed.png") logger.error(f"❌ 登录认证失败,目前停留在: {self.page.url}") return False return True