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): # --- 元素定位器 --- # 根据截图:登录按钮 Class 是 loginBtn 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): """执行登录流程""" # 1. 访问登录页 login_url = f"{Config.BASE_URL}/login" self.navigate(login_url) # 2. 等待输入框可见 logger.info("等待登录页面加载...") self.wait_for_selector(self.USERNAME_INPUT) # 3. 输入账号密码 self.fill(self.USERNAME_INPUT, username) self.fill(self.PASSWORD_INPUT, password) # 4. 点击登录 logger.info("正在点击登录按钮...") time.sleep(1) # 增加稳定性 self.click(self.LOGIN_BUTTON) # 5. 增强型事件监听 (实时监控所有 URL 变化,防止错过极速重定向) logger.info("正在实时监控重定向链路...") success_flag = {"done": False} def _check_url(frame): url = frame.url if hasattr(frame, "url") else str(frame) if "/setting/profile" in url or "bearer=" in url: logger.info(f"⌛ 侦测到重定向轨迹: {url[:80]}...") success_flag["done"] = True self.page.on("framenavigated", _check_url) # 给重定向留出充足时间 start_time = time.time() while time.time() - start_time < 20: if success_flag["done"]: # 如果侦测到了成功轨迹,最后再确认一下最终落点 time.sleep(3) # 缓冲渲染 if "/login" not in self.page.url or "bearer" in self.page.url: logger.info(f"✅ 登录验证通过!最终 URL: {self.page.url}") return True else: # 补救措施:既然拿到了 token 轨迹,尝试强制冲入 logger.info("尝试补救强制跳转...") self.page.goto(f"{Config.BASE_URL}/setting/profile", wait_until="domcontentloaded") time.sleep(2) if "/login" not in self.page.url: return True time.sleep(0.5) # 最终判定失败 self.page.screenshot(path="login_debug.png") logger.error(f"无法确认登录成功状态。最终 URL: {self.page.url}") return False if __name__ == "__main__": # 本地测试脚本 ui = LoginPage(headless=False) try: ui.start() # 提示用户手动输入账号密码进行本地测试 user = input("请输入测试账号: ") pwd = input("请输入测试密码: ") success = ui.login(user, pwd) if success: print("✅ 登录成功") else: print("❌ 登录失败或未观察到跳转") time.sleep(100) finally: ui.stop()