ui自动化执行问题处理

This commit is contained in:
2025-05-28 13:54:58 +08:00
parent 66c627d33a
commit 8636842735
2 changed files with 137 additions and 130 deletions

View File

@@ -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);

View File

@@ -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<UiSceneStepsReport> 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<AssertionReportVO> assertions = gson.fromJson(
assertionJson,
new TypeToken<List<AssertionReportVO>>() {
}.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<UiSceneStepsReport> 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<AssertionReportVO> assertions = gson.fromJson(
assertionJson,
new TypeToken<List<AssertionReportVO>>() {
}.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;
}