Files
ai_wht_wechat/backend/test_browser_pool_fix.py
2026-01-06 19:36:42 +08:00

213 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
测试修复后的浏览器池
验证预热超时问题是否已解决
"""
import asyncio
import sys
from xhs_login import XHSLoginService
async def test_browser_pool_with_proxy(proxy_index: int = 0):
"""测试修复后的浏览器池"""
print(f"\n{'='*60}")
print(f"🔧 测试修复后的浏览器池")
print(f"{'='*60}")
# 从代理配置获取代理信息
from damai_proxy_config import get_proxy_config
proxy_config = get_proxy_config(proxy_index)
proxy_server = proxy_config['server'].replace('http://', '')
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_server}"
print(f"✅ 使用代理: 代理{proxy_index + 1}")
print(f" 代理服务器: {proxy_config['server']}")
print(f" 代理URL: {proxy_url}")
# 创建登录服务(使用浏览器池)
login_service = XHSLoginService(use_pool=True) # 使用浏览器池
try:
print(f"\n🚀 初始化浏览器(使用代理 + 浏览器池)...")
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
await login_service.init_browser(proxy=proxy_url, user_agent=user_agent)
print("✅ 浏览器初始化成功")
# 检查浏览器池状态
browser_pool = login_service.browser_pool
if browser_pool:
stats = browser_pool.get_stats()
print(f"\n📊 浏览器池状态:")
print(f" 主浏览器存活: {stats['browser_alive']}")
print(f" 上下文存活: {stats['context_alive']}")
print(f" 页面存活: {stats['page_alive']}")
print(f" 是否预热: {stats['is_preheated']}")
print(f" 临时浏览器数: {stats['temp_browsers_count']}")
# 访问小红书登录页面
print(f"\n🌐 访问小红书创作者平台...")
await login_service.page.goto('https://creator.xiaohongshu.com/login', wait_until='domcontentloaded', timeout=30000)
await asyncio.sleep(2)
title = await login_service.page.title()
url = login_service.page.url
content_len = len(await login_service.page.content())
print(f"✅ 访问成功")
print(f" 标题: {title}")
print(f" URL: {url}")
print(f" 内容长度: {content_len} 字符")
# 检查关键元素
phone_input = await login_service.page.query_selector('input[placeholder="手机号"]')
if phone_input:
print(f"✅ 找到手机号输入框")
else:
print(f"❌ 未找到手机号输入框")
# 查找所有input元素
inputs = await login_service.page.query_selector_all('input')
print(f" 共找到 {len(inputs)} 个input元素")
if content_len == 0:
print(f"⚠️ 页面内容为空")
else:
print(f"✅ 页面内容正常加载")
return True
except Exception as e:
print(f"❌ 测试失败: {str(e)}")
import traceback
traceback.print_exc()
return False
finally:
await login_service.close_browser()
async def test_multiple_requests(proxy_index: int = 0):
"""测试多个请求复用浏览器池"""
print(f"\n{'='*60}")
print(f"🔄 测试浏览器池复用")
print(f"{'='*60}")
from damai_proxy_config import get_proxy_config
proxy_config = get_proxy_config(proxy_index)
proxy_server = proxy_config['server'].replace('http://', '')
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_server}"
print(f"✅ 使用代理: 代理{proxy_index + 1}")
success_count = 0
for i in range(3):
print(f"\n🧪 请求 {i+1}/3")
login_service = XHSLoginService(use_pool=True)
try:
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
await login_service.init_browser(proxy=proxy_url, user_agent=user_agent)
# 访问页面
await login_service.page.goto('https://creator.xiaohongshu.com/login', wait_until='domcontentloaded', timeout=30000)
await asyncio.sleep(1)
content_len = len(await login_service.page.content())
if content_len > 0:
print(f" ✅ 请求 {i+1} 成功,内容长度: {content_len}")
success_count += 1
else:
print(f" ❌ 请求 {i+1} 失败,内容为空")
except Exception as e:
print(f" ❌ 请求 {i+1} 异常: {str(e)}")
finally:
await login_service.close_browser()
# 等待一下避免请求过于频繁
if i < 2:
await asyncio.sleep(1)
print(f"\n📈 测试结果: {success_count}/3 请求成功")
return success_count == 3
def explain_fix():
"""解释修复内容"""
print("="*60)
print("🔧 修复内容说明")
print("="*60)
print("\n修复的两个问题:")
print("1. 增加超时时间: 从30秒增加到45秒")
print("2. 修改等待策略: 从'networkidle'改为'domcontentloaded'")
print(" - 'networkidle': 等待网络空闲(可能等待时间过长)")
print(" - 'domcontentloaded': DOM内容加载完成更快更稳定")
print("\n浏览器池优化效果:")
print("✅ 减少预热超时错误")
print("✅ 提高页面加载成功率")
print("✅ 保持浏览器常驻,提升性能")
async def main():
"""主函数"""
explain_fix()
print(f"\n{'='*60}")
print("🎯 选择测试模式")
print("="*60)
print("\n1. 单次浏览器池测试")
print("2. 多请求复用测试")
print("3. 全部测试")
try:
choice = input("\n请选择测试模式 (1-3, 默认为3): ").strip()
if choice not in ['1', '2', '3']:
choice = '3'
proxy_choice = input("请选择代理 (0 或 1, 默认为0): ").strip()
if proxy_choice not in ['0', '1']:
proxy_choice = '0'
proxy_idx = int(proxy_choice)
if choice in ['1', '3']:
print(f"\n{'-'*40}")
print("测试1: 单次浏览器池测试")
success1 = await test_browser_pool_with_proxy(proxy_idx)
if choice in ['2', '3']:
print(f"\n{'-'*40}")
print("测试2: 多请求复用测试")
success2 = await test_multiple_requests(proxy_idx)
if choice == '3':
overall_success = success1 and success2
elif choice == '1':
overall_success = success1
else:
overall_success = success2
print(f"\n{'='*60}")
if overall_success:
print("✅ 所有测试通过!浏览器池预热问题已修复")
else:
print("❌ 部分测试失败,请检查配置")
print("="*60)
except KeyboardInterrupt:
print("\n\n⚠️ 测试被用户中断")
except Exception as e:
print(f"\n❌ 测试过程中出现错误: {str(e)}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
# Windows环境下设置事件循环策略
if sys.platform == 'win32':
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
# 运行测试
asyncio.run(main())