test-tools.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. # -*- coding: utf-8 -*-
  2. """
  3. 测试 browserUseTools.py 中所有工具的可用性
  4. Test all tools in browserUseTools.py
  5. 业务场景:电商产品搜索与比价流程
  6. Business Scenario: E-commerce Product Search and Price Comparison
  7. 流程步骤:
  8. 1. 导航到电商网站
  9. 2. 搜索产品
  10. 3. 提取搜索结果
  11. 4. 点击产品链接
  12. 5. 滚动查看详情
  13. 6. 输入文本(搜索框)
  14. 7. 发送键盘按键
  15. 8. 切换标签页
  16. 9. 关闭标签页
  17. 10. 获取下拉选项
  18. 11. 选择下拉选项
  19. 12. 上传文件
  20. 13. 返回上一页
  21. 14. 完成任务
  22. """
  23. import asyncio
  24. import sys
  25. import os
  26. # 添加项目根目录到 Python 路径
  27. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  28. # 导入所有工具
  29. from tools.browserUseTools import (
  30. navigate_to_url,
  31. go_back,
  32. click_element,
  33. input_text,
  34. send_keys,
  35. extract_content,
  36. search_web,
  37. scroll_page,
  38. switch_tab,
  39. close_tab,
  40. get_dropdown_options,
  41. select_dropdown_option,
  42. upload_file,
  43. done
  44. )
  45. async def test_all_tools():
  46. """测试所有 browserUseTools 工具"""
  47. print("=" * 80)
  48. print("开始测试 browserUseTools.py 中的所有工具")
  49. print("Business Scenario: E-commerce Product Search and Price Comparison")
  50. print("=" * 80)
  51. print()
  52. results = []
  53. # ============================================================
  54. # 测试 1: 导航工具 (Navigation Tools)
  55. # ============================================================
  56. print("【测试 1】navigate_to_url - 导航到淘宝首页")
  57. print("-" * 80)
  58. try:
  59. result = await navigate_to_url("https://www.taobao.com", new_tab=False)
  60. print(f"✓ 成功: {result.title}")
  61. print(f" 输出: {result.output}")
  62. print(f" 元数据: {result.metadata}")
  63. results.append(("navigate_to_url", "PASS", result.title))
  64. await asyncio.sleep(2) # 等待页面加载
  65. except Exception as e:
  66. print(f"✗ 失败: {str(e)}")
  67. results.append(("navigate_to_url", "FAIL", str(e)))
  68. print()
  69. # ============================================================
  70. # 测试 2: 搜索工具 (Search Tools)
  71. # ============================================================
  72. print("【测试 2】search_web - 使用 DuckDuckGo 搜索产品")
  73. print("-" * 80)
  74. try:
  75. result = await search_web("iPhone 15 Pro", engine="duckduckgo")
  76. print(f"✓ 成功: {result.title}")
  77. print(f" 输出: {result.output[:200]}...")
  78. print(f" 元数据: {result.metadata}")
  79. results.append(("search_web", "PASS", result.title))
  80. await asyncio.sleep(2)
  81. except Exception as e:
  82. print(f"✗ 失败: {str(e)}")
  83. results.append(("search_web", "FAIL", str(e)))
  84. print()
  85. # ============================================================
  86. # 测试 3: 内容提取工具 (Content Extraction Tools)
  87. # ============================================================
  88. print("【测试 3】extract_content - 提取页面内容和链接")
  89. print("-" * 80)
  90. try:
  91. result = await extract_content(
  92. query="产品列表和价格信息",
  93. extract_links=True,
  94. start_from_char=0
  95. )
  96. print(f"✓ 成功: {result.title}")
  97. print(f" 输出: {result.output[:200]}...")
  98. if result.metadata and "links" in result.metadata:
  99. print(f" 提取到 {len(result.metadata['links'])} 个链接")
  100. results.append(("extract_content", "PASS", result.title))
  101. await asyncio.sleep(1)
  102. except Exception as e:
  103. print(f"✗ 失败: {str(e)}")
  104. results.append(("extract_content", "FAIL", str(e)))
  105. print()
  106. # ============================================================
  107. # 测试 4: 点击工具 (Click Tools)
  108. # ============================================================
  109. print("【测试 4】click_element - 通过坐标点击元素")
  110. print("-" * 80)
  111. try:
  112. result = await click_element(coordinate_x=500, coordinate_y=300)
  113. print(f"✓ 成功: {result.title}")
  114. print(f" 输出: {result.output}")
  115. results.append(("click_element (coordinates)", "PASS", result.title))
  116. await asyncio.sleep(1)
  117. except Exception as e:
  118. print(f"✗ 失败: {str(e)}")
  119. results.append(("click_element (coordinates)", "FAIL", str(e)))
  120. print()
  121. print("【测试 5】click_element - 通过索引点击元素")
  122. print("-" * 80)
  123. try:
  124. result = await click_element(index=5)
  125. print(f"✓ 成功: {result.title}")
  126. print(f" 输出: {result.output}")
  127. results.append(("click_element (index)", "PASS", result.title))
  128. await asyncio.sleep(1)
  129. except Exception as e:
  130. print(f"✗ 失败: {str(e)}")
  131. results.append(("click_element (index)", "FAIL", str(e)))
  132. print()
  133. # ============================================================
  134. # 测试 6: 滚动工具 (Scroll Tools)
  135. # ============================================================
  136. print("【测试 6】scroll_page - 向下滚动页面")
  137. print("-" * 80)
  138. try:
  139. result = await scroll_page(down=True, pages=1.0)
  140. print(f"✓ 成功: {result.title}")
  141. print(f" 输出: {result.output}")
  142. results.append(("scroll_page (down)", "PASS", result.title))
  143. await asyncio.sleep(1)
  144. except Exception as e:
  145. print(f"✗ 失败: {str(e)}")
  146. results.append(("scroll_page (down)", "FAIL", str(e)))
  147. print()
  148. print("【测试 7】scroll_page - 向上滚动页面")
  149. print("-" * 80)
  150. try:
  151. result = await scroll_page(down=False, pages=0.5)
  152. print(f"✓ 成功: {result.title}")
  153. print(f" 输出: {result.output}")
  154. results.append(("scroll_page (up)", "PASS", result.title))
  155. await asyncio.sleep(1)
  156. except Exception as e:
  157. print(f"✗ 失败: {str(e)}")
  158. results.append(("scroll_page (up)", "FAIL", str(e)))
  159. print()
  160. # ============================================================
  161. # 测试 8: 文本输入工具 (Input Tools)
  162. # ============================================================
  163. print("【测试 8】input_text - 在搜索框输入文本")
  164. print("-" * 80)
  165. try:
  166. result = await input_text(index=0, text="iPhone 15 Pro Max", clear=True)
  167. print(f"✓ 成功: {result.title}")
  168. print(f" 输出: {result.output}")
  169. print(f" 元数据: {result.metadata}")
  170. results.append(("input_text", "PASS", result.title))
  171. await asyncio.sleep(1)
  172. except Exception as e:
  173. print(f"✗ 失败: {str(e)}")
  174. results.append(("input_text", "FAIL", str(e)))
  175. print()
  176. # ============================================================
  177. # 测试 9: 键盘按键工具 (Keyboard Tools)
  178. # ============================================================
  179. print("【测试 9】send_keys - 发送回车键")
  180. print("-" * 80)
  181. try:
  182. result = await send_keys("Enter")
  183. print(f"✓ 成功: {result.title}")
  184. print(f" 输出: {result.output}")
  185. results.append(("send_keys (Enter)", "PASS", result.title))
  186. await asyncio.sleep(2)
  187. except Exception as e:
  188. print(f"✗ 失败: {str(e)}")
  189. results.append(("send_keys (Enter)", "FAIL", str(e)))
  190. print()
  191. print("【测试 10】send_keys - 发送 PageDown 键")
  192. print("-" * 80)
  193. try:
  194. result = await send_keys("PageDown")
  195. print(f"✓ 成功: {result.title}")
  196. print(f" 输出: {result.output}")
  197. results.append(("send_keys (PageDown)", "PASS", result.title))
  198. await asyncio.sleep(1)
  199. except Exception as e:
  200. print(f"✗ 失败: {str(e)}")
  201. results.append(("send_keys (PageDown)", "FAIL", str(e)))
  202. print()
  203. # ============================================================
  204. # 测试 11: 标签页管理工具 (Tab Management Tools)
  205. # ============================================================
  206. print("【测试 11】switch_tab - 切换到另一个标签页")
  207. print("-" * 80)
  208. try:
  209. result = await switch_tab(tab_id="abcd")
  210. print(f"✓ 成功: {result.title}")
  211. print(f" 输出: {result.output}")
  212. results.append(("switch_tab", "PASS", result.title))
  213. await asyncio.sleep(1)
  214. except Exception as e:
  215. print(f"✗ 失败: {str(e)}")
  216. results.append(("switch_tab", "FAIL", str(e)))
  217. print()
  218. print("【测试 12】close_tab - 关闭标签页")
  219. print("-" * 80)
  220. try:
  221. result = await close_tab(tab_id="abcd")
  222. print(f"✓ 成功: {result.title}")
  223. print(f" 输出: {result.output}")
  224. results.append(("close_tab", "PASS", result.title))
  225. await asyncio.sleep(1)
  226. except Exception as e:
  227. print(f"✗ 失败: {str(e)}")
  228. results.append(("close_tab", "FAIL", str(e)))
  229. print()
  230. # ============================================================
  231. # 测试 13: 下拉菜单工具 (Dropdown Tools)
  232. # ============================================================
  233. print("【测试 13】get_dropdown_options - 获取下拉选项")
  234. print("-" * 80)
  235. try:
  236. result = await get_dropdown_options(index=3)
  237. print(f"✓ 成功: {result.title}")
  238. print(f" 输出: {result.output}")
  239. results.append(("get_dropdown_options", "PASS", result.title))
  240. await asyncio.sleep(1)
  241. except Exception as e:
  242. print(f"✗ 失败: {str(e)}")
  243. results.append(("get_dropdown_options", "FAIL", str(e)))
  244. print()
  245. print("【测试 14】select_dropdown_option - 选择下拉选项")
  246. print("-" * 80)
  247. try:
  248. result = await select_dropdown_option(index=3, text="价格从低到高")
  249. print(f"✓ 成功: {result.title}")
  250. print(f" 输出: {result.output}")
  251. results.append(("select_dropdown_option", "PASS", result.title))
  252. await asyncio.sleep(1)
  253. except Exception as e:
  254. print(f"✗ 失败: {str(e)}")
  255. results.append(("select_dropdown_option", "FAIL", str(e)))
  256. print()
  257. # ============================================================
  258. # 测试 15: 文件上传工具 (File Upload Tools)
  259. # ============================================================
  260. print("【测试 15】upload_file - 上传文件")
  261. print("-" * 80)
  262. try:
  263. result = await upload_file(index=2, path="/tmp/test_image.jpg")
  264. print(f"✓ 成功: {result.title}")
  265. print(f" 输出: {result.output}")
  266. results.append(("upload_file", "PASS", result.title))
  267. await asyncio.sleep(1)
  268. except Exception as e:
  269. print(f"✗ 失败: {str(e)}")
  270. results.append(("upload_file", "FAIL", str(e)))
  271. print()
  272. # ============================================================
  273. # 测试 16: 返回工具 (Go Back Tool)
  274. # ============================================================
  275. print("【测试 16】go_back - 返回上一页")
  276. print("-" * 80)
  277. try:
  278. result = await go_back()
  279. print(f"✓ 成功: {result.title}")
  280. print(f" 输出: {result.output}")
  281. results.append(("go_back", "PASS", result.title))
  282. await asyncio.sleep(1)
  283. except Exception as e:
  284. print(f"✗ 失败: {str(e)}")
  285. results.append(("go_back", "FAIL", str(e)))
  286. print()
  287. # ============================================================
  288. # 测试 17: 任务完成工具 (Done Tool)
  289. # ============================================================
  290. print("【测试 17】done - 标记任务完成")
  291. print("-" * 80)
  292. try:
  293. result = await done(
  294. text="电商产品搜索与比价流程测试完成!",
  295. success=True,
  296. files_to_display=None
  297. )
  298. print(f"✓ 成功: {result.title}")
  299. print(f" 输出: {result.output}")
  300. print(f" 元数据: {result.metadata}")
  301. results.append(("done", "PASS", result.title))
  302. except Exception as e:
  303. print(f"✗ 失败: {str(e)}")
  304. results.append(("done", "FAIL", str(e)))
  305. print()
  306. # ============================================================
  307. # 测试结果汇总
  308. # ============================================================
  309. print("=" * 80)
  310. print("测试结果汇总 (Test Results Summary)")
  311. print("=" * 80)
  312. print()
  313. passed = sum(1 for _, status, _ in results if status == "PASS")
  314. failed = sum(1 for _, status, _ in results if status == "FAIL")
  315. total = len(results)
  316. print(f"总测试数: {total}")
  317. print(f"通过: {passed} ✓")
  318. print(f"失败: {failed} ✗")
  319. print(f"通过率: {passed/total*100:.1f}%")
  320. print()
  321. print("详细结果:")
  322. print("-" * 80)
  323. for tool_name, status, message in results:
  324. status_icon = "✓" if status == "PASS" else "✗"
  325. print(f"{status_icon} {tool_name:40s} {status:6s} - {message}")
  326. print()
  327. return results
  328. async def main():
  329. """主函数"""
  330. try:
  331. results = await test_all_tools()
  332. # 生成测试报告
  333. print("=" * 80)
  334. print("测试完成!结果已保存到 test-tools.md")
  335. print("=" * 80)
  336. return results
  337. except Exception as e:
  338. print(f"测试过程中发生错误: {str(e)}")
  339. import traceback
  340. traceback.print_exc()
  341. return []
  342. if __name__ == "__main__":
  343. # 运行测试
  344. asyncio.run(main())