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

自动测试历史判断机制更新

上级 4ce1de26
......@@ -48,12 +48,6 @@ public class SeleniumExecutor {
@Value("${screenshot-path}")
private String screenshotPath;
@Value("${selenium.executor.screenshot.url-host}")
private String screenshotPrefixHost;
@Value("${selenium.executor.screenshot.url-port}")
private String screenshotPrefixPort;
private WebDriver driver;
private List<Input> inputs = Lists.newArrayList();
......@@ -68,6 +62,7 @@ public class SeleniumExecutor {
private Queue<String> urlQueue = Queues.newLinkedBlockingDeque();
Map<Attributes, WebElement> elements = Maps.newHashMap();
/**
* 当前进行的窗口页
*/
......@@ -130,8 +125,15 @@ public class SeleniumExecutor {
log.info("当前URL:{} 响应时间 {} ms 开始进行遍历...", currentUrl, responseTime);
log.info("剩余URL队列:{}", urlQueue);
log.info("正在获取当前网页所有元素...");
StringBuilder message = new StringBuilder();
String error = checkJsError();
if (nonNull(error)) {
message.append(error);
message.append(";");
}
//获取当前网页的所有元素并放入元素队列
Map<Attributes, WebElement> elements = getAllElements(driver);
elements.clear();
elements = getAllElements(driver);
log.info("获取完毕...共{}个元素...", elements.size());
//当前页面的历史元素记录重置
currentHistoryAttributes.clear();
......@@ -149,10 +151,10 @@ public class SeleniumExecutor {
}
//总合信息
Set<String> messages = elementDetails.stream()
.filter(Objects::nonNull)
.map(ElementDetail::getMessage)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
StringBuilder message = new StringBuilder();
for (String msg : messages) {
message.append(msg);
message.append(";");
......@@ -171,7 +173,6 @@ public class SeleniumExecutor {
}
private void traversal(Map<Attributes, WebElement> elements, List<ElementDetail> elementDetails) {
elements = removeHistoryElements(elements);
for (Attributes attributes : elements.keySet()) {
WebElement element = elements.get(attributes);
if (!currentHistoryAttributes.contains(attributes) && isInputAble(element)) {
......@@ -194,8 +195,7 @@ public class SeleniumExecutor {
urlQueue.add(driver.getCurrentUrl());
urlQueue = queueDuplicateRemoval(urlQueue);
}
Map<Attributes, WebElement> reload = reload();
traversal(reload, elementDetails);
reload();
}
if (nonNull(elementDetail)) {
elementDetails.add(elementDetail);
......@@ -211,16 +211,17 @@ public class SeleniumExecutor {
boolean success = false;
try {
if (isEnabled(element)) {
log.info("元素 ----- tag:[{}] ------ text:[{}] ---- attrs:[{}] ------ notStale:{}", element.getTagName(), element.getText(), attributes, !ExpectedConditions.stalenessOf(element).apply(driver));
long startTime = System.currentTimeMillis();
if (Objects.equals(actType, INPUT)) {
log.info("Input操作 元素 ----- tag:[{}] ------ text:[{}] ---- attrs:[{}]", element.getTagName(), element.getText(), attributes);
log.info("Input操作");
if (!inputs.isEmpty()) {
Input input = inputs.remove(0);
element.sendKeys(input.getValue());
}
success = true;
} else if (Objects.equals(actType, CLICK)) {
log.info("Click操作 元素 ----- tag:[{}] ------ text:[{}] ---- attrs:[{}]", element.getTagName(), element.getText(), attributes);
log.info("Click操作");
element.click();
sleep();
success = true;
......@@ -249,6 +250,9 @@ public class SeleniumExecutor {
} catch (ElementNotInteractableException e) {
log.error("error:可操作范围之外的元素");
return null;
} catch (StaleElementReferenceException e) {
log.error("元素过期");
return null;
} catch (TimeoutException e) {
message = "页面超时";
success = false;
......@@ -313,11 +317,11 @@ public class SeleniumExecutor {
}
}
private Map<Attributes, WebElement> reload() {
private void reload() {
driver.get(currentUrl);
sleep();
currentSource = driver.getPageSource();
return getAllElements(driver);
elements = getAllElements(driver);
}
@SuppressWarnings("unused")
......@@ -330,31 +334,33 @@ public class SeleniumExecutor {
}
private Map<Attributes, WebElement> getAllElements(WebDriver driver) {
List<WebElement> webElements = Lists.newArrayList();
driver.findElements(By.xpath("*"))
.forEach(element -> getSubElements(element, webElements));
Document document = Jsoup.parse(driver.getPageSource());
List<Element> jElements = document.getAllElements().stream()
.filter(element -> element.childrenSize() == 0)
.collect(Collectors.toList());
Map<Attributes, WebElement> result = Maps.newHashMap();
for (int i = 0; i < webElements.size(); i++) {
WebElement webElement = webElements.get(i);
Element jElement = jElements.get(i);
result.put(jElement.attributes(), webElement);
try {
List<WebElement> webElements = Lists.newArrayList();
driver.findElements(By.xpath("*"))
.forEach(element -> getSubElements(element, webElements));
Document document = Jsoup.parse(driver.getPageSource());
List<Element> jElements = document.getAllElements().stream()
.filter(element -> element.childrenSize() == 0)
.collect(Collectors.toList());
Map<Attributes, WebElement> result = Maps.newHashMap();
for (int i = 0; i < webElements.size(); i++) {
WebElement webElement = webElements.get(i);
Element jElement = jElements.get(i);
result.put(jElement.attributes(), webElement);
}
return result;
} catch (StaleElementReferenceException e) {
log.error("获取元素过程中遇到元素过期 重新开始获取");
return getAllElements(driver);
}
return result;
}
private void getSubElements(WebElement element, List<WebElement> elements) {
try {
List<WebElement> results = element.findElements(By.xpath("*"));
if (results.isEmpty()) {
elements.add(element);
} else {
results.forEach(webElement -> getSubElements(webElement, elements));
}
} catch (StaleElementReferenceException ignored) {
List<WebElement> results = element.findElements(By.xpath("*"));
if (results.isEmpty()) {
elements.add(element);
} else {
results.forEach(webElement -> getSubElements(webElement, elements));
}
}
......@@ -396,10 +402,11 @@ public class SeleniumExecutor {
private void screenshot(String name) {
byte[] bytes = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
String path;
if (screenshotPath.endsWith("/")) {
String suffix = "/";
if (screenshotPath.endsWith(suffix)) {
path = screenshotPath + name;
} else {
path = screenshotPath + "/" + name;
path = screenshotPath + suffix + name;
}
FileUtil.output(bytes, path);
}
......@@ -423,11 +430,14 @@ public class SeleniumExecutor {
try {
Dimension size = driver.manage().window().getSize();
Point elementLocation = element.getLocation();
Dimension elementSize = element.getSize();
boolean xMatch = (elementLocation.x) >= 0 && (elementLocation.x + elementSize.width <= size.width);
boolean yMatch = (elementLocation.y) >= 0 && (elementLocation.y + elementSize.width <= size.height);
boolean xMatch = (elementLocation.x) >= 0 && (elementLocation.x <= size.width);
boolean yMatch = (elementLocation.y) >= 0 && (elementLocation.y <= size.height);
return xMatch && yMatch;
} catch (StaleElementReferenceException e) {
log.error("判断位置布局时元素过期");
return true;
} catch (Exception e) {
log.error("error:" + e);
return false;
}
}
......@@ -435,20 +445,24 @@ public class SeleniumExecutor {
@SuppressWarnings("OptionalGetWithoutIsPresent")
private String checkJsError() {
try {
return analyseLogError(driver.manage().logs().get(LogType.BROWSER).getAll().stream().findFirst().get());
return analyseLogError(driver.manage().logs().get(LogType.BROWSER).getAll().stream().findFirst().orElse(null));
} catch (Exception e) {
return null;
}
}
private String analyseLogError(LogEntry logEntry) {
if (logEntry.getMessage().contains("Uncaught TypeError:")) {
String typeError = "Uncaught TypeError:";
String fileNotFound = "Failed to load resource: net::ERR_FILE_NOT_FOUND";
String errorConnection = "Failed to load resource: net::ERR_CONNECTION_RESET";
String resourceFailure = "Failed to load resource: ";
if (logEntry.getMessage().contains(typeError)) {
return "JS类型错误";
} else if (logEntry.getMessage().contains("Failed to load resource: net::ERR_FILE_NOT_FOUND")) {
} else if (logEntry.getMessage().contains(fileNotFound)) {
return "资源加载错误";
} else if (logEntry.getMessage().contains("Failed to load resource: net::ERR_CONNECTION_RESET")) {
} else if (logEntry.getMessage().contains(errorConnection)) {
return "数据请求错误";
} else if (logEntry.getMessage().contains("Failed to load resource: ")) {
} else if (logEntry.getMessage().contains(resourceFailure)) {
return "加载依赖错误";
}
return null;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论