| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- # -*- coding: utf-8 -*-
- """
- 测试 browserUseTools.py 中所有工具的可用性
- Test all tools in browserUseTools.py
- 业务场景:电商产品搜索与比价流程
- Business Scenario: E-commerce Product Search and Price Comparison
- 流程步骤:
- 1. 导航到电商网站
- 2. 搜索产品
- 3. 提取搜索结果
- 4. 点击产品链接
- 5. 滚动查看详情
- 6. 输入文本(搜索框)
- 7. 发送键盘按键
- 8. 切换标签页
- 9. 关闭标签页
- 10. 获取下拉选项
- 11. 选择下拉选项
- 12. 上传文件
- 13. 返回上一页
- 14. 完成任务
- """
- import asyncio
- import sys
- import os
- # 添加项目根目录到 Python 路径
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- # 导入所有工具
- from tools.browserUseTools import (
- navigate_to_url,
- go_back,
- click_element,
- input_text,
- send_keys,
- extract_content,
- search_web,
- scroll_page,
- switch_tab,
- close_tab,
- get_dropdown_options,
- select_dropdown_option,
- upload_file,
- done
- )
- async def test_all_tools():
- """测试所有 browserUseTools 工具"""
- print("=" * 80)
- print("开始测试 browserUseTools.py 中的所有工具")
- print("Business Scenario: E-commerce Product Search and Price Comparison")
- print("=" * 80)
- print()
- results = []
- # ============================================================
- # 测试 1: 导航工具 (Navigation Tools)
- # ============================================================
- print("【测试 1】navigate_to_url - 导航到淘宝首页")
- print("-" * 80)
- try:
- result = await navigate_to_url("https://www.taobao.com", new_tab=False)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- print(f" 元数据: {result.metadata}")
- results.append(("navigate_to_url", "PASS", result.title))
- await asyncio.sleep(2) # 等待页面加载
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("navigate_to_url", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 2: 搜索工具 (Search Tools)
- # ============================================================
- print("【测试 2】search_web - 使用 DuckDuckGo 搜索产品")
- print("-" * 80)
- try:
- result = await search_web("iPhone 15 Pro", engine="duckduckgo")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output[:200]}...")
- print(f" 元数据: {result.metadata}")
- results.append(("search_web", "PASS", result.title))
- await asyncio.sleep(2)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("search_web", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 3: 内容提取工具 (Content Extraction Tools)
- # ============================================================
- print("【测试 3】extract_content - 提取页面内容和链接")
- print("-" * 80)
- try:
- result = await extract_content(
- query="产品列表和价格信息",
- extract_links=True,
- start_from_char=0
- )
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output[:200]}...")
- if result.metadata and "links" in result.metadata:
- print(f" 提取到 {len(result.metadata['links'])} 个链接")
- results.append(("extract_content", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("extract_content", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 4: 点击工具 (Click Tools)
- # ============================================================
- print("【测试 4】click_element - 通过坐标点击元素")
- print("-" * 80)
- try:
- result = await click_element(coordinate_x=500, coordinate_y=300)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("click_element (coordinates)", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("click_element (coordinates)", "FAIL", str(e)))
- print()
- print("【测试 5】click_element - 通过索引点击元素")
- print("-" * 80)
- try:
- result = await click_element(index=5)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("click_element (index)", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("click_element (index)", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 6: 滚动工具 (Scroll Tools)
- # ============================================================
- print("【测试 6】scroll_page - 向下滚动页面")
- print("-" * 80)
- try:
- result = await scroll_page(down=True, pages=1.0)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("scroll_page (down)", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("scroll_page (down)", "FAIL", str(e)))
- print()
- print("【测试 7】scroll_page - 向上滚动页面")
- print("-" * 80)
- try:
- result = await scroll_page(down=False, pages=0.5)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("scroll_page (up)", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("scroll_page (up)", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 8: 文本输入工具 (Input Tools)
- # ============================================================
- print("【测试 8】input_text - 在搜索框输入文本")
- print("-" * 80)
- try:
- result = await input_text(index=0, text="iPhone 15 Pro Max", clear=True)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- print(f" 元数据: {result.metadata}")
- results.append(("input_text", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("input_text", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 9: 键盘按键工具 (Keyboard Tools)
- # ============================================================
- print("【测试 9】send_keys - 发送回车键")
- print("-" * 80)
- try:
- result = await send_keys("Enter")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("send_keys (Enter)", "PASS", result.title))
- await asyncio.sleep(2)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("send_keys (Enter)", "FAIL", str(e)))
- print()
- print("【测试 10】send_keys - 发送 PageDown 键")
- print("-" * 80)
- try:
- result = await send_keys("PageDown")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("send_keys (PageDown)", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("send_keys (PageDown)", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 11: 标签页管理工具 (Tab Management Tools)
- # ============================================================
- print("【测试 11】switch_tab - 切换到另一个标签页")
- print("-" * 80)
- try:
- result = await switch_tab(tab_id="abcd")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("switch_tab", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("switch_tab", "FAIL", str(e)))
- print()
- print("【测试 12】close_tab - 关闭标签页")
- print("-" * 80)
- try:
- result = await close_tab(tab_id="abcd")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("close_tab", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("close_tab", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 13: 下拉菜单工具 (Dropdown Tools)
- # ============================================================
- print("【测试 13】get_dropdown_options - 获取下拉选项")
- print("-" * 80)
- try:
- result = await get_dropdown_options(index=3)
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("get_dropdown_options", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("get_dropdown_options", "FAIL", str(e)))
- print()
- print("【测试 14】select_dropdown_option - 选择下拉选项")
- print("-" * 80)
- try:
- result = await select_dropdown_option(index=3, text="价格从低到高")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("select_dropdown_option", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("select_dropdown_option", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 15: 文件上传工具 (File Upload Tools)
- # ============================================================
- print("【测试 15】upload_file - 上传文件")
- print("-" * 80)
- try:
- result = await upload_file(index=2, path="/tmp/test_image.jpg")
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("upload_file", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("upload_file", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 16: 返回工具 (Go Back Tool)
- # ============================================================
- print("【测试 16】go_back - 返回上一页")
- print("-" * 80)
- try:
- result = await go_back()
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- results.append(("go_back", "PASS", result.title))
- await asyncio.sleep(1)
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("go_back", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试 17: 任务完成工具 (Done Tool)
- # ============================================================
- print("【测试 17】done - 标记任务完成")
- print("-" * 80)
- try:
- result = await done(
- text="电商产品搜索与比价流程测试完成!",
- success=True,
- files_to_display=None
- )
- print(f"✓ 成功: {result.title}")
- print(f" 输出: {result.output}")
- print(f" 元数据: {result.metadata}")
- results.append(("done", "PASS", result.title))
- except Exception as e:
- print(f"✗ 失败: {str(e)}")
- results.append(("done", "FAIL", str(e)))
- print()
- # ============================================================
- # 测试结果汇总
- # ============================================================
- print("=" * 80)
- print("测试结果汇总 (Test Results Summary)")
- print("=" * 80)
- print()
- passed = sum(1 for _, status, _ in results if status == "PASS")
- failed = sum(1 for _, status, _ in results if status == "FAIL")
- total = len(results)
- print(f"总测试数: {total}")
- print(f"通过: {passed} ✓")
- print(f"失败: {failed} ✗")
- print(f"通过率: {passed/total*100:.1f}%")
- print()
- print("详细结果:")
- print("-" * 80)
- for tool_name, status, message in results:
- status_icon = "✓" if status == "PASS" else "✗"
- print(f"{status_icon} {tool_name:40s} {status:6s} - {message}")
- print()
- return results
- async def main():
- """主函数"""
- try:
- results = await test_all_tools()
- # 生成测试报告
- print("=" * 80)
- print("测试完成!结果已保存到 test-tools.md")
- print("=" * 80)
- return results
- except Exception as e:
- print(f"测试过程中发生错误: {str(e)}")
- import traceback
- traceback.print_exc()
- return []
- if __name__ == "__main__":
- # 运行测试
- asyncio.run(main())
|