提交 2142b055 authored 作者: 黄承天's avatar 黄承天

[feature]

耗费时间的计算机制改变 统计数据细化
上级 558c48c2
...@@ -10,6 +10,8 @@ public interface TargetType { ...@@ -10,6 +10,8 @@ public interface TargetType {
String LINK_TEXT = "linkText"; String LINK_TEXT = "linkText";
String XPATH_HREF = "xpath:href";
String XPATH_POSITION = "xpath:position"; String XPATH_POSITION = "xpath:position";
String XPATH_ID_RELATIVE = "xpath:idRelative"; String XPATH_ID_RELATIVE = "xpath:idRelative";
......
...@@ -28,13 +28,22 @@ public class Statistics { ...@@ -28,13 +28,22 @@ public class Statistics {
@ApiModelProperty(value = "步骤平均耗费时间", example = "100", position = 6) @ApiModelProperty(value = "步骤平均耗费时间", example = "100", position = 6)
private Long averageCostTime; private Long averageCostTime;
@ApiModelProperty(value = "耗费时间小于2的步骤数", example = "80", position = 7) @ApiModelProperty(value = "耗费时间小于1的步骤数", example = "80", position = 7)
private Integer littleThan2s; private Integer littleThan1s;
@ApiModelProperty(value = "耗费时间在1到2之间的步骤数", example = "10", position = 8)
private Integer between1sAnd2s;
@ApiModelProperty(value = "耗费时间在2到3之间的步骤数", example = "10", position = 8) @ApiModelProperty(value = "耗费时间在2到3之间的步骤数", example = "10", position = 8)
private Integer between2sAnd3s; private Integer between2sAnd3s;
@ApiModelProperty(value = "耗费时间大于3的步骤数", example = "10", position = 9) @ApiModelProperty(value = "耗费时间在3到4之间的步骤数", example = "10", position = 8)
private Integer greaterThan3s; private Integer between3sAnd4s;
@ApiModelProperty(value = "耗费时间在4到5之间的步骤数", example = "10", position = 8)
private Integer between4sAnd5s;
@ApiModelProperty(value = "耗费时间大于5的步骤数", example = "10", position = 9)
private Integer greaterThan5s;
} }
...@@ -18,6 +18,7 @@ import java.util.stream.Collectors; ...@@ -18,6 +18,7 @@ import java.util.stream.Collectors;
import static java.lang.String.format; import static java.lang.String.format;
@SuppressWarnings("Duplicates")
@Service @Service
public class ReportService { public class ReportService {
...@@ -110,12 +111,24 @@ public class ReportService { ...@@ -110,12 +111,24 @@ public class ReportService {
.map(this::getLittlerThan1s) .map(this::getLittlerThan1s)
.reduce(Integer::sum) .reduce(Integer::sum)
.orElse(-1); .orElse(-1);
Integer between1sAnd2s = reports.stream()
.map(this::getBetween1sAnd2s)
.reduce(Integer::sum)
.orElse(-1);
Integer between2sAnd3s = reports.stream() Integer between2sAnd3s = reports.stream()
.map(this::getBetween2sAnd3s) .map(this::getBetween2sAnd3s)
.reduce(Integer::sum) .reduce(Integer::sum)
.orElse(-1); .orElse(-1);
Integer greaterThan3s = reports.stream() Integer between3sAnd4s = reports.stream()
.map(this::getGreaterThan3s) .map(this::getBetween3sAnd4s)
.reduce(Integer::sum)
.orElse(-1);
Integer between4sAnd5s = reports.stream()
.map(this::getBetween4sAnd5s)
.reduce(Integer::sum)
.orElse(-1);
Integer greaterThan5s = reports.stream()
.map(this::getGreaterThan5s)
.reduce(Integer::sum) .reduce(Integer::sum)
.orElse(-1); .orElse(-1);
return new Statistics( return new Statistics(
...@@ -126,8 +139,11 @@ public class ReportService { ...@@ -126,8 +139,11 @@ public class ReportService {
failures, failures,
averageCostTime, averageCostTime,
litterThan1s, litterThan1s,
between1sAnd2s,
between2sAnd3s, between2sAnd3s,
greaterThan3s between3sAnd4s,
between4sAnd5s,
greaterThan5s
); );
} }
...@@ -138,16 +154,37 @@ public class ReportService { ...@@ -138,16 +154,37 @@ public class ReportService {
return Math.toIntExact(count); return Math.toIntExact(count);
} }
private Integer getBetween1sAnd2s(ReportVo report) {
long count = report.getSteps().stream()
.filter(step -> step.getCostTime() >= 1000 && step.getCostTime() < 2000)
.count();
return Math.toIntExact(count);
}
private Integer getBetween2sAnd3s(ReportVo report) { private Integer getBetween2sAnd3s(ReportVo report) {
long count = report.getSteps().stream() long count = report.getSteps().stream()
.filter(step -> step.getCostTime() >= 2000 && step.getCostTime() <= 3000) .filter(step -> step.getCostTime() >= 2000 && step.getCostTime() < 3000)
.count();
return Math.toIntExact(count);
}
private Integer getBetween3sAnd4s(ReportVo report) {
long count = report.getSteps().stream()
.filter(step -> step.getCostTime() >= 3000 && step.getCostTime() < 4000)
.count();
return Math.toIntExact(count);
}
private Integer getBetween4sAnd5s(ReportVo report) {
long count = report.getSteps().stream()
.filter(step -> step.getCostTime() >= 4000 && step.getCostTime() < 5000)
.count(); .count();
return Math.toIntExact(count); return Math.toIntExact(count);
} }
private Integer getGreaterThan3s(ReportVo report) { private Integer getGreaterThan5s(ReportVo report) {
long count = report.getSteps().stream() long count = report.getSteps().stream()
.filter(step -> step.getCostTime() > 3000) .filter(step -> step.getCostTime() >= 5000)
.count(); .count();
return Math.toIntExact(count); return Math.toIntExact(count);
} }
......
...@@ -15,7 +15,9 @@ import lombok.extern.slf4j.Slf4j; ...@@ -15,7 +15,9 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
import org.openqa.selenium.*; import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select; import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -76,6 +78,8 @@ public class SeleniumExecutor { ...@@ -76,6 +78,8 @@ public class SeleniumExecutor {
private Integer total = 0; private Integer total = 0;
private long stepStartTime = System.currentTimeMillis();
private List<Step> steps = Lists.newArrayList(); private List<Step> steps = Lists.newArrayList();
/** /**
...@@ -109,6 +113,7 @@ public class SeleniumExecutor { ...@@ -109,6 +113,7 @@ public class SeleniumExecutor {
//默认选择 非静默模式 //默认选择 非静默模式
driver = WebDriverUtil.getWebDriver(browser, false); driver = WebDriverUtil.getWebDriver(browser, false);
} }
stepStartTime = System.currentTimeMillis();
for (Command command : commands) { for (Command command : commands) {
Step step = actCommand(command); Step step = actCommand(command);
if (nonNull(step)) { if (nonNull(step)) {
...@@ -141,7 +146,7 @@ public class SeleniumExecutor { ...@@ -141,7 +146,7 @@ public class SeleniumExecutor {
if (nonNull(params)) { if (nonNull(params)) {
driver.manage().deleteAllCookies(); driver.manage().deleteAllCookies();
for (Param param : params) { for (Param param : params) {
if (Strings.isNotBlank(param.getName())&&Strings.isNotBlank(param.getValue())){ if (Strings.isNotBlank(param.getName()) && Strings.isNotBlank(param.getValue())) {
switch (param.getType()) { switch (param.getType()) {
case COOKIES: case COOKIES:
driver.manage().addCookie(new Cookie(param.getName(), param.getValue())); driver.manage().addCookie(new Cookie(param.getName(), param.getValue()));
...@@ -171,8 +176,7 @@ public class SeleniumExecutor { ...@@ -171,8 +176,7 @@ public class SeleniumExecutor {
String content = null; String content = null;
String message = null; String message = null;
String screenShot = null; String screenShot = null;
long costTime; long costTime = -1L;
long stepStartTime = System.currentTimeMillis();
boolean success; boolean success;
try { try {
//根据操作类型模拟浏览器操作 并判断错误 //根据操作类型模拟浏览器操作 并判断错误
...@@ -220,7 +224,6 @@ public class SeleniumExecutor { ...@@ -220,7 +224,6 @@ public class SeleniumExecutor {
} }
} else { } else {
message = format("未知句柄:[%s]", handleName); message = format("未知句柄:[%s]", handleName);
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -241,23 +244,23 @@ public class SeleniumExecutor { ...@@ -241,23 +244,23 @@ public class SeleniumExecutor {
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
} }
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
//如果该点击打开了新标签页 则通过对比当前与历史找出新的标签页句柄并存入Map //如果该点击打开了新标签页 则通过对比当前与历史找出新的标签页句柄并存入Map
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow(); boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
if (newWindow) { if (newWindow) {
seleniumHelper.setHistoryHandles(driver.getWindowHandles()); seleniumHelper.setHistoryHandles(driver.getWindowHandles());
} }
JavascriptExecutor jse = (JavascriptExecutor)driver; movetoElement(element);
jse.executeScript("arguments[0].scrollIntoView(true);", element); new Actions(driver).click(element).perform();
seleniumHelper.waitSomeTime(); stepStartTime = System.currentTimeMillis();
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
if (newWindow) { if (newWindow) {
seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle()); seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle());
} }
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime; costTime = -1L;
success = false; success = false;
} }
break; break;
...@@ -267,22 +270,21 @@ public class SeleniumExecutor { ...@@ -267,22 +270,21 @@ public class SeleniumExecutor {
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
} }
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
//如果该双击打开了新标签页 则通过对比当前与历史找出新的标签页句柄并存入Map //如果该双击打开了新标签页 则通过对比当前与历史找出新的标签页句柄并存入Map
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow(); boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
if (newWindow) { if (newWindow) {
seleniumHelper.setHistoryHandles(driver.getWindowHandles()); seleniumHelper.setHistoryHandles(driver.getWindowHandles());
} }
new Actions(driver).moveToElement(element).doubleClick().perform(); movetoElement(element);
seleniumHelper.waitSomeTime(); new Actions(driver).doubleClick(element).perform();
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
if (newWindow) { if (newWindow) {
seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle()); seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle());
} }
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -292,13 +294,14 @@ public class SeleniumExecutor { ...@@ -292,13 +294,14 @@ public class SeleniumExecutor {
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
} }
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow(); boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
if (newWindow) { if (newWindow) {
seleniumHelper.setHistoryHandles(driver.getWindowHandles()); seleniumHelper.setHistoryHandles(driver.getWindowHandles());
} }
new Actions(driver).moveToElement(element).clickAndHold().perform(); movetoElement(element);
seleniumHelper.waitSomeTime(); new Actions(driver).clickAndHold(element).perform();
costTime = System.currentTimeMillis() - stepStartTime; costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
if (newWindow) { if (newWindow) {
...@@ -306,7 +309,6 @@ public class SeleniumExecutor { ...@@ -306,7 +309,6 @@ public class SeleniumExecutor {
} }
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -316,20 +318,19 @@ public class SeleniumExecutor { ...@@ -316,20 +318,19 @@ public class SeleniumExecutor {
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
} }
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow(); boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
if (newWindow) { if (newWindow) {
seleniumHelper.setHistoryHandles(driver.getWindowHandles()); seleniumHelper.setHistoryHandles(driver.getWindowHandles());
} }
new Actions(driver).moveToElement(element).perform(); movetoElement(element);
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
if (newWindow) { if (newWindow) {
seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle()); seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle());
} }
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -339,21 +340,20 @@ public class SeleniumExecutor { ...@@ -339,21 +340,20 @@ public class SeleniumExecutor {
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
} }
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow(); boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
if (newWindow) { if (newWindow) {
seleniumHelper.setHistoryHandles(driver.getWindowHandles()); seleniumHelper.setHistoryHandles(driver.getWindowHandles());
} }
new Actions(driver).moveToElement(element).release().perform(); movetoElement(element);
seleniumHelper.waitSomeTime(); new Actions(driver).release(element).perform();
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
if (newWindow) { if (newWindow) {
seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle()); seleniumHelper.getHandleMap().put(command.getWindowHandleName(), getWindowHandle());
} }
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -361,34 +361,30 @@ public class SeleniumExecutor { ...@@ -361,34 +361,30 @@ public class SeleniumExecutor {
String label = seleniumHelper.getValue(value); String label = seleniumHelper.getValue(value);
content = format("下拉框选择:[%s]", label); content = format("下拉框选择:[%s]", label);
element = locateElement(target); element = locateElement(target);
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
// WebElement select = element.findElement(By.xpath(format("//option[. = '%s']", label))); movetoElement(element);
// select.click();
Select select = new Select(element); Select select = new Select(element);
select.selectByVisibleText(label); select.selectByVisibleText(label);
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
seleniumHelper.waitSomeTime();
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
case MOUSE_OVER: case MOUSE_OVER:
content = format("鼠标悬停:[%s]", target); content = format("鼠标悬停:[%s]", target);
element = locateElement(target); element = locateElement(target);
costTime = System.currentTimeMillis() - stepStartTime;
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
costTime = System.currentTimeMillis() - stepStartTime;
} }
if (nonNull(element)) { if (nonNull(element)) {
new Actions(driver).moveToElement(element).perform(); new Actions(driver).moveToElement(element).perform();
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
seleniumHelper.waitSomeTime();
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -398,23 +394,21 @@ public class SeleniumExecutor { ...@@ -398,23 +394,21 @@ public class SeleniumExecutor {
if (isNull(element)) { if (isNull(element)) {
element = getElement(targets); element = getElement(targets);
} }
costTime = System.currentTimeMillis() - stepStartTime;
if (nonNull(element)) { if (nonNull(element)) {
String elementType = element.getAttribute("type"); String elementType = element.getAttribute("type");
if (!Objects.equals(elementType, "file")) { if (!Objects.equals(elementType, "file")) {
element.clear(); element.clear();
element.sendKeys(value); element.sendKeys(value);
}else { } else {
JavascriptExecutor driver_js= ((JavascriptExecutor) driver); JavascriptExecutor driver_js = ((JavascriptExecutor) driver);
driver_js.executeScript("arguments[0].style.display='block';",element); driver_js.executeScript("arguments[0].style.display='block';", element);
element.sendKeys(value); element.sendKeys(value);
driver_js.executeScript("arguments[0].style.display='none';",element); driver_js.executeScript("arguments[0].style.display='none';", element);
} }
costTime = System.currentTimeMillis() - stepStartTime;
success = true; success = true;
seleniumHelper.waitSomeTime();
} else { } else {
message = "无法定位该元素"; message = "无法定位该元素";
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
break; break;
...@@ -436,9 +430,9 @@ public class SeleniumExecutor { ...@@ -436,9 +430,9 @@ public class SeleniumExecutor {
log.error(e.getLocalizedMessage()); log.error(e.getLocalizedMessage());
Arrays.stream(e.getStackTrace()).forEach(System.out::println); Arrays.stream(e.getStackTrace()).forEach(System.out::println);
message = e.getLocalizedMessage(); message = e.getLocalizedMessage();
costTime = System.currentTimeMillis() - stepStartTime;
success = false; success = false;
} }
stepStartTime = System.currentTimeMillis();
if (nonNull(content)) { if (nonNull(content)) {
log.info(content); log.info(content);
} else { } else {
...@@ -461,6 +455,11 @@ public class SeleniumExecutor { ...@@ -461,6 +455,11 @@ public class SeleniumExecutor {
} }
} }
private void movetoElement(WebElement element) {
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("arguments[0].scrollIntoView(true);", element);
}
/** /**
* 根据一组target数据定位元素 * 根据一组target数据定位元素
* 只要其中一对定位到 * 只要其中一对定位到
...@@ -488,18 +487,25 @@ public class SeleniumExecutor { ...@@ -488,18 +487,25 @@ public class SeleniumExecutor {
String content = target.get(0); String content = target.get(0);
String value = getValue(content); String value = getValue(content);
try { try {
WebDriverWait webDriverWait = new WebDriverWait(driver,3);
switch (type) { switch (type) {
case CSS: case CSS:
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(value)).apply(webDriver)));
return driver.findElement(By.cssSelector(value)); return driver.findElement(By.cssSelector(value));
case ID: case ID:
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.id(value)).apply(webDriver)));
return driver.findElement(By.id(value)); return driver.findElement(By.id(value));
case NAME: case NAME:
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.name(value)).apply(webDriver)));
return driver.findElement(By.name(value)); return driver.findElement(By.name(value));
case LINK_TEXT: case LINK_TEXT:
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.linkText(value)).apply(webDriver)));
return driver.findElement(By.linkText(value)); return driver.findElement(By.linkText(value));
case XPATH_HREF:
case XPATH_ID_RELATIVE: case XPATH_ID_RELATIVE:
case XPATH_POSITION: case XPATH_POSITION:
case XPATH_INNER_TEXT: case XPATH_INNER_TEXT:
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.xpath(value)).apply(webDriver)));
return driver.findElement(By.xpath(value)); return driver.findElement(By.xpath(value));
default: default:
} }
...@@ -514,12 +520,16 @@ public class SeleniumExecutor { ...@@ -514,12 +520,16 @@ public class SeleniumExecutor {
String type = type_value[0]; String type = type_value[0];
String value = type_value[1]; String value = type_value[1];
try { try {
WebDriverWait webDriverWait = new WebDriverWait(driver,3);
switch (type) { switch (type) {
case "name": case "name":
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.name(value)).apply(webDriver)));
return driver.findElement(By.name(value)); return driver.findElement(By.name(value));
case "css": case "css":
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(value)).apply(webDriver)));
return driver.findElement(By.cssSelector(value)); return driver.findElement(By.cssSelector(value));
case "id": case "id":
webDriverWait.until(webDriver -> nonNull(ExpectedConditions.visibilityOfElementLocated(By.id(value)).apply(webDriver)));
return driver.findElement(By.id(value)); return driver.findElement(By.id(value));
default: default:
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论