92 lines
3.4 KiB
Python
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()
|