zhouhui.jiang

添加出口自动化

...@@ -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 = {
......
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📊 生成测试报告...")
......