""" 测试修复后的浏览器池 验证预热超时问题是否已解决 """ 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())