92 lines
3.4 KiB
Python

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()