ui自动化执行问题处理
This commit is contained in:
@@ -207,7 +207,7 @@ public class PerformanceTestController extends BaseController {
|
|||||||
// return success(l1);
|
// return success(l1);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("执行失败!", e);
|
log.error("执行失败!", e);
|
||||||
return error("执行失败!");
|
return error("执行失败!"+e);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("修改并执行失败!", e);
|
log.error("修改并执行失败!", e);
|
||||||
|
|||||||
@@ -102,142 +102,149 @@ public class UiSceneStepsServiceImpl implements IUiSceneStepsService {
|
|||||||
|
|
||||||
// 配置 ChromeOptions
|
// 配置 ChromeOptions
|
||||||
ChromeOptions options = new 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 {
|
try {
|
||||||
// 3. 执行所有步骤
|
driver = new ChromeDriver(options);
|
||||||
executeAllSteps(steps, reportId,seleniumUtils);
|
SeleniumUtils seleniumUtils = new SeleniumUtils(driver);
|
||||||
log.info("场景执行成功: {}", automationId);
|
try {
|
||||||
uiReport.setConsoleStr("OK");
|
// 3. 执行所有步骤
|
||||||
uiReport.setStatus(3);
|
executeAllSteps(steps, reportId, seleniumUtils);
|
||||||
} catch (IllegalArgumentException e) {
|
log.info("场景执行成功: {}", automationId);
|
||||||
result.put("msg", e.getMessage());
|
uiReport.setConsoleStr("OK");
|
||||||
log.error("场景执行失败: {}", e.getMessage());
|
uiReport.setStatus(3);
|
||||||
uiReport.setConsoleStr(e.toString());
|
} catch (IllegalArgumentException e) {
|
||||||
uiReport.setStatus(2);
|
result.put("msg", e.getMessage());
|
||||||
uiAutomation.setExecutionResult("2");
|
log.error("场景执行失败: {}", e.getMessage());
|
||||||
} finally {
|
uiReport.setConsoleStr(e.toString());
|
||||||
endTime = DateUtils.getNowDate();
|
uiReport.setStatus(2);
|
||||||
uiReport.setTake(DateUtils.calculateTimeDifference(startTime, endTime));
|
uiAutomation.setExecutionResult("2");
|
||||||
uiReport.setUpdateTime(endTime);
|
} finally {
|
||||||
//查询report
|
endTime = DateUtils.getNowDate();
|
||||||
UiSceneStepsReport uiStepsReport = new UiSceneStepsReport();
|
uiReport.setTake(DateUtils.calculateTimeDifference(startTime, endTime));
|
||||||
uiStepsReport.setReportId(reportId);
|
uiReport.setUpdateTime(endTime);
|
||||||
List<UiSceneStepsReport> uiSceneStepsReports = uiSceneStepsReportMapper.selectUiSceneStepsReportList(uiStepsReport);
|
//查询report
|
||||||
int scenesSucceedNumber = 0;
|
UiSceneStepsReport uiStepsReport = new UiSceneStepsReport();
|
||||||
int scenesErrorNumber = 0;
|
uiStepsReport.setReportId(reportId);
|
||||||
int stepsSucceedNumber = 0;
|
List<UiSceneStepsReport> uiSceneStepsReports = uiSceneStepsReportMapper.selectUiSceneStepsReportList(uiStepsReport);
|
||||||
int stepsErrorNumber = 0;
|
int scenesSucceedNumber = 0;
|
||||||
int stepsNotNumber = 0;
|
int scenesErrorNumber = 0;
|
||||||
if (uiSceneStepsReports != null && !uiSceneStepsReports.isEmpty()) {
|
int stepsSucceedNumber = 0;
|
||||||
boolean allSuccess = true;
|
int stepsErrorNumber = 0;
|
||||||
for (UiSceneStepsReport report : uiSceneStepsReports) {
|
int stepsNotNumber = 0;
|
||||||
if (report.getExecutionFlag().equals("1")) {
|
if (uiSceneStepsReports != null && !uiSceneStepsReports.isEmpty()) {
|
||||||
stepsSucceedNumber++;
|
boolean allSuccess = true;
|
||||||
} else if (report.getExecutionFlag().equals("2")) {
|
for (UiSceneStepsReport report : uiSceneStepsReports) {
|
||||||
stepsErrorNumber++;
|
if (report.getExecutionFlag().equals("1")) {
|
||||||
allSuccess = false;
|
stepsSucceedNumber++;
|
||||||
} else if (report.getExecutionFlag().equals("0")) {
|
} else if (report.getExecutionFlag().equals("2")) {
|
||||||
stepsNotNumber++;
|
stepsErrorNumber++;
|
||||||
}
|
allSuccess = false;
|
||||||
//成功断言数
|
} else if (report.getExecutionFlag().equals("0")) {
|
||||||
String assertionJson = report.getAssertionJson();
|
stepsNotNumber++;
|
||||||
if (assertionJson != null && !assertionJson.trim().isEmpty()) {
|
}
|
||||||
try {
|
//成功断言数
|
||||||
List<AssertionReportVO> assertions = gson.fromJson(
|
String assertionJson = report.getAssertionJson();
|
||||||
assertionJson,
|
if (assertionJson != null && !assertionJson.trim().isEmpty()) {
|
||||||
new TypeToken<List<AssertionReportVO>>() {
|
try {
|
||||||
}.getType()
|
List<AssertionReportVO> assertions = gson.fromJson(
|
||||||
);
|
assertionJson,
|
||||||
int stepAssertionCount = assertions.size();
|
new TypeToken<List<AssertionReportVO>>() {
|
||||||
int stepSuccessCount = (int) assertions.stream()
|
}.getType()
|
||||||
.filter(a -> "1".equals(a.getIsSuccess()))
|
);
|
||||||
.count();
|
int stepAssertionCount = assertions.size();
|
||||||
totalAssertions.addAndGet(stepAssertionCount);
|
int stepSuccessCount = (int) assertions.stream()
|
||||||
successAssertions.addAndGet(stepSuccessCount);
|
.filter(a -> "1".equals(a.getIsSuccess()))
|
||||||
} catch (Exception e) {
|
.count();
|
||||||
log.error("步骤[{}]断言数据解析失败: {}", report.getId(), assertionJson, e);
|
totalAssertions.addAndGet(stepAssertionCount);
|
||||||
|
successAssertions.addAndGet(stepSuccessCount);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("步骤[{}]断言数据解析失败: {}", report.getId(), assertionJson, e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (allSuccess) {
|
||||||
|
scenesSucceedNumber = 1;
|
||||||
|
} else {
|
||||||
|
scenesErrorNumber = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (allSuccess) {
|
uiReport.setSuccessAssertion("0/0");
|
||||||
scenesSucceedNumber = 1;
|
String globalAssertionResult = successAssertions.get() + "/" + totalAssertions.get();
|
||||||
} else {
|
uiReport.setSuccessAssertion(globalAssertionResult);
|
||||||
scenesErrorNumber = 1;
|
|
||||||
|
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");
|
} catch (SessionNotCreatedException e) {
|
||||||
String globalAssertionResult = successAssertions.get() + "/" + totalAssertions.get();
|
log.error("ChromeDriver 会话创建失败: {}", e.getMessage());
|
||||||
uiReport.setSuccessAssertion(globalAssertionResult);
|
throw new RuntimeException("浏览器启动失败,请检查 Chrome 和 ChromeDriver 版本是否匹配", e);
|
||||||
|
} catch (WebDriverException e) {
|
||||||
uiReport.setScenesSucceedNumber(scenesSucceedNumber);
|
log.error("WebDriver 异常: {}", e.getMessage());
|
||||||
uiReport.setScenesErrorNumber(scenesErrorNumber);
|
throw new RuntimeException("浏览器操作异常: " + e.getMessage(), e);
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user