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

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

- 新增多语言支持包括韩文、法文、日语、俄语、西班牙语、阿拉伯语
- 添加 --to-lang 命令行参数用于指定目标翻译语言
- 集成 bing 翻译引擎作为默认引擎以支持国内网络环境
- 更新文档国际化转换功能支持多种目标语言格式
- 修改输出文件命名规则包含目标语言标识
- 完善 README 文档中的多语言翻译使用说明
- 重构翻译函数支持动态目标语言参数传递
- 优化 CLI 参数配置支持语言选择功能
上级 4c08eec7
......@@ -125,7 +125,8 @@
"mcp__chrome-devtools__fill_form",
"Bash(grep:*)",
"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 @@
- **表格格式统一**:统一表格字体、字号、对齐方式、边框样式
- **页眉页脚设置**:自动添加页眉(文件名)和页脚(页码格式)
#### 国际化转换功能(新增)
- **文档翻译**:将中文文档自动翻译为英文
#### 国际化转换功能
- **多语言翻译**:支持将中文翻译为韩文、法文、日语、俄语、西班牙语、阿拉伯语、英文
- **保留格式**:翻译过程中保留原有排版和样式
- **多引擎支持**:支持Google、百度、必应翻译引擎
- **批量翻译**:支持段落、表格批量翻译
- **批量翻译**:支持段落、表格、页眉页脚、文本框批量翻译
- **目录更新**:自动翻译目录内容
### 设计原则
......@@ -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
python run.py --translate --input 文档.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
python run.py --translate --translate-engine bing --input 文档.docx
python run.py --translate --to-lang ja --input 文档.docx
```
输出:`reports/文档_日语版.docx`
#### 3. 使用百度翻译引擎
#### 5. 翻译为俄语
```bash
python run.py --translate --translate-engine baidu --input 文档.docx
python run.py --translate --to-lang ru --input 文档.docx
```
输出:`reports/文档_俄语版.docx`
#### 4. 使用谷歌翻译引擎(大陆可能不可用)
#### 6. 翻译为西班牙语
```bash
python run.py --translate --translate-engine google --input 文档.docx
python run.py --translate --to-lang es --input 文档.docx
```
输出:`reports/文档_西班牙语版.docx`
#### 5. 翻译并指定输出路径
#### 7. 翻译为阿拉伯语
```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
# 示例1:翻译为英文(使用必应引擎)
python run.py --translate --translate-engine bing --input "testcases/文档.docx"
# 示例1:翻译为韩文(默认使用bing引擎)
python run.py --translate --to-lang ko --input "testcases/文档.docx"
# 示例2:翻译为法文
python run.py --translate --to-lang fr --input "testcases/文档.docx"
# 示例2:翻译大型文档
python run.py --translate --translate-engine baidu --input "testcases/新统一平台自动化部署操作指导.docx"
# 示例3:翻译为日语
python run.py --translate --to-lang ja --input "testcases/新统一平台自动化部署操作指导.docx"
# 示例3:查看翻译详细日志
python run.py --translate --translate-engine bing --input "testcases/文档.docx" --log-level DEBUG
# 示例4:翻译为俄语
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 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ 可用 | 技术文档翻译 |
| baidu | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 可用 | 快速翻译 |
| google | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ❌ 不可用 | 高质量翻译(需科学上网) |
| 引擎 | 速度 | 质量 | 国内可用性 | 默认 | 推荐场景 |
|------|------|------|-----------|------|---------|
| bing | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ 可用 | ✅ 是 | 技术文档翻译(推荐) |
| baidu | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 可用 | - | 快速翻译 |
| google | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ❌ 不可用 | - | 高质量翻译(需科学上网) |
> **注意**:默认使用 bing 引擎,确保在国内网络环境下可用。如需使用其他引擎,请通过 `--translate-engine` 参数指定。
---
......@@ -209,6 +278,7 @@ python run.py --translate --translate-engine bing --input "testcases/文档.docx
| `--list` | `-l` | 仅列出可用文档 | `--list` |
| `--translate` | `-t` | 启用翻译模式 | `--translate` |
| `--translate-engine` | - | 翻译引擎(google/baidu/bing) | `--translate-engine bing` |
| `--to-lang` | - | 目标语言(ko/fr/ja/ru/es/ar/en) | `--to-lang fr` |
| `--help` | `-h` | 显示帮助信息 | `--help` |
---
......@@ -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.1.0 | 2026-03-10 | 新增文档国际化转换功能,支持中英翻译 |
| v1.0.0 | 2025-03-10 | 初始版本,支持基础格式优化 |
......@@ -339,6 +411,7 @@ python run.py --input "文档.docx" --footer-start-section 3
- [ ] 支持自动目录更新
### 国际化翻译
- [x] 支持多种目标语言(韩文、法文、日语、俄语、西班牙语、阿拉伯语、英文)
- [ ] 支持更多翻译引擎(DeepL免费版等)
- [ ] 支持自定义术语词典
- [ ] 支持翻译记忆功能
......
......@@ -17,6 +17,10 @@ from src.config import (
LOG_DATE_FORMAT,
DEFAULT_TRANSLATE_ENGINE,
SUPPORTED_ENGINES,
LANGUAGE_CODES,
LANGUAGE_NAMES,
SUPPORTED_TARGET_LANGUAGES,
TARGET_LANGUAGE,
)
from src.optimizer import optimize_document
from src.internationalizer import internationalize_document
......@@ -125,6 +129,8 @@ def parse_command_line() -> argparse.Namespace:
示例用法(国际化翻译):
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 ... # 指定翻译引擎
注意:
......@@ -199,6 +205,16 @@ def parse_command_line() -> argparse.Namespace:
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()
......@@ -252,13 +268,15 @@ def run_cli(args: argparse.Namespace) -> int:
if args.translate_mode:
# ==================== 翻译模式 ====================
print(f"\n使用翻译引擎: {args.translate_engine}")
print(f"目标语言: {LANGUAGE_NAMES.get(args.to_lang, args.to_lang)}")
print("翻译过程中,请耐心等待...")
try:
result_path = internationalize_document(
input_path=input_path,
output_path=output_path,
engine=args.translate_engine
engine=args.translate_engine,
to_lang=args.to_lang
)
print("\n" + "=" * 60)
......
......@@ -109,15 +109,35 @@ LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
# ================================
# 翻译配置
# ================================
# 默认翻译引擎
DEFAULT_TRANSLATE_ENGINE = "google" # google, baidu, bing
# 默认翻译引擎(使用bing以支持国内网络环境)
DEFAULT_TRANSLATE_ENGINE = "bing" # google, baidu, bing
# 支持的翻译引擎
SUPPORTED_ENGINES = ["google", "baidu", "bing"]
# 源语言和目标语言
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
......@@ -137,7 +157,7 @@ TRANSLATE_TIMEOUT = 10
# ================================
# 版本信息
# ================================
__version__ = "1.1.0"
__version__ = "1.3.1"
__author__ = "Document Optimizer"
__description__ = "文档自动优化校准工具"
......
......@@ -21,6 +21,7 @@ from src.config import (
REPORTS_DIR,
SOURCE_LANGUAGE,
TARGET_LANGUAGE,
LANGUAGE_NAMES,
)
from src.translator import (
translate_text,
......@@ -62,13 +63,14 @@ def _is_heading_paragraph(paragraph) -> Optional[int]:
return None
def _translate_paragraph(paragraph, engine: str) -> bool:
def _translate_paragraph(paragraph, engine: str, to_lang: str = TARGET_LANGUAGE) -> bool:
"""
翻译段落内容
Args:
paragraph: 段落对象
engine: 翻译引擎
to_lang: 目标语言代码
Returns:
是否成功翻译
......@@ -93,7 +95,7 @@ def _translate_paragraph(paragraph, engine: str) -> bool:
paragraph.text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != paragraph.text:
......@@ -125,13 +127,14 @@ def _translate_paragraph(paragraph, engine: str) -> bool:
return False
def _translate_table_cell(cell, engine: str) -> bool:
def _translate_table_cell(cell, engine: str, to_lang: str = TARGET_LANGUAGE) -> bool:
"""
翻译表格单元格内容
Args:
cell: 单元格对象
engine: 翻译引擎
to_lang: 目标语言代码
Returns:
是否成功翻译
......@@ -149,7 +152,7 @@ def _translate_table_cell(cell, engine: str) -> bool:
cell.text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != cell.text:
......@@ -173,13 +176,14 @@ def _translate_table_cell(cell, engine: str) -> bool:
return False
def _translate_table(table, engine: str) -> int:
def _translate_table(table, engine: str, to_lang: str = TARGET_LANGUAGE) -> int:
"""
翻译表格内容
Args:
table: 表格对象
engine: 翻译引擎
to_lang: 目标语言代码
Returns:
成功翻译的单元格数量
......@@ -188,7 +192,7 @@ def _translate_table(table, engine: str) -> int:
for row in table.rows:
for cell in row.cells:
if _translate_table_cell(cell, engine):
if _translate_table_cell(cell, engine, to_lang):
translated_count += 1
logger.debug("表格翻译完成: %d 个单元格", translated_count)
......@@ -197,7 +201,8 @@ def _translate_table(table, engine: str) -> int:
def _translate_header_footer_part(header_footer, engine: str,
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,
engine: 翻译引擎
translated_filename: 翻译后的文件名(用于页眉)
original_filename: 原文件名(用于判断是否需要替换)
to_lang: 目标语言代码
Returns:
成功翻译的内容数量(段落+表格单元格+文本框)
......@@ -270,7 +276,7 @@ def _translate_header_footer_part(header_footer, engine: str,
original_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != original_text:
......@@ -293,7 +299,7 @@ def _translate_header_footer_part(header_footer, engine: str,
for table in header_footer.tables:
for row in table.rows:
for cell in row.cells:
if _translate_table_cell(cell, engine):
if _translate_table_cell(cell, engine, to_lang):
table_cell_count += 1
if table_cell_count > 0:
......@@ -317,7 +323,7 @@ def _translate_header_footer_part(header_footer, engine: str,
original_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != original_text:
......@@ -350,7 +356,7 @@ def _translate_header_footer_part(header_footer, engine: str,
original_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != original_text:
......@@ -373,13 +379,14 @@ def _translate_header_footer_part(header_footer, engine: str,
return translated_count
def _preserve_hyperlinks(paragraph, engine: str) -> None:
def _preserve_hyperlinks(paragraph, engine: str, to_lang: str = TARGET_LANGUAGE) -> None:
"""
保留超链接并翻译锚文本
Args:
paragraph: 段落对象
engine: 翻译引擎
to_lang: 目标语言代码
"""
# 超链接检查需要通过XML元素进行
from docx.oxml import parse_xml
......@@ -401,7 +408,7 @@ def _preserve_hyperlinks(paragraph, engine: str) -> None:
original_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != original_text:
run.text = translated_text
......@@ -452,13 +459,14 @@ def _find_all_textboxes(document):
yield txbx_content
def _translate_textboxes(document, engine: str) -> int:
def _translate_textboxes(document, engine: str, to_lang: str = TARGET_LANGUAGE) -> int:
"""
翻译文档中所有文本框内容
Args:
document: Document对象
engine: 翻译引擎
to_lang: 目标语言代码
Returns:
成功翻译的文本框段落数量
......@@ -502,7 +510,7 @@ def _translate_textboxes(document, engine: str) -> int:
original_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != original_text:
......@@ -603,7 +611,7 @@ def _find_toc_paragraphs(document):
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:
Args:
document: Document对象
engine: 翻译引擎
to_lang: 目标语言代码
Returns:
成功翻译的目录条目数量
......@@ -660,7 +669,7 @@ def _translate_toc_manual(document, engine: str) -> int:
title_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_title and translated_title != title_text:
......@@ -696,7 +705,7 @@ def _translate_toc_manual(document, engine: str) -> int:
original_text,
engine=engine,
from_lang=SOURCE_LANGUAGE,
to_lang=TARGET_LANGUAGE
to_lang=to_lang
)
if translated_text and translated_text != original_text:
......@@ -778,7 +787,8 @@ def _update_fields_via_win32com(doc_path: str) -> bool:
def internationalize_document(
input_path: str,
output_path: Optional[str] = None,
engine: str = "google"
engine: str = "google",
to_lang: str = "en"
) -> str:
"""
文档国际化转换(主函数)
......@@ -787,6 +797,7 @@ def internationalize_document(
input_path: 输入文档路径
output_path: 输出文档路径(可选,默认为reports/目录下同名文件)
engine: 翻译引擎
to_lang: 目标语言代码 (ko, fr, ja, ru, es, ar, en)
Returns:
输出文档路径
......@@ -800,9 +811,12 @@ def internationalize_document(
# 获取文件名(不含扩展名)
filename = input_file.stem
# 根据目标语言确定输出文件后缀
lang_suffix = LANGUAGE_NAMES.get(to_lang, to_lang)
# 设置输出路径
if output_path is None:
output_file = REPORTS_DIR / f"{filename}_英文版.docx"
output_file = REPORTS_DIR / f"{filename}_{lang_suffix}版.docx"
else:
output_file = Path(output_path)
......@@ -811,6 +825,7 @@ def internationalize_document(
logger.info("开始国际化转换: %s", input_path)
logger.info("使用翻译引擎: %s", engine)
logger.info("目标语言: %s (%s)", LANGUAGE_NAMES.get(to_lang, to_lang), to_lang)
logger.info("输出路径: %s", output_file)
# 读取源文档
......@@ -831,10 +846,10 @@ def internationalize_document(
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
logger.info("段落翻译完成: 总数=%d, 翻译=%d", paragraph_count, translated_paragraph_count)
......@@ -842,33 +857,33 @@ def internationalize_document(
# 遍历所有表格进行翻译
for table in doc.tables:
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)
# 生成翻译后的文件名(用于页眉)
# 尝试翻译文件名,如果失败则使用默认格式
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:
translated_filename = f"{filename} (English)"
translated_filename = f"{filename} ({LANGUAGE_NAMES.get(to_lang, to_lang)})"
except Exception:
translated_filename = f"{filename} (English)"
translated_filename = f"{filename} ({LANGUAGE_NAMES.get(to_lang, to_lang)})"
# 处理页眉页脚翻译
header_footer_count = 0
for section in doc.sections:
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(
section.footer, engine, None, None
section.footer, engine, None, None, to_lang
)
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))
......@@ -883,7 +898,7 @@ def internationalize_document(
# 方案B:手动翻译目录
logger.info("win32com不可用,使用手动目录翻译...")
doc = Document(output_file)
toc_count = _translate_toc_manual(doc, engine)
toc_count = _translate_toc_manual(doc, engine, to_lang)
if toc_count > 0:
doc.save(str(output_file))
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 @@
import json
import time
import os
import argparse
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
......@@ -20,11 +21,17 @@ from selenium.common.exceptions import TimeoutException, NoSuchElementException
class TestCaseGenerator:
"""测试用例生成器"""
def __init__(self):
def __init__(self, headless=False):
"""初始化测试用例生成器
Args:
headless: 是否使用无头模式(不显示浏览器界面),默认为False
"""
self.base_dir = os.path.dirname(os.path.abspath(__file__))
self.config_dir = os.path.join(self.base_dir, 'config')
self.testcases_dir = os.path.join(self.base_dir, 'testcases')
self.driver = None
self.headless = headless # 保存无头模式配置
# 确保目录存在
os.makedirs(self.config_dir, exist_ok=True)
......@@ -44,7 +51,14 @@ class TestCaseGenerator:
def init_driver(self):
"""初始化浏览器驱动"""
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('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
......@@ -57,7 +71,6 @@ class TestCaseGenerator:
self.driver = webdriver.Chrome(options=options)
self.driver.implicitly_wait(10)
print("✓ 浏览器驱动初始化完成")
def handle_ssl_warning(self):
"""处理SSL证书警告页面"""
......@@ -687,6 +700,9 @@ class TestCaseGenerator:
"""执行生成流程"""
print("=" * 60)
print("自动化测试用例生成器")
# 显示当前运行模式
mode = "无界面模式" if self.headless else "有界面模式"
print(f"运行模式: {mode}")
print("=" * 60)
# 加载配置
......@@ -738,9 +754,36 @@ class TestCaseGenerator:
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():
"""主函数"""
generator = TestCaseGenerator()
# 解析命令行参数
args = parse_args()
# 根据参数创建生成器实例
generator = TestCaseGenerator(headless=args.headless)
try:
generator.run()
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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论