""" 微店登录流程测试脚本 用法: python test_login.py """ import asyncio import json from playwright.async_api import async_playwright from utils.stealth import stealth_async LOGIN_URL = "https://sso.weidian.com/login/index.php" TEST_PHONE = "15556986013" TEST_PASSWORD = "Precious171259" async def test_login(): login_result = {"success": False, "msg": "未收到响应", "cookies": []} p = await async_playwright().start() browser = await p.chromium.launch(headless=False, args=["--disable-gpu"]) device = p.devices["iPhone 13"] context = await browser.new_context(**device) page = await context.new_page() await stealth_async(page) # 监听登录 API 响应 async def on_response(response): url = response.url if "user/login" in url or "user/bindcheck" in url: try: # 打印请求参数 req = response.request print(f"\n[网络] {req.method} {url}") print(f"[网络] 请求头: {dict(req.headers)}") post_data = req.post_data print(f"[网络] 请求体: {post_data}") # 打印响应 data = await response.json() status = data.get("status", {}) print(f"[网络] 响应 status_code={status.get('status_code')}") if status.get("status_code") == 0 and "user/login" in url: login_result["success"] = True login_result["msg"] = "登录成功" login_result["cookies"] = data.get("result", {}).get("cookie", []) elif "user/login" in url: login_result["msg"] = status.get("status_reason", "未知错误") except Exception as e: print(f"[网络] 解析失败: {e}") page.on("response", on_response) # Step 1: 打开登录页 print("[1] 打开登录页...") await page.goto(LOGIN_URL, wait_until="networkidle", timeout=15000) await asyncio.sleep(1) await page.screenshot(path="debug_step1.png") print(f" URL: {page.url}") # Step 2: 点击"登录"进入表单 print("[2] 点击 #login_init_by_login...") await page.locator("#login_init_by_login").click(timeout=5000) await asyncio.sleep(1.5) await page.screenshot(path="debug_step2.png") # Step 3: 点击"账号密码登录" tab print("[3] 点击'账号密码登录' tab...") try: await page.locator("h4.login_content_h4 span", has_text="账号密码登录").click(timeout=3000) await asyncio.sleep(0.5) except Exception: print(" 已在密码登录 tab") await page.screenshot(path="debug_step3.png") # Step 4: 填写手机号和密码 print(f"[4] 填写手机号: {TEST_PHONE}") phone_input = page.locator('input[placeholder*="手机号"]').first await phone_input.click() await phone_input.fill("") await page.keyboard.type(TEST_PHONE, delay=50) print("[5] 填写密码...") pwd_input = page.locator('input[placeholder*="登录密码"], input[type="password"]').first await pwd_input.click() await pwd_input.fill("") await page.keyboard.type(TEST_PASSWORD, delay=50) await asyncio.sleep(0.5) await page.screenshot(path="debug_step4.png") print(" 截图已保存: debug_step4.png") # Step 5: 点击登录按钮 print("[6] 点击 #login_pwd_submit...") await page.locator("#login_pwd_submit").click(timeout=5000) # 等待 API 响应 print(" 等待 API 响应...") await asyncio.sleep(5) await page.screenshot(path="debug_step5.png") print(f" 当前URL: {page.url}") # 检查结果 print(f"\n[结果] success={login_result['success']}, msg={login_result['msg']}") print(f"[结果] 拿到 {len(login_result['cookies'])} 个 cookie") if login_result["success"] and login_result["cookies"]: # 把 API 返回的 cookie 写入浏览器 for c in login_result["cookies"]: await context.add_cookies([{ "name": c.get("name", ""), "value": c.get("value", ""), "domain": c.get("domain", ".weidian.com"), "path": c.get("path", "/"), "httpOnly": c.get("httpOnly", False), "secure": c.get("secure", False), "sameSite": "Lax", }]) # 保存 storage_state await context.storage_state(path="test_auth_state.json") print("[结果] cookie 已保存到 test_auth_state.json") # 验证: 访问个人页 print("\n[验证] 访问个人页...") await page.goto( "https://h5.weidian.com/decoration/uni-mine/", wait_until="networkidle", timeout=15000 ) await asyncio.sleep(2) await page.screenshot(path="debug_verify.png") verify_url = page.url print(f"[验证] URL: {verify_url}") if "login" in verify_url.lower(): print("[验证] 失败 - 被重定向到登录页") else: print("[验证] 成功 - cookie 有效!") else: print("[结果] 登录未成功") body = await page.locator("body").text_content() print(f"[页面] {body[:300]}") print("\n按回车关闭浏览器...") try: await asyncio.get_event_loop().run_in_executor(None, input) except Exception: pass await browser.close() await p.stop() if __name__ == "__main__": asyncio.run(test_login())