#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 金山文档上传优化测试运行器 运行各种测试来验证优化效果 """ import os import sys import time from pathlib import Path # 添加当前目录到路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from kdocs_safety_test import SafetyTestTool from kdocs_optimized_uploader import OptimizedKdocsUploader def print_banner(): """打印欢迎横幅""" print("=" * 70) print("[LOCK] 金山文档上传安全测试工具 v1.0") print("=" * 70) print() print("📋 测试工具说明:") print(" 1. safety_test.py - UI安全测试工具 (推荐新手使用)") print(" - 每一步操作都需要手动确认") print(" - 详细的操作日志") print(" - 安全提示和警告") print() print(" 2. optimized_uploader.py - 优化后的上传器") print(" - 智能缓存系统") print(" - 减少等待时间") print(" - 快速定位算法") print() print("⚠️ 重要提醒:") print(" - 请确保金山文档URL配置正确") print(" - 测试前请备份重要数据") print(" - 仅使用测试图片进行上传测试") print() print("=" * 70) print() def check_prerequisites(): """检查运行环境""" print("🔍 检查运行环境...") # 检查Python版本 python_version = sys.version_info if python_version.major < 3 or (python_version.major == 3 and python_version.minor < 8): print("❌ Python版本过低,需要Python 3.8+") return False print(f"✅ Python版本: {python_version.major}.{python_version.minor}.{python_version.micro}") # 检查playwright try: import playwright print("✅ Playwright已安装") except ImportError: print("❌ Playwright未安装") print(" 请运行: pip install playwright") return False # 检查必要的目录 os.makedirs("data", exist_ok=True) os.makedirs("screenshots", exist_ok=True) print("✅ 必要目录已创建") print("✅ 运行环境检查通过\n") return True def show_menu(): """显示主菜单""" print("请选择要运行的测试工具:") print() print(" [1] 启动UI安全测试工具 (推荐)") print(" - 有图形界面,每步确认") print(" - 安全可控,适合新手") print() print(" [2] 运行命令行测试") print(" - 快速测试优化功能") print(" - 适合开发者") print() print(" [3] 查看优化说明") print(" - 了解优化原理") print(" - 查看配置参数") print() print(" [4] 退出") print() choice = input("请输入选项 (1-4): ").strip() return choice def run_ui_test(): """运行UI测试工具""" print("\n🚀 启动UI安全测试工具...") print("-" * 70) print("说明:") print(" 1. 将打开图形界面") print(" 2. 每一步操作都需要点击'确认执行'") print(" 3. 操作日志显示在底部") print(" 4. 如有问题请查看日志") print() input("按Enter键继续...") try: tool = SafetyTestTool() tool.run() except Exception as e: print(f"\n❌ 启动失败: {str(e)}") print("\n可能的解决方案:") print(" 1. 确保已安装tkinter: sudo apt-get install python3-tk") print(" 2. 确保已安装playwright: pip install playwright") print(" 3. 确保已安装浏览器: playwright install chromium") def run_command_line_test(): """运行命令行测试""" print("\n🔧 运行命令行测试...") print("-" * 70) # 获取测试配置 doc_url = input("请输入金山文档URL (或按Enter使用默认值): ").strip() if not doc_url: doc_url = "https://www.kdocs.cn/spreadsheet/your-doc-id" test_name = input("请输入测试人员姓名 (默认: 张三): ").strip() if not test_name: test_name = "张三" test_unit = input("请输入测试县区 (默认: 海淀区): ").strip() if not test_unit: test_unit = "海淀区" print(f"\n测试配置:") print(f" 文档URL: {doc_url}") print(f" 测试人员: {test_unit}-{test_name}") print() confirm = input("确认开始测试? (y/N): ").strip().lower() if confirm != 'y': print("测试已取消") return # 运行测试 try: # 设置环境变量 os.environ["KDOCS_DOC_URL"] = doc_url # 创建上传器 uploader = OptimizedKdocsUploader(cache_ttl=300) # 5分钟缓存 # 设置日志回调 def log_func(message: str): print(f" [LOG] {message}") uploader.set_log_callback(log_func) # 启动 print("\n▶️ 启动优化上传器...") uploader.start() time.sleep(1) # 测试缓存 print("\n▶️ 测试缓存功能...") print(" 说明: 第一次会搜索,第二次应该使用缓存") for i in range(2): print(f"\n 第{i+1}次尝试:") start_time = time.time() # 模拟上传 success = uploader.upload_screenshot( user_id=1, account_id=f"test00{i}", unit=test_unit, name=test_name, image_path="test.jpg" ) end_time = time.time() duration = end_time - start_time if success: print(f" ✅ 任务提交成功 (耗时: {duration:.2f}秒)") else: print(f" ❌ 任务提交失败 (耗时: {duration:.2f}秒)") time.sleep(2) # 显示缓存统计 print("\n📊 缓存统计:") stats = uploader.get_cache_stats() for key, value in stats.items(): print(f" {key}: {value}") # 停止 print("\n⏹️ 停止上传器...") uploader.stop() print("\n✅ 测试完成") print("\n提示:") print(" - 查看日志了解详细操作") print(" - 缓存功能可以显著提升速度") print(" - 建议在实际使用前进行充分测试") except Exception as e: print(f"\n❌ 测试失败: {str(e)}") import traceback traceback.print_exc() def show_optimization_info(): """显示优化说明""" print("\n📚 优化说明文档") print("=" * 70) print() print("🎯 优化原理:") print("-" * 70) print("1. 智能缓存系统") print(" - 缓存人员位置信息 (默认30分钟)") print(" - 使用前验证缓存有效性") print(" - 缓存失效时自动重新搜索") print() print("2. 快速定位算法") print(" - 先检查常见行号 (66, 67, 68, 70, 75, ...)") print(" - 再使用优化的搜索") print(" - 减少尝试次数 (从50次降到10次)") print() print("3. 减少等待时间") print(" - 上传等待: 2秒 → 0.8秒") print(" - 导航等待: 0.6秒 → 0.2秒") print(" - 点击等待: 1秒 → 0.3秒") print() print("4. 安全的只读验证") print(" - 使用前验证位置有效性") print(" - 每次都检查县区匹配") print(" - 确保不会上传错位置") print() print("⚙️ 可配置参数:") print("-" * 70) config_items = [ ("KDOCS_CACHE_TTL", "缓存有效期 (秒)", "1800", "30分钟"), ("KDOCS_FAST_GOTO_TIMEOUT_MS", "页面加载超时 (毫秒)", "10000", "10秒"), ("KDOCS_NAVIGATION_WAIT", "导航等待 (秒)", "0.2", "200毫秒"), ("KDOCS_CLICK_WAIT", "点击等待 (秒)", "0.3", "300毫秒"), ("KDOCS_UPLOAD_WAIT", "上传等待 (秒)", "0.8", "800毫秒"), ("KDOCS_SEARCH_ATTEMPTS", "搜索尝试次数", "10", "10次"), ] for env_name, description, default, note in config_items: print(f" {env_name}") print(f" 说明: {description}") print(f" 默认值: {default}") print(f" 备注: {note}") print() print("📈 性能预期:") print("-" * 70) print(" 优化前:") print(" - 搜索时间: 5-15秒") print(" - 上传等待: 2秒") print(" - 总计: 8-20秒/任务") print() print(" 优化后:") print(" - 缓存命中: 2-3秒 (90%场景)") print(" - 快速搜索: 4-6秒 (8%场景)") print(" - 传统搜索: 8-12秒 (2%场景)") print(" - 平均: 3-5秒/任务") print() print(" 提升幅度: 60-80%") print() print("[LOCK] 安全特性:") print("-" * 70) print(" 1. 单线程设计 - 无并发问题") print(" 2. 缓存验证 - 每次使用前验证") print(" 3. 单点操作 - 不进行批量修改") print(" 4. 详细日志 - 所有操作可追溯") print(" 5. 错误恢复 - 异常时自动回滚") print() print("💡 使用建议:") print("-" * 70) print(" 1. 首次使用请使用UI测试工具") print(" 2. 确保金山文档URL配置正确") print(" 3. 使用测试图片进行验证") print(" 4. 观察缓存命中率,适时调整TTL") print(" 5. 如遇到问题,查看日志定位原因") print() def main(): """主函数""" print_banner() # 检查环境 if not check_prerequisites(): print("\n❌ 环境检查失败,请先解决上述问题") return # 主循环 while True: choice = show_menu() if choice == '1': run_ui_test() elif choice == '2': run_command_line_test() elif choice == '3': show_optimization_info() elif choice == '4': print("\n👋 感谢使用,再见!") break else: print("\n❌ 无效选项,请重新选择") print() print() input("按Enter键继续...") if __name__ == "__main__": main()