From 4c8fa536b6ab0dde98c9b8896b0cdca7d493d02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AF=9B=E9=B9=8F?= <729164035@qq.com> Date: Tue, 16 Jul 2024 17:50:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E5=BD=95?= =?UTF-8?q?=E5=88=B6=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autotest/ui/base_tools/web/new_browser.py | 18 +++++----- .../autotest/ui/service/page_steps.py | 12 ++++--- .../models/socket_model/api_model.py | 2 +- MangoActuator/models/socket_model/ui_model.py | 3 +- .../socket_conn/api_reflection/ui_consumer.py | 2 +- .../auto_api/service/import_api/recording.py | 9 +++-- .../auto_test/auto_ui/service/ui_test_run.py | 5 ++- .../auto_test/auto_ui/views/ui_config.py | 34 +++++++++++++++---- .../models/socket_model/api_model.py | 2 +- .../models/socket_model/ui_model.py | 3 +- mango-console/src/api/uitest/index.ts | 4 +-- mango-console/src/layouts/avatar/project.vue | 11 +----- .../src/views/apitest/info/index.vue | 4 +++ 13 files changed, 64 insertions(+), 45 deletions(-) diff --git a/MangoActuator/autotest/ui/base_tools/web/new_browser.py b/MangoActuator/autotest/ui/base_tools/web/new_browser.py index 9c3d7cd7..f98a0970 100644 --- a/MangoActuator/autotest/ui/base_tools/web/new_browser.py +++ b/MangoActuator/autotest/ui/base_tools/web/new_browser.py @@ -32,7 +32,6 @@ from models.socket_model.ui_model import WEBConfigModel from service_conn.socket_conn.client_socket import ClientWebSocket from tools.data_processor.sql_cache import SqlCache from tools.desktop.signal_send import SignalSend -from tools.log_collector import log from tools.message.error_msg import ERROR_MSG_0008, ERROR_MSG_0009, ERROR_MSG_0042 from tools.public_methods import async_global_exception @@ -133,18 +132,17 @@ class NewBrowser: @param request: @return: """ - if self.web_config.host is None: + if self.web_config.host_obj is None: await route.continue_() # 继续请求,不做修改 return - if self.web_config.host in request.url: # 检查请求的URL是否包含目标路径 - if request.resource_type == "document" or request.resource_type == "xhr" or request.resource_type == "fetch": - await self.__send_recording_api(request) + if request.resource_type in ("document", "xhr", "fetch"): + for project_product, host in self.web_config.host_obj.items(): + if host in request.url: + await self.__send_recording_api(request, int(project_product)) await route.continue_() # 继续请求,不做修改 - async def __send_recording_api(self, request: Request): - if self.web_config.project_product_id is None: - log.error('错误逻辑') - return + @classmethod + async def __send_recording_api(cls, request: Request, project_product: int): parsed_url = parse.urlsplit(request.url) try: @@ -158,7 +156,7 @@ class NewBrowser: parse.parse_qs(parsed_url.query).items()} if parsed_url.query else None try: api_info = ApiInfoModel( - project=self.web_config.project_product_id, + project_product=project_product, username=service_conn.USERNAME, type=ApiTypeEnum.batch.value, name=parsed_url.path, diff --git a/MangoActuator/autotest/ui/service/page_steps.py b/MangoActuator/autotest/ui/service/page_steps.py index 414c23de..49e6faf5 100644 --- a/MangoActuator/autotest/ui/service/page_steps.py +++ b/MangoActuator/autotest/ui/service/page_steps.py @@ -17,7 +17,7 @@ from service_conn.socket_conn.client_socket import ClientWebSocket class PageSteps(StepElements): """用例分发""" - def __init__(self, project_product_id: int): + def __init__(self, project_product_id: int | None = None): self.driver_object = DriverObject() super().__init__(project_product_id, self.driver_object) @@ -60,9 +60,13 @@ class PageSteps(StepElements): msg = 'WEB对象已实例化' if self.page is None and self.context is None: await self.web_init(data) - msg = 'WEB对象实例化成功' - if data.host: - await self.w_goto(data.host) + msg = 'WEB对象实例化成功,请手动输入对应选择的测试项目和部署环境的url进行访问开始录制!' + # 检查页面是否已关闭 + if self.page.is_closed(): + self.page = None + self.context = None + await self.web_init(data) + await ClientWebSocket().async_send( msg=msg, is_notice=ClientTypeEnum.WEB.value diff --git a/MangoActuator/models/socket_model/api_model.py b/MangoActuator/models/socket_model/api_model.py index a0c7a5e5..6f571d2a 100644 --- a/MangoActuator/models/socket_model/api_model.py +++ b/MangoActuator/models/socket_model/api_model.py @@ -58,7 +58,7 @@ class ApiPublicModel(BaseModel): class ApiInfoModel(BaseModel): """ApiInfo模型""" - project: int + project_product: int username: str type: int = 0 module_name: int | None = None diff --git a/MangoActuator/models/socket_model/ui_model.py b/MangoActuator/models/socket_model/ui_model.py index 5e8359da..456859d5 100644 --- a/MangoActuator/models/socket_model/ui_model.py +++ b/MangoActuator/models/socket_model/ui_model.py @@ -21,8 +21,7 @@ class WEBConfigModel(BaseModel): browser_path: str | None = None is_headless: int | None = None is_header_intercept: bool = False - host: str | None = None - project_product: int | None = None + host_obj: dict | None = None device: str | None = None diff --git a/MangoActuator/service_conn/socket_conn/api_reflection/ui_consumer.py b/MangoActuator/service_conn/socket_conn/api_reflection/ui_consumer.py index 5d76c69f..7fe9f542 100644 --- a/MangoActuator/service_conn/socket_conn/api_reflection/ui_consumer.py +++ b/MangoActuator/service_conn/socket_conn/api_reflection/ui_consumer.py @@ -53,7 +53,7 @@ class UIConsumer: """ try: if cls.page_steps is None: - cls.page_steps = PageSteps(data.project_product) + cls.page_steps = PageSteps() await cls.page_steps.new_web_obj(data) except Exception as error: await async_global_exception( diff --git a/MangoServer/PyAutoTest/auto_test/auto_api/service/import_api/recording.py b/MangoServer/PyAutoTest/auto_test/auto_api/service/import_api/recording.py index d85cdf3e..ff293af2 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_api/service/import_api/recording.py +++ b/MangoServer/PyAutoTest/auto_test/auto_api/service/import_api/recording.py @@ -21,15 +21,18 @@ class Recording: from PyAutoTest.auto_test.auto_system.consumers import ChatConsumer username = data.username try: - api_info_obj = ApiInfo.objects.get(url=data.url, method=data.method, project_id=data.project) + + api_info_obj = ApiInfo.objects.get(url=data.url, + method=data.method, + project_product_id=data.project_product) except ApiInfo.DoesNotExist: - msg = f'项目ID:{data.project}-接口URL:{data.url}已经存在,所以不需要进行录制到数据库中!' + msg = f'接口URL:<{data.url}>录制成功,刷新页面可查看' data = data.dict() data['json'] = data['json_data'] del data['json_data'] ApiInfoCRUD.inside_post(data) else: - msg = f'项目:{api_info_obj.project.name}-接口URL:{data.url}已经存在,所以不需要进行录制到数据库中!' + msg = f'项目:<{api_info_obj.project_product.project.name}>-产品:<{api_info_obj.project_product.name}>接口URL:<{data.url}>已经存在,所以不需要进行录制到数据库中!' log.info(msg) ChatConsumer.active_send(SocketDataModel( code=200, diff --git a/MangoServer/PyAutoTest/auto_test/auto_ui/service/ui_test_run.py b/MangoServer/PyAutoTest/auto_test/auto_ui/service/ui_test_run.py index c7710833..1186ac7d 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_ui/service/ui_test_run.py +++ b/MangoServer/PyAutoTest/auto_test/auto_ui/service/ui_test_run.py @@ -5,12 +5,11 @@ # @Author : 毛鹏 from PyAutoTest.auto_test.auto_system.consumers import ChatConsumer from PyAutoTest.auto_test.auto_system.models import TasksRunCaseList -from PyAutoTest.auto_test.auto_system.models import TestObject, User +from PyAutoTest.auto_test.auto_system.models import TestObject from PyAutoTest.auto_test.auto_system.service.public_methods import PublicMethods from PyAutoTest.auto_test.auto_system.service.socket_link.socket_user import SocketUser from PyAutoTest.auto_test.auto_system.views.test_suite_report import TestSuiteReportCRUD -from PyAutoTest.auto_test.auto_ui.models import UiCase, UiPageSteps, UiPageStepsDetailed, UiCaseStepsDetailed, \ - UiElement, UiConfig, UiPage, UiPublic +from PyAutoTest.auto_test.auto_ui.models import * from PyAutoTest.enums.socket_api_enum import UiSocketEnum from PyAutoTest.enums.system_enum import AutoTestTypeEnum from PyAutoTest.enums.tools_enum import ClientTypeEnum, StatusEnum, ClientNameEnum diff --git a/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_config.py b/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_config.py index bd42ff4e..dbf85658 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_config.py +++ b/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_config.py @@ -3,13 +3,15 @@ # @Description: # @Time : 2023-03-25 18:54 # @Author : 毛鹏 +import urllib + from rest_framework import serializers from rest_framework.decorators import action from rest_framework.request import Request from rest_framework.viewsets import ViewSet from PyAutoTest.auto_test.auto_system.consumers import ChatConsumer -from PyAutoTest.auto_test.auto_system.models import TestObject +from PyAutoTest.auto_test.auto_system.models import TestObject, ProjectProduct from PyAutoTest.auto_test.auto_ui.models import UiConfig from PyAutoTest.auto_test.auto_user.models import User from PyAutoTest.auto_test.auto_user.views.user import UserSerializers @@ -87,7 +89,6 @@ class UiConfigViews(ViewSet): @action(methods=['get'], detail=False) def new_browser_obj(self, request: Request): """ - @param request: @return: """ @@ -97,18 +98,39 @@ class UiConfigViews(ViewSet): config_obj = UiConfig.objects.get(user_id=request.user['id'], status=StatusEnum.SUCCESS.value, type=DriveTypeEnum.WEB.value) - if not user_obj.selected_project: - return ResponseData.fail(RESPONSE_MSG_0058, ) if not user_obj.selected_environment: return ResponseData.fail(RESPONSE_MSG_0058, ) + + test_object = TestObject.objects.get(id=user_obj.selected_environment) + host_obj = { + obj_id: obj_value + for obj_value, obj_id in TestObject.objects.filter( + project_product_id__in=ProjectProduct.objects.filter( + project_id=test_object.project_product.project.id + ).values_list('id'), + environment=test_object.environment + ).values_list('value', 'id') + } + + host_obj1 = {} + for _id,url in host_obj.items(): + if url.startswith('http'): + # 如果 URL 以 http 或 https 开头,则提取域名部分 + parsed_url = urllib.parse.urlparse(url) + domain = parsed_url.netloc + if '.' in domain: + # 检查域名是否包含至少一个点,如果包含则认为是一个有效的域名 + host_obj1[_id] = domain + elif '.' in url: + # 如果 URL 不以 http 或 https 开头,但包含至少一个点,则认为是一个有效的域名 + host_obj1[_id] = url web_config = WEBConfigModel(browser_type=config_obj.browser_type, browser_port=config_obj.browser_port, browser_path=config_obj.browser_path, is_headless=config_obj.is_headless, device=config_obj.device, - project_product=user_obj.selected_project, is_header_intercept=True, - host=TestObject.objects.get(id=user_obj.selected_environment).value) + host_obj=host_obj1) else: config_obj = self.model.objects.get(id=request.query_params.get('id')) web_config = WEBConfigModel(browser_type=config_obj.browser_type, diff --git a/MangoServer/PyAutoTest/models/socket_model/api_model.py b/MangoServer/PyAutoTest/models/socket_model/api_model.py index a0c7a5e5..6f571d2a 100644 --- a/MangoServer/PyAutoTest/models/socket_model/api_model.py +++ b/MangoServer/PyAutoTest/models/socket_model/api_model.py @@ -58,7 +58,7 @@ class ApiPublicModel(BaseModel): class ApiInfoModel(BaseModel): """ApiInfo模型""" - project: int + project_product: int username: str type: int = 0 module_name: int | None = None diff --git a/MangoServer/PyAutoTest/models/socket_model/ui_model.py b/MangoServer/PyAutoTest/models/socket_model/ui_model.py index be4b1deb..b561984f 100644 --- a/MangoServer/PyAutoTest/models/socket_model/ui_model.py +++ b/MangoServer/PyAutoTest/models/socket_model/ui_model.py @@ -21,8 +21,7 @@ class WEBConfigModel(BaseModel): browser_path: str | None = None is_headless: int | None = None is_header_intercept: bool = False - host: str | None = None - project_product: int | None = None + host_obj: dict | None = None device: str | None = None diff --git a/mango-console/src/api/uitest/index.ts b/mango-console/src/api/uitest/index.ts index 0688ab97..0ceca100 100644 --- a/mango-console/src/api/uitest/index.ts +++ b/mango-console/src/api/uitest/index.ts @@ -405,11 +405,11 @@ export function getUiCaseStepsRefreshCacheData(id: number) { }, }) } -export function getUiConfigNewBrowserObj(id: number) { +export function getUiConfigNewBrowserObj(is_recording: number) { return get({ url: url.uiConfigNewBrowserObj, data: () => { - return { id: id } + return { is_recording: is_recording } }, }) } diff --git a/mango-console/src/layouts/avatar/project.vue b/mango-console/src/layouts/avatar/project.vue index 3c03d6f2..a44cf24b 100644 --- a/mango-console/src/layouts/avatar/project.vue +++ b/mango-console/src/layouts/avatar/project.vue @@ -56,6 +56,7 @@ return } project.data.forEach((item: any) => { + console.log(item) project.selectValue = key if (item.key === project.selectValue) project.selectTitle = item.title }) @@ -67,18 +68,8 @@ } }) - function doRefresh() { - getUserProjectEnvironment(userStore.userId) - .then((res) => { - userStore.selected_environment = res.data.selected_environment - userStore.selected_project = res.data.selected_project - project.projectProductNameList(userStore.selected_project) - }) - .catch(console.log) - } onMounted(async () => { await project.getProject() - await doRefresh() await status.refresh() }) diff --git a/mango-console/src/views/apitest/info/index.vue b/mango-console/src/views/apitest/info/index.vue index 0eccc0ee..f00d765f 100644 --- a/mango-console/src/views/apitest/info/index.vue +++ b/mango-console/src/views/apitest/info/index.vue @@ -414,6 +414,10 @@ } function onBatchUpload() { + if (testObj.selectValue == null) { + Message.error('请先选择用例执行的环境并进行录制') + return + } Modal.confirm({ title: '注意事项', content: -- Gitee