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