提交 955f1583 authored 作者: 陈泽健's avatar 陈泽健

feat(DocumentAutoOptimizationCalibration): 扩展文档国际化功能支持多语种翻译

- 新增多语言支持包括韩文、法文、日语、俄语、西班牙语、阿拉伯语
- 添加 --to-lang 命令行参数用于指定目标翻译语言
- 集成 bing 翻译引擎作为默认引擎以支持国内网络环境
- 更新文档国际化转换功能支持多种目标语言格式
- 修改输出文件命名规则包含目标语言标识
- 完善 README 文档中的多语言翻译使用说明
- 重构翻译函数支持动态目标语言参数传递
- 优化 CLI 参数配置支持语言选择功能
上级 4c08eec7
...@@ -125,7 +125,8 @@ ...@@ -125,7 +125,8 @@
"mcp__chrome-devtools__fill_form", "mcp__chrome-devtools__fill_form",
"Bash(grep:*)", "Bash(grep:*)",
"Bash(mkdir:*)", "Bash(mkdir:*)",
"Bash(cd \"E:/GithubData/ubains-module-test/AuxiliaryTool/DocumentAutoOptimizationCalibration\" && pip install translators -q)" "Bash(cd \"E:/GithubData/ubains-module-test/AuxiliaryTool/DocumentAutoOptimizationCalibration\" && pip install translators -q)",
"Bash(ls -la \"E:\\\\GithubData\\\\ubains-module-test\\\\Docs\\\\PRD\" 2>&1 || dir \"E:\\\\GithubData\\\\ubains-module-test\\\\Docs\\\\PRD\" 2>&1)"
] ]
} }
} }
...@@ -12,11 +12,12 @@ ...@@ -12,11 +12,12 @@
- **表格格式统一**:统一表格字体、字号、对齐方式、边框样式 - **表格格式统一**:统一表格字体、字号、对齐方式、边框样式
- **页眉页脚设置**:自动添加页眉(文件名)和页脚(页码格式) - **页眉页脚设置**:自动添加页眉(文件名)和页脚(页码格式)
#### 国际化转换功能(新增) #### 国际化转换功能
- **文档翻译**:将中文文档自动翻译为英文 - **多语言翻译**:支持将中文翻译为韩文、法文、日语、俄语、西班牙语、阿拉伯语、英文
- **保留格式**:翻译过程中保留原有排版和样式 - **保留格式**:翻译过程中保留原有排版和样式
- **多引擎支持**:支持Google、百度、必应翻译引擎 - **多引擎支持**:支持Google、百度、必应翻译引擎
- **批量翻译**:支持段落、表格批量翻译 - **批量翻译**:支持段落、表格、页眉页脚、文本框批量翻译
- **目录更新**:自动翻译目录内容
### 设计原则 ### 设计原则
...@@ -144,56 +145,124 @@ python run.py --input "testcases/文档.docx" --log-level DEBUG ...@@ -144,56 +145,124 @@ python run.py --input "testcases/文档.docx" --log-level DEBUG
## 二、文档国际化转换 ## 二、文档国际化转换
### 功能说明 ### 功能说明
将中文Word文档自动翻译为英文,保留原有格式和样式。 将中文Word文档自动翻译为多种语言,保留原有格式和样式。
### 支持的目标语言
| 语言 | 代码 | 命令示例 |
|------|------|----------|
| 韩文 | ko | `--to-lang ko` |
| 法文 | fr | `--to-lang fr` |
| 日语 | ja | `--to-lang ja` |
| 俄语 | ru | `--to-lang ru` |
| 西班牙语 | es | `--to-lang es` |
| 阿拉伯语 | ar | `--to-lang ar` |
| 英文 | en | 默认 |
### 翻译模式命令 ### 翻译模式命令
#### 1. 基础翻译(使用默认引擎 #### 1. 基础翻译(默认翻译为英文
```bash ```bash
python run.py --translate --input 文档.docx python run.py --translate --input 文档.docx
``` ```
输出:`reports/文档_英文版.docx` 输出:`reports/文档_英文版.docx`
#### 2. 使用必应翻译引擎(推荐) #### 2. 翻译为韩文
```bash
python run.py --translate --to-lang ko --input 文档.docx
```
输出:`reports/文档_韩文版.docx`
#### 3. 翻译为法文
```bash
python run.py --translate --to-lang fr --input 文档.docx
```
输出:`reports/文档_法文版.docx`
#### 4. 翻译为日语
```bash ```bash
python run.py --translate --translate-engine bing --input 文档.docx python run.py --translate --to-lang ja --input 文档.docx
``` ```
输出:`reports/文档_日语版.docx`
#### 3. 使用百度翻译引擎 #### 5. 翻译为俄语
```bash ```bash
python run.py --translate --translate-engine baidu --input 文档.docx python run.py --translate --to-lang ru --input 文档.docx
``` ```
输出:`reports/文档_俄语版.docx`
#### 4. 使用谷歌翻译引擎(大陆可能不可用) #### 6. 翻译为西班牙语
```bash ```bash
python run.py --translate --translate-engine google --input 文档.docx python run.py --translate --to-lang es --input 文档.docx
``` ```
输出:`reports/文档_西班牙语版.docx`
#### 5. 翻译并指定输出路径 #### 7. 翻译为阿拉伯语
```bash ```bash
python run.py --translate --input "testcases/文档.docx" --output "reports/英文版/English_Version.docx" python run.py --translate --to-lang ar --input 文档.docx
```
输出:`reports/文档_阿拉伯语版.docx`
#### 8. 翻译为英文(默认)
```bash
python run.py --translate --input 文档.docx
```
输出:`reports/文档_英文版.docx`
#### 9. 指定翻译引擎
```bash
# 使用百度引擎
python run.py --translate --translate-engine baidu --to-lang fr --input 文档.docx
# 使用谷歌引擎(需要科学上网)
python run.py --translate --translate-engine google --to-lang ja --input 文档.docx
```
#### 10. 翻译并指定输出路径
```bash
python run.py --translate --to-lang ja --input "testcases/文档.docx" --output "reports/日语版.docx"
``` ```
### 国际化转换示例 ### 国际化转换示例
```bash ```bash
# 示例1:翻译为英文(使用必应引擎) # 示例1:翻译为韩文(默认使用bing引擎)
python run.py --translate --translate-engine bing --input "testcases/文档.docx" python run.py --translate --to-lang ko --input "testcases/文档.docx"
# 示例2:翻译为法文
python run.py --translate --to-lang fr --input "testcases/文档.docx"
# 示例2:翻译大型文档 # 示例3:翻译为日语
python run.py --translate --translate-engine baidu --input "testcases/新统一平台自动化部署操作指导.docx" python run.py --translate --to-lang ja --input "testcases/新统一平台自动化部署操作指导.docx"
# 示例3:查看翻译详细日志 # 示例4:翻译为俄语
python run.py --translate --translate-engine bing --input "testcases/文档.docx" --log-level DEBUG python run.py --translate --to-lang ru --input "testcases/文档.docx"
# 示例5:翻译为西班牙语
python run.py --translate --to-lang es --input "testcases/文档.docx"
# 示例6:翻译为阿拉伯语
python run.py --translate --to-lang ar --input "testcases/文档.docx"
# 示例7:翻译为英文(默认语言,可省略--to-lang参数)
python run.py --translate --input "testcases/文档.docx"
# 示例8:使用百度引擎翻译为韩文
python run.py --translate --translate-engine baidu --to-lang ko --input "testcases/文档.docx"
# 示例9:查看翻译详细日志
python run.py --translate --to-lang es --input "testcases/文档.docx" --log-level DEBUG
``` ```
### 翻译引擎对比 ### 翻译引擎对比
| 引擎 | 速度 | 质量 | 国内可用性 | 推荐场景 | | 引擎 | 速度 | 质量 | 国内可用性 | 默认 | 推荐场景 |
|------|------|------|-----------|---------| |------|------|------|-----------|------|---------|
| bing | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ 可用 | 技术文档翻译 | | bing | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ 可用 | ✅ 是 | 技术文档翻译(推荐) |
| baidu | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 可用 | 快速翻译 | | baidu | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 可用 | - | 快速翻译 |
| google | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ❌ 不可用 | 高质量翻译(需科学上网) | | google | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ❌ 不可用 | - | 高质量翻译(需科学上网) |
> **注意**:默认使用 bing 引擎,确保在国内网络环境下可用。如需使用其他引擎,请通过 `--translate-engine` 参数指定。
--- ---
...@@ -209,6 +278,7 @@ python run.py --translate --translate-engine bing --input "testcases/文档.docx ...@@ -209,6 +278,7 @@ python run.py --translate --translate-engine bing --input "testcases/文档.docx
| `--list` | `-l` | 仅列出可用文档 | `--list` | | `--list` | `-l` | 仅列出可用文档 | `--list` |
| `--translate` | `-t` | 启用翻译模式 | `--translate` | | `--translate` | `-t` | 启用翻译模式 | `--translate` |
| `--translate-engine` | - | 翻译引擎(google/baidu/bing) | `--translate-engine bing` | | `--translate-engine` | - | 翻译引擎(google/baidu/bing) | `--translate-engine bing` |
| `--to-lang` | - | 目标语言(ko/fr/ja/ru/es/ar/en) | `--to-lang fr` |
| `--help` | `-h` | 显示帮助信息 | `--help` | | `--help` | `-h` | 显示帮助信息 | `--help` |
--- ---
...@@ -324,6 +394,8 @@ python run.py --input "文档.docx" --footer-start-section 3 ...@@ -324,6 +394,8 @@ python run.py --input "文档.docx" --footer-start-section 3
| 版本 | 日期 | 说明 | | 版本 | 日期 | 说明 |
|------|------|------| |------|------|------|
| v1.3.1 | 2026-03-11 | 修复:将默认翻译引擎从google改为bing,支持国内网络环境 |
| v1.3.0 | 2026-03-11 | 新增多语言翻译支持(韩文、法文、日语、俄语、西班牙语、阿拉伯语、英文),新增--to-lang参数 |
| v1.2.0 | 2026-03-10 | 优化多节文档页眉页脚处理,新增--footer-start-section参数 | | v1.2.0 | 2026-03-10 | 优化多节文档页眉页脚处理,新增--footer-start-section参数 |
| v1.1.0 | 2026-03-10 | 新增文档国际化转换功能,支持中英翻译 | | v1.1.0 | 2026-03-10 | 新增文档国际化转换功能,支持中英翻译 |
| v1.0.0 | 2025-03-10 | 初始版本,支持基础格式优化 | | v1.0.0 | 2025-03-10 | 初始版本,支持基础格式优化 |
...@@ -339,6 +411,7 @@ python run.py --input "文档.docx" --footer-start-section 3 ...@@ -339,6 +411,7 @@ python run.py --input "文档.docx" --footer-start-section 3
- [ ] 支持自动目录更新 - [ ] 支持自动目录更新
### 国际化翻译 ### 国际化翻译
- [x] 支持多种目标语言(韩文、法文、日语、俄语、西班牙语、阿拉伯语、英文)
- [ ] 支持更多翻译引擎(DeepL免费版等) - [ ] 支持更多翻译引擎(DeepL免费版等)
- [ ] 支持自定义术语词典 - [ ] 支持自定义术语词典
- [ ] 支持翻译记忆功能 - [ ] 支持翻译记忆功能
......
...@@ -17,6 +17,10 @@ from src.config import ( ...@@ -17,6 +17,10 @@ from src.config import (
LOG_DATE_FORMAT, LOG_DATE_FORMAT,
DEFAULT_TRANSLATE_ENGINE, DEFAULT_TRANSLATE_ENGINE,
SUPPORTED_ENGINES, SUPPORTED_ENGINES,
LANGUAGE_CODES,
LANGUAGE_NAMES,
SUPPORTED_TARGET_LANGUAGES,
TARGET_LANGUAGE,
) )
from src.optimizer import optimize_document from src.optimizer import optimize_document
from src.internationalizer import internationalize_document from src.internationalizer import internationalize_document
...@@ -125,6 +129,8 @@ def parse_command_line() -> argparse.Namespace: ...@@ -125,6 +129,8 @@ def parse_command_line() -> argparse.Namespace:
示例用法(国际化翻译): 示例用法(国际化翻译):
python run.py --translate --input 文档.docx # 翻译为英文 python run.py --translate --input 文档.docx # 翻译为英文
python run.py --translate --to-lang ko --input ... # 翻译为韩文
python run.py --translate --to-lang fr --input ... # 翻译为法文
python run.py --translate --engine baidu --input ... # 指定翻译引擎 python run.py --translate --engine baidu --input ... # 指定翻译引擎
注意: 注意:
...@@ -199,6 +205,16 @@ def parse_command_line() -> argparse.Namespace: ...@@ -199,6 +205,16 @@ def parse_command_line() -> argparse.Namespace:
help=f'翻译引擎(默认为{DEFAULT_TRANSLATE_ENGINE})' help=f'翻译引擎(默认为{DEFAULT_TRANSLATE_ENGINE})'
) )
parser.add_argument(
'--to-lang',
type=str,
dest='to_lang',
default=TARGET_LANGUAGE,
choices=SUPPORTED_TARGET_LANGUAGES,
metavar='LANG',
help=f'目标语言代码: {", ".join([f"{k}({v})" for k, v in LANGUAGE_CODES.items()])} (默认: {TARGET_LANGUAGE})'
)
return parser.parse_args() return parser.parse_args()
...@@ -252,13 +268,15 @@ def run_cli(args: argparse.Namespace) -> int: ...@@ -252,13 +268,15 @@ def run_cli(args: argparse.Namespace) -> int:
if args.translate_mode: if args.translate_mode:
# ==================== 翻译模式 ==================== # ==================== 翻译模式 ====================
print(f"\n使用翻译引擎: {args.translate_engine}") print(f"\n使用翻译引擎: {args.translate_engine}")
print(f"目标语言: {LANGUAGE_NAMES.get(args.to_lang, args.to_lang)}")
print("翻译过程中,请耐心等待...") print("翻译过程中,请耐心等待...")
try: try:
result_path = internationalize_document( result_path = internationalize_document(
input_path=input_path, input_path=input_path,
output_path=output_path, output_path=output_path,
engine=args.translate_engine engine=args.translate_engine,
to_lang=args.to_lang
) )
print("\n" + "=" * 60) print("\n" + "=" * 60)
......
...@@ -109,15 +109,35 @@ LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" ...@@ -109,15 +109,35 @@ LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
# ================================ # ================================
# 翻译配置 # 翻译配置
# ================================ # ================================
# 默认翻译引擎 # 默认翻译引擎(使用bing以支持国内网络环境)
DEFAULT_TRANSLATE_ENGINE = "google" # google, baidu, bing DEFAULT_TRANSLATE_ENGINE = "bing" # google, baidu, bing
# 支持的翻译引擎 # 支持的翻译引擎
SUPPORTED_ENGINES = ["google", "baidu", "bing"] SUPPORTED_ENGINES = ["google", "baidu", "bing"]
# 源语言和目标语言 # 源语言和目标语言
SOURCE_LANGUAGE = "zh" # 中文 SOURCE_LANGUAGE = "zh" # 中文
TARGET_LANGUAGE = "en" # 英文 TARGET_LANGUAGE = "en" # 英文(默认)
# ================================
# 多语言支持配置
# ================================
# 支持的目标语言代码映射
LANGUAGE_CODES = {
"韩文": "ko",
"法文": "fr",
"日语": "ja",
"俄语": "ru",
"西班牙语": "es",
"阿拉伯语": "ar",
"英文": "en" # 保留原有
}
# 语言代码到语言名称的反向映射
LANGUAGE_NAMES = {v: k for k, v in LANGUAGE_CODES.items()}
# 支持的目标语言列表(用于CLI验证)
SUPPORTED_TARGET_LANGUAGES = list(LANGUAGE_CODES.values())
# 翻译延迟(秒),避免频率限制 # 翻译延迟(秒),避免频率限制
TRANSLATE_DELAY = 0.5 TRANSLATE_DELAY = 0.5
...@@ -137,7 +157,7 @@ TRANSLATE_TIMEOUT = 10 ...@@ -137,7 +157,7 @@ TRANSLATE_TIMEOUT = 10
# ================================ # ================================
# 版本信息 # 版本信息
# ================================ # ================================
__version__ = "1.1.0" __version__ = "1.3.1"
__author__ = "Document Optimizer" __author__ = "Document Optimizer"
__description__ = "文档自动优化校准工具" __description__ = "文档自动优化校准工具"
......
...@@ -21,6 +21,7 @@ from src.config import ( ...@@ -21,6 +21,7 @@ from src.config import (
REPORTS_DIR, REPORTS_DIR,
SOURCE_LANGUAGE, SOURCE_LANGUAGE,
TARGET_LANGUAGE, TARGET_LANGUAGE,
LANGUAGE_NAMES,
) )
from src.translator import ( from src.translator import (
translate_text, translate_text,
...@@ -62,13 +63,14 @@ def _is_heading_paragraph(paragraph) -> Optional[int]: ...@@ -62,13 +63,14 @@ def _is_heading_paragraph(paragraph) -> Optional[int]:
return None return None
def _translate_paragraph(paragraph, engine: str) -> bool: def _translate_paragraph(paragraph, engine: str, to_lang: str = TARGET_LANGUAGE) -> bool:
""" """
翻译段落内容 翻译段落内容
Args: Args:
paragraph: 段落对象 paragraph: 段落对象
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码
Returns: Returns:
是否成功翻译 是否成功翻译
...@@ -93,7 +95,7 @@ def _translate_paragraph(paragraph, engine: str) -> bool: ...@@ -93,7 +95,7 @@ def _translate_paragraph(paragraph, engine: str) -> bool:
paragraph.text, paragraph.text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != paragraph.text: if translated_text and translated_text != paragraph.text:
...@@ -125,13 +127,14 @@ def _translate_paragraph(paragraph, engine: str) -> bool: ...@@ -125,13 +127,14 @@ def _translate_paragraph(paragraph, engine: str) -> bool:
return False return False
def _translate_table_cell(cell, engine: str) -> bool: def _translate_table_cell(cell, engine: str, to_lang: str = TARGET_LANGUAGE) -> bool:
""" """
翻译表格单元格内容 翻译表格单元格内容
Args: Args:
cell: 单元格对象 cell: 单元格对象
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码
Returns: Returns:
是否成功翻译 是否成功翻译
...@@ -149,7 +152,7 @@ def _translate_table_cell(cell, engine: str) -> bool: ...@@ -149,7 +152,7 @@ def _translate_table_cell(cell, engine: str) -> bool:
cell.text, cell.text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != cell.text: if translated_text and translated_text != cell.text:
...@@ -173,13 +176,14 @@ def _translate_table_cell(cell, engine: str) -> bool: ...@@ -173,13 +176,14 @@ def _translate_table_cell(cell, engine: str) -> bool:
return False return False
def _translate_table(table, engine: str) -> int: def _translate_table(table, engine: str, to_lang: str = TARGET_LANGUAGE) -> int:
""" """
翻译表格内容 翻译表格内容
Args: Args:
table: 表格对象 table: 表格对象
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码
Returns: Returns:
成功翻译的单元格数量 成功翻译的单元格数量
...@@ -188,7 +192,7 @@ def _translate_table(table, engine: str) -> int: ...@@ -188,7 +192,7 @@ def _translate_table(table, engine: str) -> int:
for row in table.rows: for row in table.rows:
for cell in row.cells: for cell in row.cells:
if _translate_table_cell(cell, engine): if _translate_table_cell(cell, engine, to_lang):
translated_count += 1 translated_count += 1
logger.debug("表格翻译完成: %d 个单元格", translated_count) logger.debug("表格翻译完成: %d 个单元格", translated_count)
...@@ -197,7 +201,8 @@ def _translate_table(table, engine: str) -> int: ...@@ -197,7 +201,8 @@ def _translate_table(table, engine: str) -> int:
def _translate_header_footer_part(header_footer, engine: str, def _translate_header_footer_part(header_footer, engine: str,
translated_filename: str = None, translated_filename: str = None,
original_filename: str = None) -> int: original_filename: str = None,
to_lang: str = TARGET_LANGUAGE) -> int:
""" """
翻译页眉或页脚中的段落、表格和文本框内容 翻译页眉或页脚中的段落、表格和文本框内容
...@@ -206,6 +211,7 @@ def _translate_header_footer_part(header_footer, engine: str, ...@@ -206,6 +211,7 @@ def _translate_header_footer_part(header_footer, engine: str,
engine: 翻译引擎 engine: 翻译引擎
translated_filename: 翻译后的文件名(用于页眉) translated_filename: 翻译后的文件名(用于页眉)
original_filename: 原文件名(用于判断是否需要替换) original_filename: 原文件名(用于判断是否需要替换)
to_lang: 目标语言代码
Returns: Returns:
成功翻译的内容数量(段落+表格单元格+文本框) 成功翻译的内容数量(段落+表格单元格+文本框)
...@@ -270,7 +276,7 @@ def _translate_header_footer_part(header_footer, engine: str, ...@@ -270,7 +276,7 @@ def _translate_header_footer_part(header_footer, engine: str,
original_text, original_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != original_text: if translated_text and translated_text != original_text:
...@@ -293,7 +299,7 @@ def _translate_header_footer_part(header_footer, engine: str, ...@@ -293,7 +299,7 @@ def _translate_header_footer_part(header_footer, engine: str,
for table in header_footer.tables: for table in header_footer.tables:
for row in table.rows: for row in table.rows:
for cell in row.cells: for cell in row.cells:
if _translate_table_cell(cell, engine): if _translate_table_cell(cell, engine, to_lang):
table_cell_count += 1 table_cell_count += 1
if table_cell_count > 0: if table_cell_count > 0:
...@@ -317,7 +323,7 @@ def _translate_header_footer_part(header_footer, engine: str, ...@@ -317,7 +323,7 @@ def _translate_header_footer_part(header_footer, engine: str,
original_text, original_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != original_text: if translated_text and translated_text != original_text:
...@@ -350,7 +356,7 @@ def _translate_header_footer_part(header_footer, engine: str, ...@@ -350,7 +356,7 @@ def _translate_header_footer_part(header_footer, engine: str,
original_text, original_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != original_text: if translated_text and translated_text != original_text:
...@@ -373,13 +379,14 @@ def _translate_header_footer_part(header_footer, engine: str, ...@@ -373,13 +379,14 @@ def _translate_header_footer_part(header_footer, engine: str,
return translated_count return translated_count
def _preserve_hyperlinks(paragraph, engine: str) -> None: def _preserve_hyperlinks(paragraph, engine: str, to_lang: str = TARGET_LANGUAGE) -> None:
""" """
保留超链接并翻译锚文本 保留超链接并翻译锚文本
Args: Args:
paragraph: 段落对象 paragraph: 段落对象
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码
""" """
# 超链接检查需要通过XML元素进行 # 超链接检查需要通过XML元素进行
from docx.oxml import parse_xml from docx.oxml import parse_xml
...@@ -401,7 +408,7 @@ def _preserve_hyperlinks(paragraph, engine: str) -> None: ...@@ -401,7 +408,7 @@ def _preserve_hyperlinks(paragraph, engine: str) -> None:
original_text, original_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != original_text: if translated_text and translated_text != original_text:
run.text = translated_text run.text = translated_text
...@@ -452,13 +459,14 @@ def _find_all_textboxes(document): ...@@ -452,13 +459,14 @@ def _find_all_textboxes(document):
yield txbx_content yield txbx_content
def _translate_textboxes(document, engine: str) -> int: def _translate_textboxes(document, engine: str, to_lang: str = TARGET_LANGUAGE) -> int:
""" """
翻译文档中所有文本框内容 翻译文档中所有文本框内容
Args: Args:
document: Document对象 document: Document对象
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码
Returns: Returns:
成功翻译的文本框段落数量 成功翻译的文本框段落数量
...@@ -502,7 +510,7 @@ def _translate_textboxes(document, engine: str) -> int: ...@@ -502,7 +510,7 @@ def _translate_textboxes(document, engine: str) -> int:
original_text, original_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != original_text: if translated_text and translated_text != original_text:
...@@ -603,7 +611,7 @@ def _find_toc_paragraphs(document): ...@@ -603,7 +611,7 @@ def _find_toc_paragraphs(document):
return toc_start, toc_end return toc_start, toc_end
def _translate_toc_manual(document, engine: str) -> int: def _translate_toc_manual(document, engine: str, to_lang: str = TARGET_LANGUAGE) -> int:
""" """
手动翻译目录内容 手动翻译目录内容
...@@ -612,6 +620,7 @@ def _translate_toc_manual(document, engine: str) -> int: ...@@ -612,6 +620,7 @@ def _translate_toc_manual(document, engine: str) -> int:
Args: Args:
document: Document对象 document: Document对象
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码
Returns: Returns:
成功翻译的目录条目数量 成功翻译的目录条目数量
...@@ -660,7 +669,7 @@ def _translate_toc_manual(document, engine: str) -> int: ...@@ -660,7 +669,7 @@ def _translate_toc_manual(document, engine: str) -> int:
title_text, title_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_title and translated_title != title_text: if translated_title and translated_title != title_text:
...@@ -696,7 +705,7 @@ def _translate_toc_manual(document, engine: str) -> int: ...@@ -696,7 +705,7 @@ def _translate_toc_manual(document, engine: str) -> int:
original_text, original_text,
engine=engine, engine=engine,
from_lang=SOURCE_LANGUAGE, from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE to_lang=to_lang
) )
if translated_text and translated_text != original_text: if translated_text and translated_text != original_text:
...@@ -778,7 +787,8 @@ def _update_fields_via_win32com(doc_path: str) -> bool: ...@@ -778,7 +787,8 @@ def _update_fields_via_win32com(doc_path: str) -> bool:
def internationalize_document( def internationalize_document(
input_path: str, input_path: str,
output_path: Optional[str] = None, output_path: Optional[str] = None,
engine: str = "google" engine: str = "google",
to_lang: str = "en"
) -> str: ) -> str:
""" """
文档国际化转换(主函数) 文档国际化转换(主函数)
...@@ -787,6 +797,7 @@ def internationalize_document( ...@@ -787,6 +797,7 @@ def internationalize_document(
input_path: 输入文档路径 input_path: 输入文档路径
output_path: 输出文档路径(可选,默认为reports/目录下同名文件) output_path: 输出文档路径(可选,默认为reports/目录下同名文件)
engine: 翻译引擎 engine: 翻译引擎
to_lang: 目标语言代码 (ko, fr, ja, ru, es, ar, en)
Returns: Returns:
输出文档路径 输出文档路径
...@@ -800,9 +811,12 @@ def internationalize_document( ...@@ -800,9 +811,12 @@ def internationalize_document(
# 获取文件名(不含扩展名) # 获取文件名(不含扩展名)
filename = input_file.stem filename = input_file.stem
# 根据目标语言确定输出文件后缀
lang_suffix = LANGUAGE_NAMES.get(to_lang, to_lang)
# 设置输出路径 # 设置输出路径
if output_path is None: if output_path is None:
output_file = REPORTS_DIR / f"{filename}_英文版.docx" output_file = REPORTS_DIR / f"{filename}_{lang_suffix}版.docx"
else: else:
output_file = Path(output_path) output_file = Path(output_path)
...@@ -811,6 +825,7 @@ def internationalize_document( ...@@ -811,6 +825,7 @@ def internationalize_document(
logger.info("开始国际化转换: %s", input_path) logger.info("开始国际化转换: %s", input_path)
logger.info("使用翻译引擎: %s", engine) logger.info("使用翻译引擎: %s", engine)
logger.info("目标语言: %s (%s)", LANGUAGE_NAMES.get(to_lang, to_lang), to_lang)
logger.info("输出路径: %s", output_file) logger.info("输出路径: %s", output_file)
# 读取源文档 # 读取源文档
...@@ -831,10 +846,10 @@ def internationalize_document( ...@@ -831,10 +846,10 @@ def internationalize_document(
continue continue
# 处理超链接 # 处理超链接
_preserve_hyperlinks(paragraph, engine) _preserve_hyperlinks(paragraph, engine, to_lang)
# 翻译段落 # 翻译段落
if _translate_paragraph(paragraph, engine): if _translate_paragraph(paragraph, engine, to_lang):
translated_paragraph_count += 1 translated_paragraph_count += 1
logger.info("段落翻译完成: 总数=%d, 翻译=%d", paragraph_count, translated_paragraph_count) logger.info("段落翻译完成: 总数=%d, 翻译=%d", paragraph_count, translated_paragraph_count)
...@@ -842,33 +857,33 @@ def internationalize_document( ...@@ -842,33 +857,33 @@ def internationalize_document(
# 遍历所有表格进行翻译 # 遍历所有表格进行翻译
for table in doc.tables: for table in doc.tables:
table_count += 1 table_count += 1
translated_cell_count += _translate_table(table, engine) translated_cell_count += _translate_table(table, engine, to_lang)
logger.info("表格翻译完成: 总数=%d, 单元格翻译=%d", table_count, translated_cell_count) logger.info("表格翻译完成: 总数=%d, 单元格翻译=%d", table_count, translated_cell_count)
# 生成翻译后的文件名(用于页眉) # 生成翻译后的文件名(用于页眉)
# 尝试翻译文件名,如果失败则使用默认格式 # 尝试翻译文件名,如果失败则使用默认格式
try: try:
translated_filename = translate_text(filename, engine=engine, from_lang=SOURCE_LANGUAGE, to_lang=TARGET_LANGUAGE) translated_filename = translate_text(filename, engine=engine, from_lang=SOURCE_LANGUAGE, to_lang=to_lang)
if not translated_filename or translated_filename == filename: if not translated_filename or translated_filename == filename:
translated_filename = f"{filename} (English)" translated_filename = f"{filename} ({LANGUAGE_NAMES.get(to_lang, to_lang)})"
except Exception: except Exception:
translated_filename = f"{filename} (English)" translated_filename = f"{filename} ({LANGUAGE_NAMES.get(to_lang, to_lang)})"
# 处理页眉页脚翻译 # 处理页眉页脚翻译
header_footer_count = 0 header_footer_count = 0
for section in doc.sections: for section in doc.sections:
header_footer_count += _translate_header_footer_part( header_footer_count += _translate_header_footer_part(
section.header, engine, translated_filename, filename section.header, engine, translated_filename, filename, to_lang
) )
header_footer_count += _translate_header_footer_part( header_footer_count += _translate_header_footer_part(
section.footer, engine, None, None section.footer, engine, None, None, to_lang
) )
logger.info("页眉页脚翻译完成: 数量=%d", header_footer_count) logger.info("页眉页脚翻译完成: 数量=%d", header_footer_count)
# 处理文本框翻译 # 处理文本框翻译
textbox_count = _translate_textboxes(doc, engine) textbox_count = _translate_textboxes(doc, engine, to_lang)
# 保存翻译后的文档 # 保存翻译后的文档
doc.save(str(output_file)) doc.save(str(output_file))
...@@ -883,7 +898,7 @@ def internationalize_document( ...@@ -883,7 +898,7 @@ def internationalize_document(
# 方案B:手动翻译目录 # 方案B:手动翻译目录
logger.info("win32com不可用,使用手动目录翻译...") logger.info("win32com不可用,使用手动目录翻译...")
doc = Document(output_file) doc = Document(output_file)
toc_count = _translate_toc_manual(doc, engine) toc_count = _translate_toc_manual(doc, engine, to_lang)
if toc_count > 0: if toc_count > 0:
doc.save(str(output_file)) doc.save(str(output_file))
logger.info("目录手动翻译完成: %d 个条目", toc_count) logger.info("目录手动翻译完成: %d 个条目", toc_count)
......
# 自动化测试用例生成器
## 项目简介
自动化测试用例生成器是一个基于 Selenium 的 Python 工具,用于自动生成 Web 系统的测试用例 JSON 文件。该工具通过模拟真实用户操作(登录、导航、表单填写等),自动收集页面元素定位信息,并生成标准化的测试用例数据。
### 主要功能
- 自动登录系统并导航到指定模块
- 支持 7 种功能类型的测试用例生成:添加、编辑、删除、启用、停用、批量启用、批量停用
- 智能元素定位(ID、NAME、CLASS、XPATH、CSS_SELECTOR)
- 自动处理 SSL 证书警告
- 支持批量生成多个模块的测试用例
---
## 环境要求
### Python 环境
- Python 3.10.5 或更高版本
### 依赖安装
```bash
pip install selenium
```
### 浏览器要求
- Chrome 浏览器(最新版本)
- ChromeDriver(版本需与 Chrome 浏览器匹配)
---
## 快速开始
### Step 1: 确认目录结构
```
AuxiliaryTool/TestCaseGenerator/
├── config/
│ ├── system_config.json # 系统登录配置(需配置)
│ └── module_config.json # 模块配置(需配置)
├── testcases/ # 生成的测试用例输出目录
├── generate_testcases.py # 主程序脚本
└── README.md # 本文档
```
**注意**:如果 `config` 目录不存在,请先创建:
```bash
mkdir -p "E:/GithubData/ubains-module-test/AuxiliaryTool/TestCaseGenerator/config"
```
### Step 2: 配置 system_config.json
编辑 `config/system_config.json`,填写系统登录信息:
```json
[
{
"system_type": "new_platform",
"system_front_url": "https://192.168.5.44",
"system_back_url": "https://192.168.5.44/#/LoginAdmin",
"username": "admin@xty",
"password": "Ubains@4321",
"code": "csba"
}
]
```
**字段说明**
| 字段 | 说明 | 示例值 |
|------|------|--------|
| system_type | 系统类型标识 | "new_platform" |
| system_front_url | 前台地址 | "https://192.168.5.44" |
| system_back_url | 后台地址 | "https://192.168.5.44/#/LoginAdmin" |
| username | 登录账号 | "admin@xty" |
| password | 登录密码 | "Ubains@4321" |
| code | 验证码(固定值) | "csba" |
### Step 3: 配置 module_config.json
编辑 `config/module_config.json`,添加需要生成测试用例的模块:
```json
[
{
"system_type": "后台系统",
"module_name": "区域管理",
"module_name_son": "增值服务",
"module_function": ["添加", "编辑", "删除"]
},
{
"system_type": "后台系统",
"module_name": "授权管理",
"module_name_son": "会议授权",
"module_function": ["启用", "停用", "批量启用", "批量停用"]
}
]
```
**字段说明**
| 字段 | 说明 | 示例值 |
|------|------|--------|
| system_type | 系统类型(包含"后台"或"admin"使用后台URL,否则使用前台URL) | "后台系统" / "前台系统" |
| module_name | 一级菜单名称 | "区域管理" |
| module_name_son | 二级菜单名称 | "增值服务" |
| module_function | 功能列表(支持多个) | ["添加", "编辑", "删除"] |
**支持的功能类型**
| 功能类型 | 说明 |
|----------|------|
| 添加 | 新增数据操作 |
| 编辑 | 修改已有数据 |
| 删除 | 删除数据 |
| 启用 | 启用数据/功能 |
| 停用 | 停用数据/功能 |
| 批量启用 | 批量启用多条数据 |
| 批量停用 | 批量停用多条数据 |
### Step 4: 运行生成脚本
```bash
# 进入目录
cd E:/GithubData/ubains-module-test/AuxiliaryTool/TestCaseGenerator
# 运行脚本
python generate_testcases.py
```
### Step 5: 查看生成的文件
生成的测试用例文件保存在 `testcases/` 目录下,文件命名格式为:
```
{模块名}_{子模块名}_{功能}.json
```
示例:
- `区域管理_增值服务_添加.json`
- `区域管理_增值服务_编辑.json`
- `区域管理_增值服务_删除.json`
---
## 生成的测试用例格式
### 完整结构示例
```json
{
"name": "区域管理_增值服务_添加",
"para": [
{
"page": "backend/backstage",
"step": "点击【区域管理】菜单",
"locator_type": "XPATH",
"locator_value": "//span[contains(text(),'区域管理')]",
"element_type": "click",
"element_value": "",
"expected_result": ""
},
{
"page": "backend/backstage",
"step": "点击【添加】按钮",
"locator_type": "XPATH",
"locator_value": "//span[contains(text(),'添加')]",
"element_type": "click",
"element_value": "",
"expected_result": ""
},
{
"page": "backend/backstage",
"step": "验证添加成功提示",
"locator_type": "XPATH",
"locator_value": "//p[contains(text(),'添加成功')]",
"element_type": "getTips",
"element_value": "",
"expected_result": "添加成功"
}
],
"platform": "web",
"base_url": "https://192.168.5.44"
}
```
### 字段说明
#### 顶层字段
| 字段 | 说明 |
|------|------|
| name | 测试用例名称,格式:{一级菜单}_{二级菜单}_{功能} |
| para | 测试步骤列表 |
| platform | 平台类型,固定为 "web" |
| base_url | 系统基础URL |
#### 步骤字段 (para)
| 字段 | 说明 |
|------|------|
| page | 当前模块功能操作的页面路由后缀(从URL解析) |
| step | 操作步骤描述 |
| locator_type | 元素定位类型(ID、XPATH、CSS_SELECTOR等) |
| locator_value | 元素定位值 |
| element_type | 操作类型 |
| element_value | 操作值(根据element_type不同有不同规则) |
| expected_result | 预期结果描述 |
#### element_type 类型说明
| element_type | 说明 | element_value 填写 | expected_result 填写 |
|--------------|------|---------------------|----------------------|
| click | 点击按钮/链接 | 留空 `""` | 通常留空 |
| input | 文本输入框 | 填写输入内容 | 通常留空 |
| select | 下拉选择框 | 留空 `""` | 通常留空 |
| checkbox | 复选框/单选框 | 留空 `""` | 通常留空 |
| switch | 开关控件 | 留空 `""` | 通常留空 |
| getTips | 获取弹窗提示 | **留空** `""` | 填写预期提示文本 |
| getText | 获取列表文本 | **留空** `""` | 填写验证描述 |
#### locator_type 优先级
工具按以下优先级自动选择定位方式:
1. **ID** - 使用 id 属性(优先)
2. **NAME** - 使用 name 属性
3. **CLASS** - 使用 class 属性
4. **XPATH** - 使用 XPATH 表达式(备选)
5. **CSS_SELECTOR** - 使用 CSS 选择器(备选)
**注意**:不允许使用 UID 作为定位类型。
---
## 常见问题处理
### Q1: 浏览器驱动版本不匹配
**错误信息**`This version of ChromeDriver only supports Chrome version X`
**解决方案**
1. 检查 Chrome 浏览器版本:在 Chrome 地址栏输入 `chrome://version/`
2. 下载匹配版本的 ChromeDriver:https://chromedriver.chromium.org/downloads
3. 替换 ChromeDriver 可执行文件
### Q2: 登录失败
**可能原因**
- 网络不通,无法访问系统地址
- 账号密码错误
- 验证码已更改
**解决方案**
- 检查网络连接,确认能访问 `system_config.json` 中配置的地址
- 更新 `system_config.json` 中的账号密码
- 确认验证码是否为 "csba"(如有变更请修改配置)
### Q3: 找不到菜单元素
**错误信息**`未找到菜单: XXX`
**可能原因**
- 菜单名称配置错误(与实际页面不一致)
- 页面加载未完成
**解决方案**
- 确认 `module_name``module_name_son` 与实际页面完全一致
- 检查页面是否使用 iframe(工具会自动尝试切换)
- 增加等待时间(修改代码中的 `timeout` 参数)
### Q4: SSL 证书警告
**错误信息**`您的连接不是私密连接`
**解决方案**
工具已内置 SSL 证书警告处理功能,会自动点击"高级"和"继续访问"按钮。如果仍然失败:
1. 手动访问系统地址,确认为可信任的内部系统
2. 在浏览器中添加安全例外
3. 联系系统管理员解决证书问题
### Q5: 元素定位失败
**可能原因**
- 页面结构变化
- 元素在动态加载的内容中
**解决方案**
- 使用 Chrome DevTools 检查页面结构(F12)
- 修改 `module_config.json` 中的菜单名称
- 检查是否有 JavaScript 错误
---
## 工作流程
```
┌─────────────────────────────────────────────────────────────┐
│ 1. 加载配置文件 │
│ system_config.json + module_config.json │
└───────────────────────────┬─────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 2. 初始化浏览器 │
│ 启动 Chrome,配置 SSL 忽略选项 │
└───────────────────────────┬─────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 3. 登录系统 │
│ 输入账号 → 输入密码 → 输入验证码 → 点击登录 │
└───────────────────────────┬─────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 4. 遍历模块配置 │
│ 对每个模块:点击一级菜单 → 点击二级菜单 → 获取页面URL │
└───────────────────────────┬─────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 5. 生成测试用例 │
│ 对每个功能:生成测试步骤 → 组装 JSON → 保存到文件 │
└───────────────────────────┬─────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 6. 输出结果 │
│ 测试用例文件保存到 testcases/ 目录 │
└─────────────────────────────────────────────────────────────┘
```
---
## 批量生成示例
### 一次生成多个模块的配置
```json
[
{
"system_type": "后台系统",
"module_name": "区域管理",
"module_name_son": "增值服务",
"module_function": ["添加", "编辑", "删除"]
},
{
"system_type": "后台系统",
"module_name": "区域管理",
"module_name_son": "区域列表",
"module_function": ["添加", "编辑", "删除"]
},
{
"system_type": "后台系统",
"module_name": "用户管理",
"module_name_son": "用户列表",
"module_function": ["添加", "编辑"]
},
{
"system_type": "前台系统",
"module_name": "会议室管理",
"module_name_son": "会议室列表",
"module_function": ["添加", "编辑", "删除"]
}
]
```
程序会依次处理每个模块配置,生成对应的测试用例文件。
---
## 注意事项
1. **数据清理**:编辑和删除操作会创建测试数据,测试完成后需要手动清理
2. **页面等待**:如果网络较慢,可能需要增加代码中的等待时间
3. **编码问题**:确保 JSON 文件使用 UTF-8 编码保存
4. **浏览器版本**:建议使用最新版 Chrome 浏览器
5. **网络环境**:确保运行脚本的机器能访问配置的系统地址
6. **无头模式**:如需无头运行,取消注释代码中的 `--headless` 选项
---
## 配置参考
### 最小化配置示例
**system_config.json**
```json
[{
"system_type": "new_platform",
"system_front_url": "https://192.168.5.44",
"system_back_url": "https://192.168.5.44/#/LoginAdmin",
"username": "your_username",
"password": "your_password",
"code": "csba"
}]
```
**module_config.json**
```json
[{
"system_type": "后台系统",
"module_name": "一级菜单",
"module_name_son": "二级菜单",
"module_function": ["添加"]
}]
```
---
## 相关文档
- 需求文档:`Docs/PRD/生成自动化测试用例/_PRD_生成自动化测试用例需求文档.md`
- 操作手册:`Docs/PRD/生成自动化测试用例/_操作手册_如何生成新模块测试用例.md`
- 问题记录:`Docs/PRD/生成自动化测试用例/问题修复/`
---
*文档版本:v1.0*
*更新日期:2026-03-11*
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
import json import json
import time import time
import os import os
import argparse
from datetime import datetime from datetime import datetime
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
...@@ -20,11 +21,17 @@ from selenium.common.exceptions import TimeoutException, NoSuchElementException ...@@ -20,11 +21,17 @@ from selenium.common.exceptions import TimeoutException, NoSuchElementException
class TestCaseGenerator: class TestCaseGenerator:
"""测试用例生成器""" """测试用例生成器"""
def __init__(self): def __init__(self, headless=False):
"""初始化测试用例生成器
Args:
headless: 是否使用无头模式(不显示浏览器界面),默认为False
"""
self.base_dir = os.path.dirname(os.path.abspath(__file__)) self.base_dir = os.path.dirname(os.path.abspath(__file__))
self.config_dir = os.path.join(self.base_dir, 'config') self.config_dir = os.path.join(self.base_dir, 'config')
self.testcases_dir = os.path.join(self.base_dir, 'testcases') self.testcases_dir = os.path.join(self.base_dir, 'testcases')
self.driver = None self.driver = None
self.headless = headless # 保存无头模式配置
# 确保目录存在 # 确保目录存在
os.makedirs(self.config_dir, exist_ok=True) os.makedirs(self.config_dir, exist_ok=True)
...@@ -44,7 +51,14 @@ class TestCaseGenerator: ...@@ -44,7 +51,14 @@ class TestCaseGenerator:
def init_driver(self): def init_driver(self):
"""初始化浏览器驱动""" """初始化浏览器驱动"""
options = webdriver.ChromeOptions() options = webdriver.ChromeOptions()
# options.add_argument('--headless') # 取消注释可无头模式运行
# 根据配置决定是否使用无头模式
if self.headless:
options.add_argument('--headless') # 无头模式:不显示浏览器窗口
print("✓ 浏览器驱动初始化完成(无头模式)")
else:
print("✓ 浏览器驱动初始化完成(有界面模式)")
options.add_argument('--no-sandbox') options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu') options.add_argument('--disable-gpu')
...@@ -57,7 +71,6 @@ class TestCaseGenerator: ...@@ -57,7 +71,6 @@ class TestCaseGenerator:
self.driver = webdriver.Chrome(options=options) self.driver = webdriver.Chrome(options=options)
self.driver.implicitly_wait(10) self.driver.implicitly_wait(10)
print("✓ 浏览器驱动初始化完成")
def handle_ssl_warning(self): def handle_ssl_warning(self):
"""处理SSL证书警告页面""" """处理SSL证书警告页面"""
...@@ -687,6 +700,9 @@ class TestCaseGenerator: ...@@ -687,6 +700,9 @@ class TestCaseGenerator:
"""执行生成流程""" """执行生成流程"""
print("=" * 60) print("=" * 60)
print("自动化测试用例生成器") print("自动化测试用例生成器")
# 显示当前运行模式
mode = "无界面模式" if self.headless else "有界面模式"
print(f"运行模式: {mode}")
print("=" * 60) print("=" * 60)
# 加载配置 # 加载配置
...@@ -738,9 +754,36 @@ class TestCaseGenerator: ...@@ -738,9 +754,36 @@ class TestCaseGenerator:
self.driver.quit() self.driver.quit()
def parse_args():
"""解析命令行参数
Returns:
argparse.Namespace: 解析后的参数对象
"""
parser = argparse.ArgumentParser(
description='自动化测试用例生成器',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog='''
使用示例:
有界面模式: python generate_testcases.py
无界面模式: python generate_testcases.py --headless
'''
)
parser.add_argument(
'--headless',
action='store_true',
help='启用无头模式(不显示浏览器界面),适用于CI/CD或服务器后台执行'
)
return parser.parse_args()
def main(): def main():
"""主函数""" """主函数"""
generator = TestCaseGenerator() # 解析命令行参数
args = parse_args()
# 根据参数创建生成器实例
generator = TestCaseGenerator(headless=args.headless)
try: try:
generator.run() generator.run()
except Exception as e: except Exception as e:
......
# 问题描述
## 问题现象
- 执行代码进行除英文以外的语种翻译时,提示引擎使用的google,需要像英文翻译一样通过命令行参数使用bing引擎进行翻译。
## 日志信息
```ignorelang
PS E:\GithubData\ubains-module-test\AuxiliaryTool\DocumentAutoOptimizationCalibration> python run.py --translate --to-lang ko --input "./testcases/新统一平台自动化部署操作指导.docx"
2026-03-11 10:36:23 - src.cli - INFO - 日志系统初始化完成,级别=INFO
2026-03-11 10:36:23 - src.cli - INFO - 输入文档: ./testcases/新统一平台自动化部署操作指导.docx
使用翻译引擎: google
目标语言: 韩文
翻译过程中,请耐心等待...
2026-03-11 10:36:23 - src.internationalizer - INFO - 开始国际化转换: ./testcases/新统一平台自动化部署操作指导.docx
2026-03-11 10:36:23 - src.internationalizer - INFO - 使用翻译引擎: google
2026-03-11 10:36:23 - src.internationalizer - INFO - 目标语言: 韩文 (ko)
2026-03-11 10:36:23 - src.internationalizer - INFO - 输出路径: E:\GithubData\ubains-module-test\AuxiliaryTool\DocumentAutoOptimizationCalibration\reports\新统一平台自动化部署操作指导_韩文版.docx
2026-03-11 10:36:23 - src.translator - WARNING - 翻译失败(第1次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:24 - src.translator - WARNING - 翻译失败(第2次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:25 - src.translator - WARNING - 翻译失败(第3次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:25 - src.translator - ERROR - 翻译最终失败: Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:25 - src.internationalizer - WARNING - 翻译失败或未翻译: 版权所有 © 优本技术(深圳)有限公司 2008。 保留一切
2026-03-11 10:36:25 - src.translator - WARNING - 翻译失败(第1次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:26 - src.translator - WARNING - 翻译失败(第2次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:27 - src.translator - WARNING - 翻译失败(第3次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:27 - src.translator - ERROR - 翻译最终失败: Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:27 - src.internationalizer - WARNING - 翻译失败或未翻译: 非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内
2026-03-11 10:36:27 - src.translator - WARNING - 翻译失败(第1次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:28 - src.translator - WARNING - 翻译失败(第2次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:29 - src.translator - WARNING - 翻译失败(第3次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:29 - src.translator - ERROR - 翻译最终失败: Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:29 - src.internationalizer - WARNING - 翻译失败或未翻译: 商标声明
2026-03-11 10:36:29 - src.translator - WARNING - 翻译失败(第1次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:30 - src.translator - WARNING - 翻译失败(第2次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:31 - src.translator - WARNING - 翻译失败(第3次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:31 - src.translator - ERROR - 翻译最终失败: Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:31 - src.internationalizer - WARNING - 翻译失败或未翻译: 和其他优本技术商标均为优本技术(深圳)有限公司的商标。 本文
2026-03-11 10:36:31 - src.translator - WARNING - 翻译失败(第1次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:32 - src.translator - WARNING - 翻译失败(第2次尝试): Google service was offline in inland of China on Oct 2022.
```
\ No newline at end of file
# 国际化语种翻译需调整引擎_问题处理_计划执行
## 1. 问题描述
### 问题现象
执行代码进行除英文以外的语种翻译时,提示引擎使用的 google,需要像英文翻译一样通过命令行参数使用 bing 引擎进行翻译。
### 日志信息
```ignorelang
PS E:\GithubData\ubains-module-test\AuxiliaryTool\DocumentAutoOptimizationCalibration> python run.py --translate --to-lang ko --input "./testcases/新统一平台自动化部署操作指导.docx"
使用翻译引擎: google
目标语言: 韩文
翻译过程中,请耐心等待...
...
2026-03-11 10:36:23 - src.translator - WARNING - 翻译失败(第1次尝试): Google service was offline in inland of China on Oct 2022.
2026-03-11 10:36:24 - src.translator - WARNING - 翻译失败(第2次尝试): Google service was offline in inland of China on Oct 2022.
...
```
### 预期结果
- 默认使用 bing 引擎进行翻译(支持国内网络环境)
### 实际结果
- 默认使用 google 引擎,导致翻译失败
---
## 2. 问题分析
### 根本原因
配置文件 `src/config.py` 中默认翻译引擎设置为 `"google"`,但 google 翻译服务在国内不可用。
### 问题代码
```python
# src/config.py
DEFAULT_TRANSLATE_ENGINE = "google" # google在国内不可用
```
### 引擎可用性对比
| 引擎 | 国内可用性 | 说明 |
|------|-----------|------|
| google | ❌ 不可用 | 需要科学上网 |
| baidu | ✅ 可用 | 需要API密钥 |
| bing | ✅ 可用 | 免费使用,推荐 |
---
## 3. 解决方案
将默认翻译引擎从 `"google"` 改为 `"bing"`,确保在无额外配置的情况下可以正常翻译。
### 修改内容
```python
# src/config.py
# 修改前
DEFAULT_TRANSLATE_ENGINE = "google"
# 修改后
DEFAULT_TRANSLATE_ENGINE = "bing"
```
### 理由
1. bing 引擎在国内网络环境下可用
2. 不需要额外配置API密钥
3. 翻译质量稳定
4. 用户仍可通过 `--translate-engine` 参数切换到其他引擎
---
## 4. 实施计划
### 4.1 代码修改
- [x] 修改 `src/config.py` - 将默认引擎改为 bing
### 4.2 验证测试
- [x] 语法检查通过
- [ ] 测试韩文翻译
- [ ] 测试法文翻译
- [ ] 测试日语翻译
### 4.3 文档更新
- [x] 创建计划执行文档
---
## 5. 实施状态
| 项目 | 状态 | 说明 |
|------|------|------|
| 问题分析 | ✅ 完成 | 已找到根本原因 |
| 解决方案设计 | ✅ 完成 | 将默认引擎改为bing |
| 代码实现 | ✅ 完成 | 已修改 config.py |
| 语法验证 | ✅ 完成 | Python语法检查通过 |
| 功能测试 | 待进行 | 需要测试各语言翻译 |
---
## 6. 测试验证
### 测试命令
```bash
cd AuxiliaryTool/DocumentAutoOptimizationCalibration
# 测试默认引擎(应使用bing)
python run.py --translate --to-lang ko --input "testcases/新统一平台自动化部署操作指导.docx"
# 测试指定引擎
python run.py --translate --translate-engine baidu --to-lang fr --input "testcases/文档.docx"
# 测试英文翻译(应使用bing)
python run.py --translate --input "testcases/文档.docx"
```
### 预期结果
- 默认使用 bing 引擎
- 翻译成功,不再出现 "Google service was offline" 错误
- 显示 "使用翻译引擎: bing"
---
## 7. 代码修改记录
### 修改文件
- `src/config.py`
### 修改内容
```diff
# 默认翻译引擎
-DEFAULT_TRANSLATE_ENGINE = "google" # google, baidu, bing
+DEFAULT_TRANSLATE_ENGINE = "bing" # google, baidu, bing(默认使用bing以支持国内网络环境)
```
### 版本更新
```python
__version__ = "1.3.1" # 修复:将默认翻译引擎改为bing
```
---
## 8. 注意事项
### 用户仍可指定其他引擎
修改默认引擎后,用户仍可以通过 `--translate-engine` 参数指定使用其他引擎:
```bash
# 使用百度引擎
python run.py --translate --translate-engine baidu --input "文档.docx"
# 使用谷歌引擎(需要科学上网)
python run.py --translate --translate-engine google --input "文档.docx"
```
### 各引擎选择建议
| 场景 | 推荐引擎 | 命令 |
|------|----------|------|
| 国内常规使用 | bing | 默认,无需指定 |
| 需要API调用 | baidu | `--translate-engine baidu` |
| 国外服务器/有代理 | google | `--translate-engine google` |
# 问题描述
## 问题现象
- 执行代码发现程序异常,LANGUAGE_NAMES未定义
## 日志信息
```ignorelang
PS E:\GithubData\ubains-module-test\AuxiliaryTool\DocumentAutoOptimizationCalibration> python run.py --translate --translate-engine bing --input "testcases/新统一平台自动化部署操作指导.docx"
2026-03-11 10:27:57 - src.cli - INFO - 日志系统初始化完成,级别=INFO
2026-03-11 10:27:57 - src.cli - INFO - 输入文档: testcases/新统一平台自动化部署操作指导.docx
使用翻译引擎: bing
2026-03-11 10:27:57 - src.main - ERROR - 程序异常: name 'LANGUAGE_NAMES' is not defined
```
\ No newline at end of file
# 程序执行异常字段未定义_问题处理_计划执行
## 1. 问题描述
### 问题现象
执行代码发现程序异常,`LANGUAGE_NAMES` 未定义。
### 日志信息
```ignorelang
PS E:\GithubData\ubains-module-test\AuxiliaryTool\DocumentAutoOptimizationCalibration> python run.py --translate --translate-engine bing --input "testcases/新统一平台自动化部署操作指导.docx"
2026-03-11 10:27:57 - src.cli - INFO - 日志系统初始化完成,级别=INFO
2026-03-11 10:27:57 - src.cli - INFO - 输入文档: testcases/新统一平台自动化部署操作指导.docx
使用翻译引擎: bing
2026-03-11 10:27:57 - src.main - ERROR - 程序异常: name 'LANGUAGE_NAMES' is not defined
```
---
## 2. 问题分析
### 根本原因
`src/cli.py` 中使用了 `LANGUAGE_NAMES` 变量,但在导入 `src.config` 时没有导入该变量。
### 问题代码
```python
# src/cli.py 第13-23行
from src.config import (
TESTCASES_DIR,
REPORTS_DIR,
LOG_FORMAT,
LOG_DATE_FORMAT,
DEFAULT_TRANSLATE_ENGINE,
SUPPORTED_ENGINES,
LANGUAGE_CODES,
SUPPORTED_TARGET_LANGUAGES,
TARGET_LANGUAGE,
# 缺少 LANGUAGE_NAMES
)
# 第270行使用了 LANGUAGE_NAMES
print(f"目标语言: {LANGUAGE_NAMES.get(args.to_lang, args.to_lang)}")
```
### config.py 中的定义
```python
# src/config.py
LANGUAGE_CODES = {
"韩文": "ko",
"法文": "fr",
"日语": "ja",
"俄语": "ru",
"西班牙语": "es",
"阿拉伯语": "ar",
"英文": "en"
}
# 语言代码到语言名称的反向映射
LANGUAGE_NAMES = {v: k for k, v in LANGUAGE_CODES.items()}
```
---
## 3. 解决方案
`src/cli.py` 的导入语句中添加 `LANGUAGE_NAMES`
### 修改内容
```python
from src.config import (
TESTCASES_DIR,
REPORTS_DIR,
LOG_FORMAT,
LOG_DATE_FORMAT,
DEFAULT_TRANSLATE_ENGINE,
SUPPORTED_ENGINES,
LANGUAGE_CODES,
LANGUAGE_NAMES, # 新增
SUPPORTED_TARGET_LANGUAGES,
TARGET_LANGUAGE,
)
```
---
## 4. 实施计划
### 4.1 代码修改
- [x] 修改 `src/cli.py` - 添加 `LANGUAGE_NAMES` 导入
### 4.2 验证测试
- [x] 语法检查通过
- [ ] 执行翻译命令测试
---
## 5. 实施状态
| 项目 | 状态 | 说明 |
|------|------|------|
| 问题分析 | ✅ 完成 | 已找到根本原因 |
| 解决方案设计 | ✅ 完成 | 添加缺失的导入 |
| 代码实现 | ✅ 完成 | 已修改 cli.py |
| 语法验证 | ✅ 完成 | Python语法检查通过 |
| 功能测试 | 待进行 | 需要执行翻译命令验证 |
---
## 6. 测试验证
### 测试命令
```bash
cd AuxiliaryTool/DocumentAutoOptimizationCalibration
python run.py --translate --translate-engine bing --input "testcases/新统一平台自动化部署操作指导.docx"
```
### 预期结果
- 程序正常运行,不再报 `LANGUAGE_NAMES` 未定义错误
- 显示目标语言信息
---
## 7. 代码修改记录
### 修改文件
- `src/cli.py`
### 修改内容
```diff
from src.config import (
TESTCASES_DIR,
REPORTS_DIR,
LOG_FORMAT,
LOG_DATE_FORMAT,
DEFAULT_TRANSLATE_ENGINE,
SUPPORTED_ENGINES,
LANGUAGE_CODES,
+ LANGUAGE_NAMES,
SUPPORTED_TARGET_LANGUAGES,
TARGET_LANGUAGE,
)
```
# 文档内容国际化转换_优化需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/DocumentAutoOptimizationCalibration]
## 功能需求
### 功能目标
**目标:** 实现将中文内容转换成韩文、法文、日语、俄语、西班牙语、阿拉伯语。
### 需求描述
#### 文档路径获取
- 文档路径:[AuxiliaryTool/DocumentAutoOptimizationCalibration/testcases/新统一平台自动化部署操作指导.docx]
### 测试报告内容约束
#### 内容转换规则
- 译文控制:通过命令参数或是选择项来控制选择译文。
- LANGUAGE_CODES = {
"韩文": "ko",
"法文": "fr",
"日语": "ja",
"俄语": "ru",
"西班牙语": "es",
"阿拉伯语": "ar"
}
- 在不影响排版的前提下将中文内容转换为其他语种。
- 转换过程中需保留原有内容、图片、超链接或批注等元素。
- 转后后的文档内容需符合所选语种的表达习惯,且语法正确。
#### 功能实现方式
- 翻译服务:使用当前实现的bing引擎
- 领域术语处理:对于文档中涉及的领域术语,需进行特殊处理,确保翻译结果准确。例如,“服务器”翻译为“Server”,“管理员”翻译为“Administrator”,“版本信息”翻译为“Version Information”等,暂不考虑术语库。
- 元素保留细节:需保留图片、超链接或批注等元素。
- 置信度阈值:置信度阈值为0.8,对于低置信度翻译结果,先进行标记黄色背景改变与日志记录,再进行人工审核。(暂不考虑)
- 代码位置:在 [AuxiliaryTool/DocumentAutoOptimizationCalibration] 中补充实现,不影响原有功能。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 文档内容国际化转换_优化_计划执行
## 1. 需求概述
### 功能目标
实现将中文内容转换成韩文、法文、日语、俄语、西班牙语、阿拉伯语。
### 代码路径
- `AuxiliaryTool/DocumentAutoOptimizationCalibration`
---
## 2. 语种配置
### 支持的目标语言
```python
LANGUAGE_CODES = {
"韩文": "ko",
"法文": "fr",
"日语": "ja",
"俄语": "ru",
"西班牙语": "es",
"阿拉伯语": "ar"
}
```
---
## 3. 问题分析
### 当前实现状态
1. **支持引擎**:google、baidu、bing
2. **默认配置**:中文(zh) → 英文(en)
3. **语言固定**:目标语言在配置文件中硬编码
### 需要修改的地方
1. **配置模块**(`config.py`):添加多语言支持配置
2. **翻译模块**(`translator.py`):支持动态目标语言
3. **CLI模块**(`cli.py`):添加语言选择参数
4. **国际化模块**(`internationalizer.py`):使用动态目标语言
---
## 4. 解决方案
### 方案概述
1.`config.py` 中添加语种代码映射
2. 在 CLI 中添加 `--to-lang` 参数
3. 修改翻译函数接受动态目标语言参数
4. 更新使用说明文档
### 功能设计
```bash
# 使用示例
python run.py --translate --input "文档.docx" --to-lang ko # 韩文
python run.py --translate --input "文档.docx" --to-lang fr # 法文
python run.py --translate --input "文档.docx" --to-lang ja # 日语
python run.py --translate --input "文档.docx" --to-lang ru # 俄语
python run.py --translate --input "文档.docx" --to-lang es # 西班牙语
python run.py --translate --input "文档.docx" --to-lang ar # 阿拉伯语
```
---
## 5. 实施计划
### 5.1 代码修改
- [ ] 修改 `src/config.py` - 添加语种代码配置
- [ ] 修改 `src/cli.py` - 添加 `--to-lang` 参数
- [ ] 修改 `src/main.py` - 传递目标语言参数
- [ ] 修改 `src/internationalizer.py` - 使用动态目标语言
- [ ] 更新 `README.md` - 添加多语言使用说明
### 5.2 测试验证
- [ ] 测试韩文翻译
- [ ] 测试法文翻译
- [ ] 测试日语翻译
- [ ] 测试俄语翻译
- [ ] 测试西班牙语翻译
- [ ] 测试阿拉伯语翻译
- [ ] 验证排版保持正常
### 5.3 文档更新
- [x] 创建计划执行文档
- [ ] 更新README.md
---
## 6. 代码实现设计
### 6.1 配置文件修改 (`src/config.py`)
```python
# ================================
# 多语言支持配置
# ================================
# 支持的目标语言代码映射
LANGUAGE_CODES = {
"韩文": "ko",
"法文": "fr",
"日语": "ja",
"俄语": "ru",
"西班牙语": "es",
"阿拉伯语": "ar",
"英文": "en" # 保留原有
}
# 语言代码到语言名称的反向映射
LANGUAGE_NAMES = {v: k for k, v in LANGUAGE_CODES.items()}
# 支持的目标语言列表(用于CLI验证)
SUPPORTED_TARGET_LANGUAGES = list(LANGUAGE_CODES.values())
```
### 6.2 CLI修改 (`src/cli.py`)
添加 `--to-lang` 参数:
```python
parser.add_argument(
'--to-lang',
dest='to_lang',
default=TARGET_LANGUAGE,
choices=SUPPORTED_TARGET_LANGUAGES,
metavar='LANG',
help=f'目标语言: {", ".join([f"{k}({v})" for k, v in LANGUAGE_CODES.items()])} (默认: {TARGET_LANGUAGE})'
)
```
### 6.3 主函数修改 (`src/main.py`)
传递目标语言参数:
```python
def main():
# ... 现有代码 ...
if args.translate:
output_path = internationalize_document(
input_path=args.input,
output_path=args.output,
engine=args.translate_engine,
to_lang=args.to_lang # 新增参数
)
```
### 6.4 国际化模块修改 (`src/internationalizer.py`)
修改函数签名,添加目标语言参数:
```python
def internationalize_document(
input_path: str,
output_path: Optional[str] = None,
engine: str = "google",
to_lang: str = "en" # 新增参数,默认英文
) -> str:
"""
文档国际化转换(主函数)
Args:
input_path: 输入文档路径
output_path: 输出文档路径(可选)
engine: 翻译引擎
to_lang: 目标语言代码 (ko, fr, ja, ru, es, ar, en)
Returns:
输出文档路径
"""
# 使用传入的to_lang参数
# 修改所有translate_text调用,传入to_lang参数
```
---
## 7. 注意事项
### 7.1 阿拉伯语特殊处理
- 阿拉伯语是**从右到左(RTL)**书写
- 需要确保Word文档正确显示方向
- 可能需要设置段落方向属性
### 7.2 字体支持
- 某些语言需要特殊字体才能正确显示
- 建议用户安装对应语言的字体包
- 阿拉伯语、俄语需要特殊字体支持
### 7.3 翻译质量
- 机器翻译可能存在误差
- 建议翻译后进行人工校对
- 专业术语可能翻译不准确
### 7.4 API限制
- Bing翻译有请求频率限制
- 大文档翻译需要较长时间
- 建议分段翻译大型文档
---
## 8. 测试计划
### 测试用例
| 编号 | 测试语言 | 命令 | 预期结果 |
|------|----------|------|----------|
| 1 | 韩文 | `--to-lang ko` | 文档内容翻译为韩文 |
| 2 | 法文 | `--to-lang fr` | 文档内容翻译为法文 |
| 3 | 日语 | `--to-lang ja` | 文档内容翻译为日语 |
| 4 | 俄语 | `--to-lang ru` | 文档内容翻译为俄语 |
| 5 | 西班牙语 | `--to-lang es` | 文档内容翻译为西班牙语 |
| 6 | 阿拉伯语 | `--to-lang ar` | 文档内容翻译为阿拉伯语 |
| 7 | 英文(默认) | 不指定参数 | 文档内容翻译为英文 |
### 测试文档
- 测试文档:`testcases/新统一平台自动化部署操作指导.docx`
---
## 9. 实施状态
| 项目 | 状态 | 说明 |
|------|------|------|
| 需求分析 | ✅ 完成 | 需求已明确 |
| 方案设计 | ✅ 完成 | 方案已确定 |
| 计划文档 | ✅ 完成 | 本文档 |
| 代码实现 | ✅ 完成 | 所有文件已修改并验证 |
| 语法验证 | ✅ 完成 | Python语法检查通过 |
| 测试验证 | 待进行 | 需要测试各语言翻译 |
| 文档更新 | 待进行 | 等待测试通过后更新README |
---
## 10. 代码修改记录
### 修改的文件
1. `src/config.py` - 添加多语言配置
2. `src/cli.py` - 添加 `--to-lang` 参数
3. `src/internationalizer.py` - 支持动态目标语言
### 新增配置
```python
# 支持的目标语言代码映射
LANGUAGE_CODES = {
"韩文": "ko",
"法文": "fr",
"日语": "ja",
"俄语": "ru",
"西班牙语": "es",
"阿拉伯语": "ar",
"英文": "en"
}
# 支持的目标语言列表
SUPPORTED_TARGET_LANGUAGES = list(LANGUAGE_CODES.values())
```
### 新增参数
- `--to-lang`: 选择目标语言 (ko, fr, ja, ru, es, ar, en)
---
## 10. 使用说明(更新后)
### 基本用法
```bash
# 翻译为韩文
python run.py --translate --input "文档.docx" --to-lang ko
# 翻译为法文
python run.py --translate --input "文档.docx" --to-lang fr
# 翻译为日语
python run.py --translate --input "文档.docx" --to-lang ja
# 翻译为俄语
python run.py --translate --input "文档.docx" --to-lang ru
# 翻译为西班牙语
python run.py --translate --input "文档.docx" --to-lang es
# 翻译为阿拉伯语
python run.py --translate --input "文档.docx" --to-lang ar
# 翻译为英文(默认)
python run.py --translate --input "文档.docx"
```
### 查看帮助
```bash
python run.py --help
```
### 支持的语言
| 语言 | 代码 | 示例命令 |
|------|------|----------|
| 韩文 | ko | `--to-lang ko` |
| 法文 | fr | `--to-lang fr` |
| 日语 | ja | `--to-lang ja` |
| 俄语 | ru | `--to-lang ru` |
| 西班牙语 | es | `--to-lang es` |
| 阿拉伯语 | ar | `--to-lang ar` |
| 英文 | en | 默认 |
---
## 11. 后续优化
- [ ] 支持更多语种
- [ ] 添加术语库功能
- [ ] 实现置信度判断
- [ ] 支持批量文档翻译
- [ ] 添加翻译进度条
- [ ] 支持翻译记忆功能
# 需求文档
## 需求背景与目标
### 1.1 背景
当前 generate_testcases.py 脚本在执行时始终显示浏览器界面,不适用于 CI/CD 环境、服务器后台执行或批量生成场景。需要增加命令行参数控制浏览器是否以无头模式运行。
### 1.2 目标
通过命令参数控制是否展示浏览器页面。
## 2. 功能需求
- 通过命令参数控制是否展示浏览器页面。
- 参数定义:`--headless`
- 参数类型:布尔型
- 默认行为:默认为显示浏览器页面。
- 使用示例:
- 有界面模式:`python generate_testcases.py`
- 无界面模式:`python generate_testcases.py --headless`
- 功能实现:
- 有界面模式与无界面模式的实现逻辑一致,通过命令参数控制是否展示浏览器页面。
- 无界面模式下调试快照功能仍然生效。
### 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
*文档结束*
\ No newline at end of file
# 计划执行文档
## 需求文档
- 需求文档: `Docs/PRD/生成自动化测试用例/_PRD_控制是否展示页面_优化需求文档.md`
## 实现计划
### 1. 需求概述
`generate_testcases.py` 脚本添加命令行参数 `--headless`,控制浏览器是否以无头模式运行。
### 2. 实现步骤
#### 步骤1:导入 argparse 模块
在文件头部添加命令行参数解析模块的导入。
#### 步骤2:添加命令行参数解析函数
创建 `parse_args()` 函数,定义 `--headless` 参数:
- 参数名:`--headless`
- 类型:布尔型
- 默认值:`False`(显示浏览器)
- 帮助信息:说明无头模式的作用
#### 步骤3:修改 init_driver 方法
- 接收 headless 参数
- 根据 headless 参数值决定是否添加 `--headless` 选项到 Chrome
- 添加日志记录当前运行模式
#### 步骤4:修改 main 函数
- 调用 `parse_args()` 获取命令行参数
- 将 headless 参数传递给 TestCaseGenerator 实例
- 在启动时显示运行模式信息
### 3. 文件修改
- 文件路径: `AuxiliaryTool/TestCaseGenerator/generate_testcases.py`
- 修改位置:
- 第8行附近:添加 `argparse` 导入
- `TestCaseGenerator` 类:修改 `__init__` 方法接收 headless 参数
- `init_driver` 方法:添加无头模式逻辑
- 新增 `parse_args()` 函数
- `main()` 函数:集成参数解析
### 4. 代码规范遵循
- [x] 所有代码添加中文注释
- [x] 新功能不影响原有功能(默认行为保持显示浏览器)
- [x] 添加详细的日志记录(INFO级别)
### 5. 测试验证
- [ ] 有界面模式:`python generate_testcases.py`(不传参数)
- [ ] 无界面模式:`python generate_testcases.py --headless`
- [ ] 验证调试快照功能在无头模式下仍生效
### 6. 预期输出
```
============================================================
自动化测试用例生成器
============================================================
运行模式: 有界面模式
✓ 加载系统配置: 2 个
✓ 加载模块配置: 2 个
✓ 浏览器驱动初始化完成
...
```
或无界面模式:
```
============================================================
自动化测试用例生成器
============================================================
运行模式: 无界面模式
✓ 加载系统配置: 2 个
✓ 加载模块配置: 2 个
✓ 浏览器驱动初始化完成(无头模式)
...
```
---
## 执行记录
### 任务清单
- [ ] Step 1: 添加 argparse 导入
- [ ] Step 2: 添加 parse_args() 函数
- [ ] Step 3: 修改 TestCaseGenerator.__init__ 接收 headless 参数
- [ ] Step 4: 修改 init_driver 方法实现无头模式
- [ ] Step 5: 修改 main 函数集成参数解析
- [ ] Step 6: 测试验证
---
*文档创建时间:2026-03-11*
# 生成自动化测试用例
## 代码路径
- 代码路径:[AuxiliaryTool/FunctionalTestReportGeneration]
## 功能需求
### 功能目标
**目标:** 通过测试用例+BUG列表+功能测试报告模板生成项目功能测试报告。
### 需求描述
#### 模板文件获取
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.md][AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.docx]
- BUG列表数据模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/BUG列表模板数据.xlsx]
- 功能测试用例模板: [AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试用例模板.xlsx]
#### 测试数据获取
-[AuxiliaryTool/FunctionalTestReportGeneration/testcases]路径下获取测试用例与BUG列表数据,可通过用户输入指定。
#### 测试报告生成
- 根据测试执行结果,自动填充功能测试报告模板,生成完整的测试报告。
- 根据BUG列表数据,自动统计BUG数量和等级分布,并填充到测试报告中。
- 根据功能测试用例,自动统计用例执行情况,并填充到测试报告中。
### 测试报告生成逻辑
#### 交互方式
- 程序交互方式:通过命令行窗口、命令行参数进行交互输入执行。
#### 数据格式获取
- 数据格式确认:通过读取BUG列表模板文件与功能测试用例模板文件,确认数据格式。
- 数据获取:通过用户输入指定测试数据路径,获取测试数据,测试用例文件与BUG列表文件。测试用例文件数据从第4行开始读取,BUG列表数据从第2行开始读取。
- 批量测试执行(暂不实现):通过批量执行功能测试用例,批量生成功能测试报告。
- 项目名称获取:通过读取BUG列表中'项目名称'字段,获取项目名称。
#### 数据定义
- 测试用例文件中定义用例执行结果状态分为:通过、失败、未验证与未开发。
- BUG列表文件中定义BUG状态分为:激活、已解决与已关闭。
- 日期格式定义:日期格式统一为YYYY年MM月DD日。
#### 统计与关联规则
- 用例-BUG关联规则:通过获取BUG列表复现步骤中的用例编号,关联BUG列表数据,获取关联的BUG信息。
- 遗留BUG定义:BUG列表文件中,状态为激活与已解决的BUG定义为遗留BUG。
- 通过率计算规则:通过用例数量 / 总用例数量 * 100%,保留两位小数。
#### 报告内容
- 自动填充规则:测试概览、被测系统信息、测试结论、测试建议、测试环境信息为空,在报告中显示“未填写”,其余为必填字段。
- 图标绘制规则:绘制BUG等级分布、用例执行结果分布、用例通过率图表,使用matplotlib库进行图表绘制。
#### 文档输出规则
- 报告输出格式:输出Word和md文档格式。
- 报告输出位置:输出到[AuxiliaryTool/FunctionalTestReportGeneration/reports]
- 报告命名规则:{项目名称}_功能测试报告_{日期}.docx或{项目名称}_功能测试报告_{日期}.md。
- 报告编号规则:{项目名称}-{日期}
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论