diagnose_cdp.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. """
  2. 底层 CDP 诊断脚本
  3. 直接测试 Chrome 的 CDP 端点响应
  4. """
  5. import subprocess
  6. import time
  7. import httpx
  8. import asyncio
  9. def start_chrome_with_cdp(port=9222, headless=True):
  10. """启动 Chrome 并返回进程"""
  11. cmd = [
  12. '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
  13. f'--remote-debugging-port={port}',
  14. '--user-data-dir=/tmp/test-cdp-diagnosis',
  15. '--no-first-run',
  16. '--no-default-browser-check',
  17. ]
  18. if headless:
  19. cmd.append('--headless=new')
  20. cmd.append('about:blank')
  21. print(f"启动命令: {' '.join(cmd)}")
  22. proc = subprocess.Popen(
  23. cmd,
  24. stdout=subprocess.PIPE,
  25. stderr=subprocess.PIPE
  26. )
  27. return proc
  28. async def test_cdp_endpoint(port=9222, max_retries=10):
  29. """测试 CDP 端点是否响应"""
  30. url = f'http://localhost:{port}/json/version'
  31. print(f"\n测试 CDP 端点: {url}")
  32. print("="*60)
  33. async with httpx.AsyncClient(timeout=10.0) as client:
  34. for i in range(max_retries):
  35. try:
  36. print(f"尝试 {i+1}/{max_retries}...", end=' ')
  37. resp = await client.get(url)
  38. print(f"✅ 状态码: {resp.status_code}")
  39. print(f"内容长度: {len(resp.content)} 字节")
  40. print(f"内容: {resp.text[:200]}")
  41. if resp.status_code == 200 and len(resp.content) > 0:
  42. data = resp.json()
  43. print(f"\n✅ CDP 端点正常响应")
  44. print(f"Browser: {data.get('Browser')}")
  45. print(f"WebSocket URL: {data.get('webSocketDebuggerUrl')}")
  46. return True
  47. except httpx.TimeoutException:
  48. print("❌ 超时")
  49. except httpx.ConnectError:
  50. print("❌ 连接失败")
  51. except Exception as e:
  52. print(f"❌ 错误: {e}")
  53. await asyncio.sleep(1)
  54. print("\n❌ CDP 端点无法响应")
  55. return False
  56. async def main():
  57. print("Chrome CDP 底层诊断")
  58. print("="*60)
  59. # 测试 1: headless=True
  60. print("\n【测试 1】headless=True")
  61. proc1 = start_chrome_with_cdp(port=9222, headless=True)
  62. print("等待 Chrome 启动...")
  63. time.sleep(3)
  64. result1 = await test_cdp_endpoint(port=9222)
  65. print("\n终止 Chrome...")
  66. proc1.terminate()
  67. proc1.wait(timeout=5)
  68. # 清理
  69. subprocess.run(['rm', '-rf', '/tmp/test-cdp-diagnosis'],
  70. stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
  71. await asyncio.sleep(2)
  72. # 测试 2: headless=False
  73. print("\n" + "="*60)
  74. print("【测试 2】headless=False")
  75. proc2 = start_chrome_with_cdp(port=9223, headless=False)
  76. print("等待 Chrome 启动...")
  77. time.sleep(3)
  78. result2 = await test_cdp_endpoint(port=9223)
  79. print("\n终止 Chrome...")
  80. proc2.terminate()
  81. proc2.wait(timeout=5)
  82. # 清理
  83. subprocess.run(['rm', '-rf', '/tmp/test-cdp-diagnosis'],
  84. stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
  85. # 总结
  86. print("\n" + "="*60)
  87. print("诊断总结")
  88. print("="*60)
  89. print(f"headless=True: {'✅ CDP 正常' if result1 else '❌ CDP 失败'}")
  90. print(f"headless=False: {'✅ CDP 正常' if result2 else '❌ CDP 失败'}")
  91. print("="*60)
  92. if not result1 and not result2:
  93. print("\n⚠️ 问题分析:")
  94. print("Chrome 的 CDP 端点无法响应 HTTP 请求")
  95. print("\n可能原因:")
  96. print("1. Chrome 被防火墙或安全软件阻止")
  97. print("2. macOS 权限问题")
  98. print("3. Chrome 版本与 CDP 协议不兼容")
  99. print("4. 系统资源不足导致 Chrome 启动缓慢")
  100. print("\n建议:")
  101. print("1. 检查系统偏好设置 > 安全性与隐私 > 防火墙")
  102. print("2. 尝试重新安装 Chrome")
  103. print("3. 检查是否有杀毒软件拦截")
  104. if __name__ == "__main__":
  105. asyncio.run(main())