diff --git a/test-test/src/main/java/com/test/test/controller/PerformanceTestController.java b/test-test/src/main/java/com/test/test/controller/PerformanceTestController.java index f7e8e07..4f51d40 100644 --- a/test-test/src/main/java/com/test/test/controller/PerformanceTestController.java +++ b/test-test/src/main/java/com/test/test/controller/PerformanceTestController.java @@ -207,7 +207,7 @@ public class PerformanceTestController extends BaseController { // return success(l1); } catch (Exception e) { log.error("执行失败!", e); - return error("执行失败!"); + return error("执行失败!"+e); } } catch (Exception e) { log.error("修改并执行失败!", e); diff --git a/test-test/src/main/java/com/test/test/service/impl/UiSceneStepsServiceImpl.java b/test-test/src/main/java/com/test/test/service/impl/UiSceneStepsServiceImpl.java index 88725eb..eef2cef 100644 --- a/test-test/src/main/java/com/test/test/service/impl/UiSceneStepsServiceImpl.java +++ b/test-test/src/main/java/com/test/test/service/impl/UiSceneStepsServiceImpl.java @@ -102,142 +102,149 @@ public class UiSceneStepsServiceImpl implements IUiSceneStepsService { // 配置 ChromeOptions ChromeOptions options = new ChromeOptions(); - // 基本设置 - options.addArguments("--headless=new"); // 使用新的无头模式 - options.addArguments("--no-sandbox"); - options.addArguments("--disable-dev-shm-usage"); - options.addArguments("--remote-allow-origins=*"); - - // 禁用各种功能以提高稳定性 - options.addArguments("--disable-gpu"); - options.addArguments("--disable-extensions"); - options.addArguments("--disable-plugins"); - options.addArguments("--disable-software-rasterizer"); - options.addArguments("--disable-browser-side-navigation"); - options.addArguments("--disable-infobars"); - options.addArguments("--disable-notifications"); - - // 设置窗口大小和内存限制 - options.addArguments("--window-size=1920,1080"); - options.addArguments("--disable-dev-shm-usage"); - options.addArguments("--incognito"); // 无痕模式 - - // 添加性能和稳定性相关的参数 - options.addArguments("--disable-background-networking"); - options.addArguments("--disable-background-timer-throttling"); - options.addArguments("--disable-client-side-phishing-detection"); - options.addArguments("--disable-default-apps"); - options.addArguments("--disable-hang-monitor"); - options.addArguments("--disable-popup-blocking"); - options.addArguments("--disable-prompt-on-repost"); - options.addArguments("--disable-sync"); - options.addArguments("--metrics-recording-only"); - options.addArguments("--no-first-run"); - options.addArguments("--safebrowsing-disable-auto-update"); - options.addArguments("--password-store=basic"); - options.addArguments("--use-mock-keychain"); - - // 创建 ChromeDriver - WebDriver driver = new ChromeDriver(options); - SeleniumUtils seleniumUtils = new SeleniumUtils(driver); + // Docker 环境特定配置 + options.addArguments("--headless=new"); // 使用新的无头模式 + options.addArguments("--no-sandbox"); // 在 Docker 中必需 + options.addArguments("--disable-dev-shm-usage"); // 避免 Docker 中的内存问题 + options.addArguments("--remote-allow-origins=*"); + + // 性能优化 + options.addArguments("--disable-gpu"); // 在无头模式中禁用 GPU + options.addArguments("--disable-extensions"); // 禁用扩展 + options.addArguments("--disable-plugins"); + options.addArguments("--window-size=1920,1080"); + + // 错误和日志处理 + options.addArguments("--ignore-certificate-errors"); + options.addArguments("--disable-notifications"); + options.addArguments("--log-level=3"); // 最小化日志 + options.addArguments("--silent"); + + // 内存优化 + options.addArguments("--aggressive-cache-discard"); + options.addArguments("--disable-cache"); + options.addArguments("--disable-application-cache"); + options.addArguments("--disable-offline-load-stale-cache"); + options.addArguments("--disk-cache-size=0"); + + // 自动化检测绕过 + options.addArguments("--disable-blink-features=AutomationControlled"); + options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"}); + options.setExperimentalOption("useAutomationExtension", false); + + WebDriver driver = null; try { - // 3. 执行所有步骤 - executeAllSteps(steps, reportId,seleniumUtils); - log.info("场景执行成功: {}", automationId); - uiReport.setConsoleStr("OK"); - uiReport.setStatus(3); - } catch (IllegalArgumentException e) { - result.put("msg", e.getMessage()); - log.error("场景执行失败: {}", e.getMessage()); - uiReport.setConsoleStr(e.toString()); - uiReport.setStatus(2); - uiAutomation.setExecutionResult("2"); - } finally { - endTime = DateUtils.getNowDate(); - uiReport.setTake(DateUtils.calculateTimeDifference(startTime, endTime)); - uiReport.setUpdateTime(endTime); - //查询report - UiSceneStepsReport uiStepsReport = new UiSceneStepsReport(); - uiStepsReport.setReportId(reportId); - List uiSceneStepsReports = uiSceneStepsReportMapper.selectUiSceneStepsReportList(uiStepsReport); - int scenesSucceedNumber = 0; - int scenesErrorNumber = 0; - int stepsSucceedNumber = 0; - int stepsErrorNumber = 0; - int stepsNotNumber = 0; - if (uiSceneStepsReports != null && !uiSceneStepsReports.isEmpty()) { - boolean allSuccess = true; - for (UiSceneStepsReport report : uiSceneStepsReports) { - if (report.getExecutionFlag().equals("1")) { - stepsSucceedNumber++; - } else if (report.getExecutionFlag().equals("2")) { - stepsErrorNumber++; - allSuccess = false; - } else if (report.getExecutionFlag().equals("0")) { - stepsNotNumber++; - } - //成功断言数 - String assertionJson = report.getAssertionJson(); - if (assertionJson != null && !assertionJson.trim().isEmpty()) { - try { - List assertions = gson.fromJson( - assertionJson, - new TypeToken>() { - }.getType() - ); - int stepAssertionCount = assertions.size(); - int stepSuccessCount = (int) assertions.stream() - .filter(a -> "1".equals(a.getIsSuccess())) - .count(); - totalAssertions.addAndGet(stepAssertionCount); - successAssertions.addAndGet(stepSuccessCount); - } catch (Exception e) { - log.error("步骤[{}]断言数据解析失败: {}", report.getId(), assertionJson, e); + driver = new ChromeDriver(options); + SeleniumUtils seleniumUtils = new SeleniumUtils(driver); + try { + // 3. 执行所有步骤 + executeAllSteps(steps, reportId, seleniumUtils); + log.info("场景执行成功: {}", automationId); + uiReport.setConsoleStr("OK"); + uiReport.setStatus(3); + } catch (IllegalArgumentException e) { + result.put("msg", e.getMessage()); + log.error("场景执行失败: {}", e.getMessage()); + uiReport.setConsoleStr(e.toString()); + uiReport.setStatus(2); + uiAutomation.setExecutionResult("2"); + } finally { + endTime = DateUtils.getNowDate(); + uiReport.setTake(DateUtils.calculateTimeDifference(startTime, endTime)); + uiReport.setUpdateTime(endTime); + //查询report + UiSceneStepsReport uiStepsReport = new UiSceneStepsReport(); + uiStepsReport.setReportId(reportId); + List uiSceneStepsReports = uiSceneStepsReportMapper.selectUiSceneStepsReportList(uiStepsReport); + int scenesSucceedNumber = 0; + int scenesErrorNumber = 0; + int stepsSucceedNumber = 0; + int stepsErrorNumber = 0; + int stepsNotNumber = 0; + if (uiSceneStepsReports != null && !uiSceneStepsReports.isEmpty()) { + boolean allSuccess = true; + for (UiSceneStepsReport report : uiSceneStepsReports) { + if (report.getExecutionFlag().equals("1")) { + stepsSucceedNumber++; + } else if (report.getExecutionFlag().equals("2")) { + stepsErrorNumber++; + allSuccess = false; + } else if (report.getExecutionFlag().equals("0")) { + stepsNotNumber++; + } + //成功断言数 + String assertionJson = report.getAssertionJson(); + if (assertionJson != null && !assertionJson.trim().isEmpty()) { + try { + List assertions = gson.fromJson( + assertionJson, + new TypeToken>() { + }.getType() + ); + int stepAssertionCount = assertions.size(); + int stepSuccessCount = (int) assertions.stream() + .filter(a -> "1".equals(a.getIsSuccess())) + .count(); + totalAssertions.addAndGet(stepAssertionCount); + successAssertions.addAndGet(stepSuccessCount); + } catch (Exception e) { + log.error("步骤[{}]断言数据解析失败: {}", report.getId(), assertionJson, e); + } } } + if (allSuccess) { + scenesSucceedNumber = 1; + } else { + scenesErrorNumber = 1; + } } - if (allSuccess) { - scenesSucceedNumber = 1; - } else { - scenesErrorNumber = 1; + uiReport.setSuccessAssertion("0/0"); + String globalAssertionResult = successAssertions.get() + "/" + totalAssertions.get(); + uiReport.setSuccessAssertion(globalAssertionResult); + + uiReport.setScenesSucceedNumber(scenesSucceedNumber); + uiReport.setScenesErrorNumber(scenesErrorNumber); + uiReport.setScenesNotNumber(0); + uiReport.setStepsSucceedNumber(stepsSucceedNumber); + uiReport.setStepsErrorNumber(stepsErrorNumber); + uiReport.setStepsNotNumber(stepsNotNumber); + uiReport.setFaiiRate( + stepsErrorNumber == 0 ? "0%" : + String.format("%.2f%%", (double) stepsErrorNumber / steps.size() * 100) + ); + if (1 == uiReport.getStatus()){ + uiReport.setStatus(4); + } + uiReportService.updateUiReport(uiReport); + + //修改ui_automation + UiAutomation uiAutomation1 = new UiAutomation(); + uiAutomation1.setId(automationId); + uiAutomation1.setExecutionResult("2"); + if (!uiAutomation.getExecutionResult().equals("2")) { + uiAutomation1.setExecutionResult("3"); + } + uiAutomation1.setUpdateTime(DateUtils.getNowDate()); + uiAutomation1.setPassRate(stepsSucceedNumber == 0 ? "0%" : + String.format("%.2f%%", (double) stepsSucceedNumber / steps.size() * 100)); + uiAutomationMapper.updateUiAutomation(uiAutomation1); + + //关闭浏览器 + if (driver != null) { + try { + driver.quit(); + } catch (Exception e) { + log.error("关闭浏览器失败", e); + } } } - uiReport.setSuccessAssertion("0/0"); - String globalAssertionResult = successAssertions.get() + "/" + totalAssertions.get(); - uiReport.setSuccessAssertion(globalAssertionResult); - - uiReport.setScenesSucceedNumber(scenesSucceedNumber); - uiReport.setScenesErrorNumber(scenesErrorNumber); - uiReport.setScenesNotNumber(0); - uiReport.setStepsSucceedNumber(stepsSucceedNumber); - uiReport.setStepsErrorNumber(stepsErrorNumber); - uiReport.setStepsNotNumber(stepsNotNumber); - uiReport.setFaiiRate( - stepsErrorNumber == 0 ? "0%" : - String.format("%.2f%%", (double) stepsErrorNumber / steps.size() * 100) - - - ); - if (1 == uiReport.getStatus()){ - uiReport.setStatus(4); - } - uiReportService.updateUiReport(uiReport); - - //修改ui_automation - UiAutomation uiAutomation1 = new UiAutomation(); - uiAutomation1.setId(automationId); - uiAutomation1.setExecutionResult("2"); - if (!uiAutomation.getExecutionResult().equals("2")) { - uiAutomation1.setExecutionResult("3"); - } - uiAutomation1.setUpdateTime(DateUtils.getNowDate()); - uiAutomation1.setPassRate(stepsSucceedNumber == 0 ? "0%" : - String.format("%.2f%%", (double) stepsSucceedNumber / steps.size() * 100)); - uiAutomationMapper.updateUiAutomation(uiAutomation1); - - //关闭浏览器 - seleniumUtils.quit(); + } catch (SessionNotCreatedException e) { + log.error("ChromeDriver 会话创建失败: {}", e.getMessage()); + throw new RuntimeException("浏览器启动失败,请检查 Chrome 和 ChromeDriver 版本是否匹配", e); + } catch (WebDriverException e) { + log.error("WebDriver 异常: {}", e.getMessage()); + throw new RuntimeException("浏览器操作异常: " + e.getMessage(), e); } return result; }