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

[feature]

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