# auto_script_generator **Repository Path**: lls0229/auto_script_generator ## Basic Information - **Project Name**: auto_script_generator - **Description**: 基于大语言模型的测试用例 → 自动化脚本生成工具 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-05-26 - **Last Updated**: 2026-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Auto Script Generator 基于多种数据源(Excel / 飞书 / 钉钉 / 企业微信)的测试用例自动生成 pytest + Selenium 测试脚本的工具。支持中文动作描述的规则映射和 AI(DeepSeek)兜底解析,提供 **Windows 桌面 GUI** 和 **命令行** 两种使用方式。 ## 目录结构 ``` auto_script_generator/ ├── README.md ├── conftest.py # Pytest 全局 fixture — driver 初始化/销毁 ├── pytest.ini # Pytest 配置(pythonpath = .) ├── run.py # 入口脚本:读取数据源 → 生成测试脚本 ├── setup.py # 包安装配置 ├── generator/ # 核心生成器模块 │ ├── config.yaml # 全局配置(数据源 + AI 参数 + 作者) │ ├── config.example.yaml # 配置模板(含详细注释) │ ├── config_validator.py # 配置校验(字段拼写检测 + 必填项检查) │ ├── action_mapping.py # 中文动作 → 函数名规则映射 │ ├── ai_mapper.py # AI 兜底解析 + NL 场景展开 + 用例审查 │ ├── parser.py # 用例解析器:动作映射 + AI 兜底 │ ├── script_generator.py # 脚本生成器(Jinja2 模板渲染) │ └── data_sources/ # 数据源适配层 │ ├── base.py # 抽象基类 + 异常定义 │ ├── excel_ds.py # Excel(单文件 + 文件夹自动扫描) │ ├── feishu_ds.py # 飞书(独立表格 + 知识库 Wiki) │ ├── dingtalk_ds.py # 钉钉在线表格 │ └── wecom_ds.py # 企业微信智能表格 ├── gui/ # 🆕 Windows 桌面 GUI(tkinter) │ ├── app.py # GUI 入口 │ ├── main_window.py # 主窗口(配置/获取/审查/生成) │ └── dialogs.py # 对话框(数据源配置 + AI 设置) ├── generated_tests/ # 生成的测试脚本输出(按数据源分目录) │ ├── excel/ # Excel 来源生成的脚本 │ ├── feishu/ # 飞书来源生成的脚本 │ └── ... ├── keywords/ # 关键字函数库 │ └── actions.py # Selenium 封装(11 个关键字函数) ├── pages/ # 页面对象模块 │ └── login_page.py # 登录页 Page Object ├── templates/ # 模板目录 │ └── test_template.py.j2 # Jinja2 测试脚本模板 ├── test/ # 单元测试 │ ├── test_feishu_utils.py # 富文本提取 + 列映射 │ ├── test_action_mapping.py # 动作映射完整性 │ ├── test_parser.py # 用例解析器 │ ├── test_excel_utils.py # Excel 工具函数 │ ├── test_config_validator.py # 配置校验器 │ └── test_ai_mapper.py # AI 解析(需 API Key) └── test_cases/ # 本地 Excel 用例 └── login_test.xlsx ``` ## 工作流程 ``` ┌─────────────────────────────────────────────────┐ │ config.yaml │ │ data_source.type / data_source.sources │ └───────────────┬─────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────┐ │ data_sources/__init__.py (工厂) │ │ ├─ excel_ds.py (本地 Excel) │ │ ├─ feishu_ds.py (飞书 API) │ │ ├─ dingtalk_ds.py (钉钉 API) │ │ └─ wecom_ds.py (企业微信 API) │ └───────────────┬─────────────────────────────────┘ ▼ fetch_test_cases() ┌─────────────────────────────────────────────────┐ │ parser.py │ │ ├─ action_mapping.py (规则映射优先) │ │ └─ ai_mapper.py (AI 兜底) │ └───────────────┬─────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────┐ │ script_generator.py (Jinja2 渲染) │ └───────────────┬─────────────────────────────────┘ ▼ generated_tests/{数据源}/ ``` --- ## 🆕 Windows 桌面 GUI 除了命令行方式,v0.2.0 起提供 **Windows 桌面图形界面**(兼容 Linux/macOS): ```bash # 方式一:通过 entry point 启动 auto-script-gui # 方式二:通过模块启动 python -m gui # 方式三:直接运行 python gui/app.py ``` ### GUI 主界面功能 | 区域 | 功能 | |------|------| | **工具栏** | 加载/保存配置、校验、获取用例、AI 审查、生成脚本、停止 | | **左侧面板** | ① 数据源列表(类型/标签/连接状态)- 支持添加/编辑/删除/测试连接
② 用例文件列表(多选 + 全选/取消)- 按数据源分组展示
③ 输出日志(实时着色输出) | | **右侧面板** | ① 用例预览(Tab 页签)- 按 test_id 分组展示解析后的步骤
② AI 审查(Tab 页签)- 评分 + 问题分级列表(ERROR/WARN/TIP)
③ 生成脚本(Tab 页签)- 文件列表 + 代码预览 | ### GUI 特性 - **后台线程**:耗时的数据源连接/获取/生成操作在后台线程执行,UI 不卡顿 - **实时输出**:通过 Queue 将后台 `print` / `log` 输出实时转发到日志区 - **停止按钮**:所有耗时操作支持随时取消(`threading.Event` 信号) - **文件筛选**:勾选左侧用例文件列表中的文件,精确控制要处理的文件子集 - **AI 审查分文件**:支持按来源文件分别审查,汇总评分 - **脚本预览**:生成后可在「生成脚本」Tab 中直接查看代码内容 - **安全防护**:输出目录选择时禁止写入系统目录,验证写入权限 ### GUI 默认布局 ``` ┌──────────────────────────────────────────────────────────┐ │ 菜单栏: [文件] [工具] [帮助] │ │ 工具栏: [加载][保存] | [校验][获取][审查][生成][停止] │ │ [Dry-run] 配置路径 [进度条] │ ├─────────────────────┬────────────────────────────────────┤ │ 数据源列表 (Tree) │ Tab: [用例预览][AI审查][生成脚本] │ │ ┌──────────────┐ │ ┌────────────────────────────────┐ │ │ │类型 │标签│状态│ │ │test_id│func│page│element│... │ │ │ ├──────────────┤ │ ├────────────────────────────────┤ │ │ │ ... │ │ │ ... │ │ │ └──────────────┘ │ └────────────────────────────────┘ │ │ [添加][编辑][删除] │ │ │ │ │ │ 用例文件 (多选) │ │ │ ┌──────────────┐ │ │ │ │源│文件名│路径│ │ │ │ ├──────────────┤ │ │ │ │ ... │ │ │ │ └──────────────┘ │ │ │ [全选][取消] [刷新] │ │ │ │ │ │ 输出目录: [______] │ │ │ │ │ │ 输出日志 (彩色) │ │ │ ┌──────────────┐ │ │ │ │[STEP] ... │ │ │ │ │[PASS] ... │ │ │ │ └──────────────┘ │ │ ├─────────────────────┴────────────────────────────────────┤ │ 状态栏: 就绪 数据源: 2/2 已连接 │ └──────────────────────────────────────────────────────────┘ ``` --- ## 数据源配置 所有数据源通过 `generator/config.yaml` 统一配置。支持两种模式: - **单来源模式**:设置 `data_source.type` 选择一种数据源 - **多来源模式**:设置 `data_source.sources` 数组,同时读取多个来源 ### 单来源模式 ```yaml data_source: type: "feishu" # excel | feishu | dingtalk | wecom feishu: app_id: "xxx" ... ``` ### 多来源模式 ```yaml data_source: sources: - type: excel excel: file_path: "test_cases/login_test.xlsx" - type: feishu feishu: app_id: "xxx" ... ``` 多来源模式下每个来源生成到独立子目录:`generated_tests/excel/`、`generated_tests/feishu/` …。同类型多个来源自动加后缀 `_2`、`_3`。 --- ## 各数据源信息获取方式 ### 1. Excel(本地文件) 支持两种读取模式: #### 单文件模式(向后兼容) ```yaml data_source: type: "excel" excel: file_path: "test_cases/login_test.xlsx" ``` #### 🆕 文件夹自动扫描模式(推荐) ```yaml data_source: type: "excel" excel: folder_path: "test_cases" ``` - 自动扫描文件夹下所有 `.xlsx` / `.xls` 文件 - 仅读取含 `test_id` + `action`/`nl_scenario` 列的合法测试用例文件 - 自动排除 Excel 临时文件(`~$` 开头) - 包含路径遍历防护(`os.path.realpath` + 边界检查) > 表格列名要求:`test_id`(用例编号)、`action`(动作描述)、`element`(元素名)、`value`(输入值)、`expected`(预期结果)、`page_object`(页面对象)。**所有数据源均支持中英文列名混用**。 --- ### 2. 飞书 (Feishu / Lark) 支持两种 URL 格式:独立电子表格(`/sheets/`)和知识库 Wiki 页面(`/wiki/`)。 #### 2.1 获取 App ID 和 App Secret 1. 打开 [飞书开放平台](https://open.feishu.cn/app) 2. 进入你的应用 → **凭证与基础信息** 3. 复制 **App ID** 和 **App Secret** > 如果没有应用,先点击「创建企业自建应用」。 #### 2.2 开启权限 在飞书开放平台的应用页面: 1. 左侧菜单 → **权限管理** 2. 搜索并开启以下权限: - `knowledge_base:knowledge_base`(知识库,Wiki 类型表格需要) - `sheets:spreadsheet`(电子表格) 3. 发布新版本使权限生效 #### 2.3 获取表格 Token 和子表 ID **独立电子表格**(URL 以 `/sheets/` 开头): ``` https://xxx.feishu.cn/sheets/ABC123def456?sheet=ghi789 ^^^^^^^^^^^^^^ ^^^^^^ spreadsheet_token sheet_id ``` **知识库 Wiki**(URL 以 `/wiki/` 开头): ``` https://xxx.feishu.cn/wiki/M1gCwbVK3irAXHknLPOcrMMNnGb?sheet=UlHKiE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ wiki_token sheet_id ``` #### 2.4 将应用添加到知识库协作者(Wiki 类型必需) 1. 打开飞书知识库 → 右上角「…」→ **知识库设置** 2. 点击 **成员管理** → **添加协作者** 3. 搜索你的应用名称并添加(只读权限即可) #### 2.5 配置示例 ```yaml # 独立电子表格 data_source: type: "feishu" feishu: app_id: "cli_xxxxxxxx" app_secret: "xxxxxxxx" spreadsheet_token: "ABC123def456" sheet_id: "ghi789" # 知识库 Wiki 页面(优先使用 wiki_token) data_source: type: "feishu" feishu: app_id: "cli_xxxxxxxx" app_secret: "xxxxxxxx" wiki_token: "M1gCwbVK3irAXHknLPOcrMMNnGb" sheet_id: "UlHKiE" ``` > **提示**:`wiki_token` 和 `spreadsheet_token` 二选一。同时填写时优先使用 `wiki_token`(代码会自动通过 Wiki API 解析为实际的文档 token)。 > **子表 ID 查询**:如果表格有多个子表(Sheet1、Sheet2…),可以在 URL 中切换子表查看 `?sheet=` 后面的值,或使用飞书 API 的 [获取表格元数据](https://open.feishu.cn/document/server-docs/docs/sheets-v3/spreadsheet/get-spreadsheet) 接口查询所有子表信息。 --- ### 3. 钉钉 (DingTalk) > **重要**:钉钉 Open API **仅支持企业空间**的文档,不支持个人空间(`utm_scene=person_space`)的文档。如文档在个人空间,请先移动到企业空间或导出为 Excel。 #### 3.1 创建应用并获取凭证 1. 打开 [钉钉开放平台](https://open.dingtalk.com/) 2. 进入 **应用开发** → 创建应用(选择**企业内部应用**) 3. 在应用详情页 → **凭证与基础信息** 获取 **AppKey** 和 **AppSecret** #### 3.2 开启权限 应用详情 → **权限管理**,搜索并开启以下权限后**发布新版本**: | 权限 | 用途 | |---|---| | `Document.Workbook.Read` | 读取钉钉表格(必需) | | `Contact.User.Read` | 查询通讯录用户信息(用于自动获取 operatorId) | | 企业员工手机号信息 | 如果希望通过手机号自动查用户(可选) | #### 3.3 获取配置信息 **对于 `/spreadsheetv2/` 格式的 URL**(企业空间文档): ``` https://alidocs.dingtalk.com/spreadsheetv2/WAX4rKeJIGg5jAbY/edit?docKey=ybEnB5jAeV2vMlP1&dentryKey=WAX4rKeJIGg5jAbY&type=s ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ 路径 ID(不是 workbook_id) docKey 才是 workbook_id ``` | 配置项 | 取自 | 示例值 | |---|---|---| | `workbook_id` | `?docKey=` 参数的值 | `ybEnB5jAeV2vMlP1` | | `sheet_name` | 打开文档,看底部工作表标签页名称 | `Sheet1` | > **注意**:`/spreadsheetv2/` 路径中的 ID **不是** workbook_id,URL 中 `docKey` 参数的值才是! #### 3.4 operator_id / user_id / mobile 三选一 钉钉表格 API 要求 `operatorId`(即操作人的 unionId)。代码支持三种方式自动获取,优先级从高到低: | 配置项 | 说明 | 获取方式 | |---|---|---| | `operator_id` | unionId(最高优先级)| 钉钉管理后台 → 通讯录 → 成员详情 | | `user_id` | userId | 代码自动调 API 查 unionId | | `mobile` | 手机号 | 代码自动:手机号 → userId → unionId | #### 3.5 配置示例 ```yaml data_source: type: "dingtalk" dingtalk: app_key: "dingxxxxxxxx" app_secret: "xxxxxxxx" workbook_id: "ybEnB5jAeV2vMlP1" # URL 中 docKey 的值 sheet_name: "Sheet1" # 以下三选一 operator_id: "" # unionId(已知时直接填) user_id: "" # userId(会自动查 unionId) mobile: "" # 手机号(会自动查 userId → unionId) ``` #### 3.6 常见问题 | 错误 | 原因 | 解决 | |---|---|---| | `InvalidVersion` | API 路径错误 | 路径应为 `/v1.0/doc/workbooks/`(注意 `doc` 前缀) | | `uuid not exist` | workbook_id 用了路径中的 ID | 改用 URL 中 `docKey` 参数的值 | | `forbidden.acrossOrg` | 文档在个人空间 | 文档移至企业空间或导出 Excel | | `operator has no permission` | 用户无文档权限 | 将用户添加为文档协作者 | | `MissingoperatorId` | 未配置 operatorId | 填 `user_id` 或 `mobile`,代码自动查 | --- ### 4. 企业微信 (WeCom) ⚠ 暂不可用 > **当前状态**:企微自建应用调用文档 API 需要满足以下前置条件,目前暂无法配置,代码已注释。满足条件后取消注释即可启用。 #### 前置阻塞条件 企业微信自建应用调用 API 需完成以下配置(缺一不可): | 序号 | 要求 | 阻塞原因 | |---|---|---| | 1 | **设置可信域名** | 需要拥有一个已备案的域名 | | 2 | **设置接收消息服务器 URL** | 需要部署一个回调服务(公网 HTTPS 可达) | | 3 | **配置企业可信 IP** | 需要固定公网 IP | 企微管理后台逻辑:**配置企业可信 IP 之前,必须先完成可信域名或接收消息服务器 URL 的配置**。个人开发者 / 本地开发环境通常不具备固定公网 IP 和已备案域名,因此企微表格 API 暂不可用。 #### 解决方案 满足上述条件后,按以下步骤启用: 1. 取消 `generator/data_sources/__init__.py` 中 `wecom` 相关代码的注释 2. 取消 `generator/config.yaml` 中 `wecom` 配置段的注释 3. 按下方 URL 格式填写配置 #### URL 格式参考 支持两种表格类型:**普通表格**(`/sheet/`)和 **智能表格**(`/smartsheet/`)。 **普通表格**: ``` https://doc.weixin.qq.com/sheet/e3_Ae4AAAYpANwCNygecbXrLTvaaNNXl?tab=BB08J2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ doc_id sheet_id ``` **智能表格**: ``` https://doc.weixin.qq.com/smartsheet/s3_xxx?sheet=yyy ^^^^^^ ^^^ doc_id sheet_id ``` #### 配置示例(取消注释后填入) ```yaml # 普通表格 data_source: type: "wecom" wecom: corp_id: "wwxxxxxxxxxxxx" corp_secret: "xxxxxxxx" doc_id: "e3_Ae4AAAYpANwCNygecbXrLTvaaNNXl" sheet_id: "BB08J2" doc_type: "sheet" ``` --- ## 生成的测试脚本注释 每个生成的测试文件顶部自动包含注释块: ```python """ 作者: lls0229 生成时间: 2026-06-10 14:12:00 测试模块: login 数据源: feishu """ ``` 作者信息在 `config.yaml` 中配置: ```yaml author: "lls0229" ``` --- ## 环境要求 - Python 3.9+ - Chrome 浏览器 + ChromeDriver(需在 PATH 中) ## 运行测试 ```bash # 运行全部单元测试(无需网络 / API Key / 浏览器) pytest test/ -v # 单独运行某个测试模块 pytest test/test_parser.py -v pytest test/test_action_mapping.py -v pytest test/test_config_validator.py -v ``` > 单元测试覆盖纯逻辑模块(动作映射、用例解析、富文本提取、列名映射、配置校验),无外部依赖。 ## 安装 ```bash # 安装依赖(含 GUI 所需的 tkinter,Windows Python 默认包含) pip install -e . # 或者手动安装 pip install pandas openpyxl selenium jinja2 openai pyyaml tenacity pytest requests ``` 安装后可通过命令行直接启动: ```bash auto-script-gen # 命令行模式 auto-script-gui # 🆕 GUI 桌面模式 ``` > `auto-script-gui` 在 Linux 下需额外安装 `python3-tk`:`sudo apt install python3-tk`(Ubuntu/Debian)或 `sudo yum install python3-tkinter`(RHEL/CentOS)。 ## 配置 DeepSeek API Key ```bash # Windows (CMD) set DEEPSEEK_API_KEY=your-deepseek-api-key # Windows (PowerShell) $env:DEEPSEEK_API_KEY="your-deepseek-api-key" # Linux / macOS export DEEPSEEK_API_KEY="your-deepseek-api-key" ``` ## 运行 ```bash # ── 命令行模式 ── # 1. 编辑 generator/config.yaml,选择数据源并填写凭证 # 2. 生成测试脚本 python run.py # 3. 执行生成的测试(按数据源筛选) pytest generated_tests/feishu/ -v pytest generated_tests/excel/ -v # 4. 执行所有测试 pytest generated_tests/ -v # ── 🆕 GUI 桌面模式 ── auto-script-gui # 通过 entry point python -m gui # 通过模块 python gui/app.py # 直接运行 ``` ### CLI 参数 ```bash python run.py --help # 查看帮助 python run.py --config prod.yaml # 指定配置文件 python run.py --source excel,feishu # 只处理指定数据源(逗号分隔) python run.py --output-dir ./my_tests # 自定义输出目录 python run.py --dry-run # 试运行:读取 + 解析 + 预览,不写文件 python run.py --validate # 仅校验:只测试数据源连接正常与否 python run.py --review # AI 审查:生成脚本前审查用例完整性 ``` > 不带参数时行为与之前完全一致(使用默认 `generator/config.yaml`)。 ### AI 审查模式 `--review` 参数在生成测试脚本前,由 AI 自动审查全部用例并输出报告: - **评分**(0-100):综合评估用例覆盖质量 - **问题分级**:ERROR(必须修复)/ WARNING(建议修复)/ TIP(锦上添花) - **检查维度**:断言缺失、边界覆盖不足、元素名不一致、预期结果可疑、安全测试缺失 ```bash python run.py --review --dry-run # 仅审查不生成(建议先用这个预览) python run.py --review # 审查后正式生成 ``` > 需要 `DEEPSEEK_API_KEY` 环境变量(或 `config.yaml` 中的 `ai_config.api_key`)。 ### 配置校验 启动时自动校验 `config.yaml`: - **ERROR**(阻止运行):缺少必填字段、不支持的数据源类型、token/凭证缺失 - **WARN**(提示建议):字段拼写错误(如 `filepath` → 建议 `file_path`)、未配置 AI 等 拼写错误会给出最接近的正确字段名,方便快速定位。 ## CI/CD(Gitee Go) 项目包含 Gitee Go 流水线配置 `.workflow/ci-pipeline.yml`,每次 push 自动运行单元测试和试运行。 ### 启用步骤 1. 打开仓库 → 顶部 **"服务"** → **"Gitee Go"** 2. 新建流水线 → 选择已有的 `.workflow/ci-pipeline.yml` ### 流水线内容 | 步骤 | 说明 | |------|------| | pip install | 安装项目依赖 | | 创建测试配置 | 从 `config.example.yaml` 复制(`config.yaml` 含凭证不入库) | | pytest | 运行 94 个单元测试(跳过需 API Key 的 `test_ai_mapper.py`) | | --dry-run | 试运行:读取用例 + 解析 + 预览 | | --validate | 校验数据源连接 | ### Gitee Go YAML 编写注意事项 Gitee Go 的格式与 GitHub Actions / GitLab CI 不同,以下是踩坑记录: - **配置文件位置**:必须放在 `.workflow/` 目录下,不能放在仓库根目录 - **stage 是扁平结构**:`stages` 下直接是 `- name: xxx`,**不需要** `- stage:` 嵌套包裹 - **步骤类型**:Python 单元测试用 `ut@python`,**不是** `build@python` - **stage 必填字段**:`strategy: naturally` 和 `trigger: auto` 缺一不可 - **displayName 限制**:不支持 `+` 等特殊字符,只允许中英文和数字 - **pip 缓存**:Gitee Go 各 stage 之间不共享环境,每个 stage 需独立 `pip install` > 如果通过图形视图创建了流水线,要先删除再用代码视图导入,避免图形视图覆盖 YAML 文件。 ## 测试用例表格格式 无论使用哪种数据源,表格列结构需保持一致(支持中英文列名): | 列名(英文) | 列名(中文) | 说明 | 示例 | |---|---|---|---| | `test_id` | 用例编号 | 唯一标识 | `Login_front_001` | | `action` | 动作/操作 | 中文操作描述 | `打开网址`、`输入文本`、`点击按钮` | | `element` | 元素名 | 页面对象属性名 | `username_input` | | `value` | 输入值 | 输入文本内容或选项 | `admin` | | `expected` | 预期结果 | 断言文本或 URL | `密码错误` | | `page_object` | 页面对象 | 页面类名 | `Login` | | `nl_scenario` | 场景描述 | AI 展开的自然语言描述(可选) | `用admin/123456登录,应跳转首页` | > **两种编写方式可混用**:`nl_scenario` 有值时 AI 自动拆解该行为多步骤(忽略同行 action/element/value/expected),`nl_scenario` 为空时走传统逐行编写。 ### 支持的动作 | 中文描述 | 关键字函数 | 说明 | |---|---|---| | 打开网址 | `open_page` | 导航到指定 URL | | 页面导航 / 导航到 | `navigate` | 同 `open_page` | | 输入文本 | `input_text` | 等待元素可见后清空并输入 | | 点击按钮 / 点击元素 | `click_button` | 等待可点击后 JS 点击 | | 选择下拉 / 下拉选择 | `select_option` | 按可见文本选择下拉选项 | | 等待元素可见 / 等待元素 | `wait_visible` | 等待元素出现在 DOM 且可见 | | 鼠标悬停 / 悬停 | `hover` | ActionChains 悬停 | | 滚动到元素 / 滚动到 | `scroll_to` | JS scrollIntoView | | 断言文本相等 | `assert_text_equal` | 断言元素文本等于预期值 | | 断言页面包含 | `assert_url_contains` | 断言 URL 包含预期子串 | | 断言元素可见 / 验证元素可见 | `assert_element_visible` | 断言元素在页面上可见 | > 规则匹配不到的动作会自动通过 AI(DeepSeek)解析,支持更灵活的自然语言描述。 ### 自然语言场景展开(AI) 在 `nl_scenario` 列中可以用一句话描述整个测试场景,AI 自动拆解为完整的操作步骤。适合快速编写常见场景,减少逐行填写的工作量。 **示例**: ``` nl_scenario: 用 admin / 123456 登录 https://xxx/login,应该跳转到用户首页 test_id: NL_Login_001 ``` AI 自动展开为: ``` open_page → https://xxx/login input_text → username_input = admin input_text → password_input = 123456 click_button → login_button assert_url_contains → /index.html ``` **前提条件**: - 已设置 `DEEPSEEK_API_KEY` 环境变量(AI 展开依赖 DeepSeek) - 表格中包含 `nl_scenario` 列(支持列名:`nl_scenario` / `场景描述` / `自然语言描述` / `nl描述`) - AI 会自动收集同批次中定义的页面对象和元素名,使拆解结果更准确 **注意事项**: - 描述中包含 URL 时 AI 自动提取并在第一步 `open_page` - `assert_text_equal` / `assert_element_visible` 内部已含等待逻辑,AI 不会在它们前面插入多余的 `wait_visible` - "账号xxx"、"密码xxx" 等带前缀的描述,AI 会自动剥离前缀只保留纯值 - AI 调用失败时该行静默跳过,不影响传统行解析 --- ## 更新日志 ### v0.3.1 (2026-06-28) — AI 防幻觉 **🔒 一致性锁(AI Cache)** - 新增 `generator/ai_cache.py`:SHA256 哈希 → JSON 持久化缓存 - 同一输入永远返回同一输出,不再重复调 API(首次结果写入 `.ai_cache.json`) - 覆盖全部 AI 调用场景:动作解析 / 场景展开 / 用例审查 / 元素定位 **✅ 结果校验** - XPath 存在性 + 可见性 + 标签类型三重验证(`verify_locator()`) - `expand_scenario`:过滤非法元素名(注入攻击防护)、参数长度上限 - `review_test_suite`:score 0-100 边界修正、severity 值修正 **📋 审计日志** - JSONL 格式记录每次 AI 调用:时间/输入/输出/耗时/来源(cache 或 api) - 自动轮转保留最新 1000 条,写入 `generator/ai_audit.log` ### v0.3.0 (2026-06-28) — AI 元素定位 **🤖 AI 元素定位** - **无需 Page Object 即可运行**:`element` 列为空时,AI 自动分析页面 DOM 定位元素 - 新增 `generator/ai_locator.py`:JS 注入提取 DOM 摘要 → DeepSeek 匹配元素 → 返回 XPath - URL 级 DOM 缓存(5 分钟),同页面多步骤复用,减少 API 调用 - 7 个关键字函数支持 AI 兜底:`input_text` / `click_button` / `select_option` / `wait_visible` / `hover` / `scroll_to` / `assert_element_visible` / `assert_text_equal` - 向后兼容:有 `element` 值时走 Page Object;无值时走 AI 定位 **📝 Excel 用法变化** - 旧:`element=username_input`(必须填) - 新:`element=留空` → AI 根据 `action` + `value` 自动匹配元素 ### v0.2.0 (2026-06-18) — Windows GUI 版本 **🆕 新增** - **Windows 桌面 GUI**(`gui/` 模块,基于 tkinter):可视化配置、获取用例、AI 审查、生成脚本 - **Excel 文件夹自动扫描**:支持 `folder_path` 配置,自动扫描目录下所有合法测试用例文件 - **数据源多选/筛选**:GUI 中可按文件粒度勾选要处理的用例子集 - **AI 测试用例完整性审查**:`--review` 参数(CLI)和 GUI Tab,AI 自动审查并打分 - **NL 场景展开优化**:自动剥离"账号/密码"前缀、去冗余 `wait_visible` - **生成脚本源文件追溯**:模板中记录来源文件信息 - **`setup.py` entry points**:`auto-script-gen`(CLI)和 `auto-script-gui`(GUI) **🔒 安全增强** - Excel 文件夹扫描增加路径遍历防护(`os.path.realpath` + 边界检查) - AI 参数验证:防止超长输入 DoS、非法元素名注入 - 自然语言输入长度限制(500 字符) - 输出目录安全验证:禁止系统目录写入 - 配置调试日志脱敏(密钥/Token/手机号等) **🧵 线程安全** - AI 客户端初始化加线程锁(`threading.Lock`),防止多线程竞态 - GUI 所有耗时操作在后台线程执行,UI 通过 Queue 轮询更新 - 解析器支持外部取消信号(`cancel_event`),停止按钮即时响应 **🔧 改进** - 统一 LLM 调用实现(`_call_llm_internal`),消除 `ai_mapper.py` 中 ~50 行重复代码 - `parser.py` 增强异常处理:区分 `FileNotFoundError` / `UnicodeDecodeError` / `IOError` - `config_validator.py` 支持 `folder_path` 字段校验 - 配置支持旧版 `file_path` → 新版 `folder_path` 自动迁移提示 - `generator/__init__.py` 添加版本号(`__version__ = "0.2.0"`) **📝 文档** - 补充 `docs/AI_INTEGRATION_PLAN.md`(6 个 AI 扩展方向规划) - 代码审查报告 + 修复日志(`docs/CODE_REVIEW_REPORT_2026-06-18.md`、`docs/FIX_LOG_2026-06-18.md`)