Showing
3 changed files
with
172 additions
and
17 deletions
| ... | @@ -727,6 +727,23 @@ const formatCurrency = (amount: number) => { | ... | @@ -727,6 +727,23 @@ const formatCurrency = (amount: number) => { |
| 727 | return '¥' + amount.toFixed(2) | 727 | return '¥' + amount.toFixed(2) |
| 728 | } | 728 | } |
| 729 | 729 | ||
| 730 | +// 格式化日期时间为后端需要的格式 (YYYY-MM-DD HH:MM:SS) | ||
| 731 | +const formatDateTimeForBackend = (dateTimeString: string) => { | ||
| 732 | + if (!dateTimeString) return '' | ||
| 733 | + | ||
| 734 | + if (dateTimeString.includes('T')) { | ||
| 735 | + // 将 YYYY-MM-DDTHH:MM 格式转换为 YYYY-MM-DD HH:MM:SS 格式 | ||
| 736 | + let formatted = dateTimeString.replace('T', ' ') | ||
| 737 | + // 确保时间格式包含秒数,如果只有 HH:MM 则添加 :00 | ||
| 738 | + if (formatted.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/)) { | ||
| 739 | + formatted += ':00' | ||
| 740 | + } | ||
| 741 | + return formatted | ||
| 742 | + } | ||
| 743 | + | ||
| 744 | + return dateTimeString | ||
| 745 | +} | ||
| 746 | + | ||
| 730 | // 消息提示 | 747 | // 消息提示 |
| 731 | const showMessage = (message: string, type: 'success' | 'error' | 'warning' = 'success') => { | 748 | const showMessage = (message: string, type: 'success' | 'error' | 'warning' = 'success') => { |
| 732 | console.log(`${type}: ${message}`) | 749 | console.log(`${type}: ${message}`) |
| ... | @@ -1048,11 +1065,7 @@ const calculateEditDeliveryItemTotal = (index: number) => { | ... | @@ -1048,11 +1065,7 @@ const calculateEditDeliveryItemTotal = (index: number) => { |
| 1048 | const handleSubmitAdd = async () => { | 1065 | const handleSubmitAdd = async () => { |
| 1049 | try { | 1066 | try { |
| 1050 | // 处理日期时间格式,将datetime-local格式转换为后端需要的格式 | 1067 | // 处理日期时间格式,将datetime-local格式转换为后端需要的格式 |
| 1051 | - let formattedDeliveryDate = addFormData.deliveryDate | 1068 | + const formattedDeliveryDate = formatDateTimeForBackend(addFormData.deliveryDate) |
| 1052 | - if (formattedDeliveryDate && formattedDeliveryDate.includes('T')) { | ||
| 1053 | - // 将 YYYY-MM-DDTHH:MM:SS 格式转换为 YYYY-MM-DD HH:MM:SS 格式 | ||
| 1054 | - formattedDeliveryDate = formattedDeliveryDate.replace('T', ' ') | ||
| 1055 | - } | ||
| 1056 | 1069 | ||
| 1057 | // 构造新增出库的请求数据 | 1070 | // 构造新增出库的请求数据 |
| 1058 | const deliveryData: DeliveryAddReq = { | 1071 | const deliveryData: DeliveryAddReq = { |
| ... | @@ -1102,11 +1115,7 @@ const handleSubmitAdd = async () => { | ... | @@ -1102,11 +1115,7 @@ const handleSubmitAdd = async () => { |
| 1102 | const handleSubmitEdit = async () => { | 1115 | const handleSubmitEdit = async () => { |
| 1103 | try { | 1116 | try { |
| 1104 | // 处理日期时间格式,将datetime-local格式转换为后端需要的格式 | 1117 | // 处理日期时间格式,将datetime-local格式转换为后端需要的格式 |
| 1105 | - let formattedDeliveryDate = editFormData.deliveryDate | 1118 | + const formattedDeliveryDate = formatDateTimeForBackend(editFormData.deliveryDate) |
| 1106 | - if (formattedDeliveryDate && formattedDeliveryDate.includes('T')) { | ||
| 1107 | - // 将 YYYY-MM-DDTHH:MM:SS 格式转换为 YYYY-MM-DD HH:MM:SS 格式 | ||
| 1108 | - formattedDeliveryDate = formattedDeliveryDate.replace('T', ' ') | ||
| 1109 | - } | ||
| 1110 | 1119 | ||
| 1111 | // 构造编辑出库的请求数据 | 1120 | // 构造编辑出库的请求数据 |
| 1112 | const deliveryData = { | 1121 | const deliveryData = { | ... | ... |
tests/browser/test_delivery_management.py
0 → 100644
This diff is collapsed. Click to expand it.
| ... | @@ -9,7 +9,9 @@ from datetime import datetime | ... | @@ -9,7 +9,9 @@ from datetime import datetime |
| 9 | from typing import List, Dict, Any | 9 | from typing import List, Dict, Any |
| 10 | 10 | ||
| 11 | from test_login import run_login_tests | 11 | from test_login import run_login_tests |
| 12 | -from test_order_management import run_order_management_tests | 12 | +from test_order_management import run_order_management_tests, OrderManagementTest |
| 13 | +from test_delivery_management import run_delivery_management_tests, DeliveryManagementTest | ||
| 14 | +from base_test import BaseBrowserTest | ||
| 13 | 15 | ||
| 14 | 16 | ||
| 15 | class SimpleTestRunner: | 17 | class SimpleTestRunner: |
| ... | @@ -282,6 +284,150 @@ class SimpleTestRunner: | ... | @@ -282,6 +284,150 @@ class SimpleTestRunner: |
| 282 | 284 | ||
| 283 | return report_file | 285 | return report_file |
| 284 | 286 | ||
| 287 | + def run_shared_browser_tests(self) -> List[Dict[str, Any]]: | ||
| 288 | + """运行共享浏览器实例的测试(订单管理 + 出库管理)""" | ||
| 289 | + print("🚀 开始运行共享浏览器测试...") | ||
| 290 | + print("=" * 60) | ||
| 291 | + | ||
| 292 | + all_results = [] | ||
| 293 | + shared_browser = None | ||
| 294 | + | ||
| 295 | + try: | ||
| 296 | + # 创建共享的浏览器实例 | ||
| 297 | + shared_browser = BaseBrowserTest(headless=False, slow_mo=500) | ||
| 298 | + shared_browser.setup_browser() | ||
| 299 | + | ||
| 300 | + # 手动登录一次 | ||
| 301 | + print("开始登录...") | ||
| 302 | + shared_browser.navigate_to(shared_browser.base_url) | ||
| 303 | + shared_browser.fill_input('input[placeholder="请输入用户名"]', 'admin') | ||
| 304 | + shared_browser.fill_input('input[placeholder="请输入密码"]', 'password') | ||
| 305 | + shared_browser.click_element('button:has-text("登录")') | ||
| 306 | + shared_browser.page.wait_for_timeout(5000) | ||
| 307 | + | ||
| 308 | + # 检查登录是否成功 | ||
| 309 | + current_url = shared_browser.page.url | ||
| 310 | + if 'dashboard' in current_url: | ||
| 311 | + print("✅ 登录成功") | ||
| 312 | + login_success = True | ||
| 313 | + else: | ||
| 314 | + print(f"❌ 登录失败,当前URL: {current_url}") | ||
| 315 | + login_success = False | ||
| 316 | + | ||
| 317 | + if not login_success: | ||
| 318 | + print("❌ 登录失败,无法运行共享浏览器测试") | ||
| 319 | + return [] | ||
| 320 | + | ||
| 321 | + # 1. 运行订单管理测试(使用共享浏览器) | ||
| 322 | + print("\n📋 运行订单管理测试(共享浏览器)...") | ||
| 323 | + try: | ||
| 324 | + order_test = OrderManagementTest(headless=False, slow_mo=500) | ||
| 325 | + # 直接使用已创建的浏览器实例 | ||
| 326 | + order_test.browser = shared_browser.browser | ||
| 327 | + order_test.page = shared_browser.page | ||
| 328 | + order_test.context = shared_browser.context | ||
| 329 | + | ||
| 330 | + # 导航到订单管理页面 | ||
| 331 | + order_test.navigate_to(f'{order_test.base_url}/main/order') | ||
| 332 | + order_test.wait_for_element('.order-container', timeout=15000) | ||
| 333 | + print("✅ 成功进入订单管理页面") | ||
| 334 | + | ||
| 335 | + # 运行订单管理测试用例 | ||
| 336 | + order_results = self._run_test_cases(order_test, [ | ||
| 337 | + ("订单列表显示测试", order_test.test_order_list_display), | ||
| 338 | + ("按订单编号搜索测试", order_test.test_order_search_by_order_no), | ||
| 339 | + ("按经销商搜索测试", order_test.test_order_search_by_dealer), | ||
| 340 | + ("订单状态筛选测试", order_test.test_order_status_filter), | ||
| 341 | + ("重置搜索测试", order_test.test_reset_search), | ||
| 342 | + ("分页功能测试", order_test.test_pagination), | ||
| 343 | + ("表格操作测试", order_test.test_table_operations), | ||
| 344 | + ("新增订单功能测试", order_test.test_add_order), | ||
| 345 | + ("编辑订单功能测试", order_test.test_edit_order), | ||
| 346 | + ("查看订单功能测试", order_test.test_view_order), | ||
| 347 | + ]) | ||
| 348 | + | ||
| 349 | + all_results.extend(order_results) | ||
| 350 | + print(f"✅ 订单管理测试完成,共 {len(order_results)} 个测试") | ||
| 351 | + except Exception as e: | ||
| 352 | + print(f"❌ 订单管理测试执行失败: {e}") | ||
| 353 | + | ||
| 354 | + # 2. 运行出库管理测试(使用同一个浏览器实例) | ||
| 355 | + print("\n📋 运行出库管理测试(共享浏览器)...") | ||
| 356 | + try: | ||
| 357 | + delivery_test = DeliveryManagementTest(headless=False, slow_mo=500) | ||
| 358 | + # 直接使用已创建的浏览器实例 | ||
| 359 | + delivery_test.browser = shared_browser.browser | ||
| 360 | + delivery_test.page = shared_browser.page | ||
| 361 | + delivery_test.context = shared_browser.context | ||
| 362 | + | ||
| 363 | + # 导航到出库管理页面 | ||
| 364 | + delivery_test.navigate_to(f'{delivery_test.base_url}/main/delivery') | ||
| 365 | + delivery_test.wait_for_element('.delivery-container', timeout=15000) | ||
| 366 | + print("✅ 成功进入出库管理页面") | ||
| 367 | + | ||
| 368 | + # 运行出库管理测试用例 | ||
| 369 | + delivery_results = self._run_test_cases(delivery_test, [ | ||
| 370 | + ("按出库单编号搜索测试", delivery_test.test_delivery_search_by_delivery_no), | ||
| 371 | + ("按经销商搜索测试", delivery_test.test_delivery_search_by_dealer), | ||
| 372 | + ("出库状态筛选测试", delivery_test.test_delivery_status_filter), | ||
| 373 | + ("重置搜索测试", delivery_test.test_delivery_reset_search), | ||
| 374 | + ("表格操作测试", delivery_test.test_delivery_table_operations), | ||
| 375 | + ("新增出库功能测试", delivery_test.test_add_delivery), | ||
| 376 | + ("编辑出库功能测试", delivery_test.test_edit_delivery), | ||
| 377 | + ("查看出库功能测试", delivery_test.test_view_delivery), | ||
| 378 | + ]) | ||
| 379 | + | ||
| 380 | + all_results.extend(delivery_results) | ||
| 381 | + print(f"✅ 出库管理测试完成,共 {len(delivery_results)} 个测试") | ||
| 382 | + except Exception as e: | ||
| 383 | + print(f"❌ 出库管理测试执行失败: {e}") | ||
| 384 | + | ||
| 385 | + finally: | ||
| 386 | + # 最后关闭共享浏览器 | ||
| 387 | + if shared_browser: | ||
| 388 | + shared_browser.teardown_browser() | ||
| 389 | + print("✅ 共享浏览器已关闭") | ||
| 390 | + | ||
| 391 | + return all_results | ||
| 392 | + | ||
| 393 | + def _run_test_cases(self, test_instance, test_cases): | ||
| 394 | + """运行测试用例的通用方法""" | ||
| 395 | + results = [] | ||
| 396 | + for test_name, test_func in test_cases: | ||
| 397 | + print(f"\n{'='*50}") | ||
| 398 | + print(f"开始测试: {test_name}") | ||
| 399 | + print(f"{'='*50}") | ||
| 400 | + | ||
| 401 | + start_time = datetime.now() | ||
| 402 | + result = { | ||
| 403 | + 'test_name': test_name, | ||
| 404 | + 'start_time': start_time.isoformat(), | ||
| 405 | + 'success': False, | ||
| 406 | + 'error': None, | ||
| 407 | + 'screenshots': [], | ||
| 408 | + 'duration': 0 | ||
| 409 | + } | ||
| 410 | + | ||
| 411 | + try: | ||
| 412 | + test_func() | ||
| 413 | + result['success'] = True | ||
| 414 | + print(f"✅ 测试通过: {test_name}") | ||
| 415 | + except Exception as e: | ||
| 416 | + result['error'] = str(e) | ||
| 417 | + print(f"❌ 测试失败: {test_name}") | ||
| 418 | + print(f"错误信息: {e}") | ||
| 419 | + screenshot_path = test_instance.take_screenshot(f'{test_name}_error') | ||
| 420 | + result['screenshots'].append(screenshot_path) | ||
| 421 | + finally: | ||
| 422 | + end_time = datetime.now() | ||
| 423 | + result['end_time'] = end_time.isoformat() | ||
| 424 | + result['duration'] = (end_time - start_time).total_seconds() | ||
| 425 | + print(f"测试耗时: {result['duration']:.2f}秒") | ||
| 426 | + | ||
| 427 | + results.append(result) | ||
| 428 | + | ||
| 429 | + return results | ||
| 430 | + | ||
| 285 | def run_all_tests(self) -> List[Dict[str, Any]]: | 431 | def run_all_tests(self) -> List[Dict[str, Any]]: |
| 286 | """运行所有测试 - 顺序执行""" | 432 | """运行所有测试 - 顺序执行""" |
| 287 | print("🚀 开始运行浏览器自动化测试...") | 433 | print("🚀 开始运行浏览器自动化测试...") |
| ... | @@ -298,14 +444,14 @@ class SimpleTestRunner: | ... | @@ -298,14 +444,14 @@ class SimpleTestRunner: |
| 298 | except Exception as e: | 444 | except Exception as e: |
| 299 | print(f"❌ 登录测试执行失败: {e}") | 445 | print(f"❌ 登录测试执行失败: {e}") |
| 300 | 446 | ||
| 301 | - # 2. 运行订单管理测试 | 447 | + # 2. 运行共享浏览器测试(订单管理 + 出库管理) |
| 302 | - print("\n📋 运行订单管理测试...") | 448 | + print("\n📋 运行共享浏览器测试...") |
| 303 | try: | 449 | try: |
| 304 | - order_results = run_order_management_tests() | 450 | + shared_results = self.run_shared_browser_tests() |
| 305 | - all_results.extend(order_results) | 451 | + all_results.extend(shared_results) |
| 306 | - print(f"✅ 订单管理测试完成,共 {len(order_results)} 个测试") | 452 | + print(f"✅ 共享浏览器测试完成,共 {len(shared_results)} 个测试") |
| 307 | except Exception as e: | 453 | except Exception as e: |
| 308 | - print(f"❌ 订单管理测试执行失败: {e}") | 454 | + print(f"❌ 共享浏览器测试执行失败: {e}") |
| 309 | 455 | ||
| 310 | # 生成报告 | 456 | # 生成报告 |
| 311 | print("\n📊 生成测试报告...") | 457 | print("\n📊 生成测试报告...") | ... | ... |
-
Please register or login to post a comment