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

内部逻辑优化 增加对URL是否可访问的检查

上级 9a89229b
package com.zjty.autotest.pojo.test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.openqa.selenium.WebElement;
/**
* <p>Description : autotest
* <p>Date : 2020/4/9 14:48
* <p>@author : C
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ElementEntry {
private ElementFeature feature;
private WebElement element;
private WebElement frame;
}
...@@ -5,6 +5,7 @@ import lombok.Data; ...@@ -5,6 +5,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.openqa.selenium.Dimension; import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point; import org.openqa.selenium.Point;
import org.openqa.selenium.Rectangle;
/** /**
* @author C * @author C
...@@ -13,8 +14,7 @@ import org.openqa.selenium.Point; ...@@ -13,8 +14,7 @@ import org.openqa.selenium.Point;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class ElementFeature { public class ElementFeature {
private Point location;
private Dimension size;
private String tag; private String tag;
private String text; private String text;
private Rectangle rect;
} }
...@@ -8,25 +8,29 @@ import com.zjty.autotest.common.action.LabelType; ...@@ -8,25 +8,29 @@ import com.zjty.autotest.common.action.LabelType;
import com.zjty.autotest.pojo.report.ElementDetail; import com.zjty.autotest.pojo.report.ElementDetail;
import com.zjty.autotest.pojo.report.Measure; import com.zjty.autotest.pojo.report.Measure;
import com.zjty.autotest.pojo.report.Report; import com.zjty.autotest.pojo.report.Report;
import com.zjty.autotest.pojo.test.ActResult; import com.zjty.autotest.pojo.test.*;
import com.zjty.autotest.pojo.test.ElementFeature;
import com.zjty.autotest.pojo.test.Input;
import com.zjty.autotest.pojo.test.Project;
import com.zjty.autotest.util.FileUtil; import com.zjty.autotest.util.FileUtil;
import com.zjty.autotest.util.WebDriverUtil; import com.zjty.autotest.util.WebDriverUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.jsoup.nodes.Element; import org.jsoup.nodes.Element;
import org.openqa.selenium.*; import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.MoveTargetOutOfBoundsException;
import org.openqa.selenium.logging.LogEntry; import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType; import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Sleeper; import org.openqa.selenium.support.ui.Sleeper;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import sun.net.www.protocol.file.FileURLConnection;
import sun.net.www.protocol.ftp.FtpURLConnection;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.Duration; import java.time.Duration;
import java.util.*; import java.util.*;
import java.util.NoSuchElementException;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -41,7 +45,7 @@ import static java.util.Objects.nonNull; ...@@ -41,7 +45,7 @@ import static java.util.Objects.nonNull;
@Service @Service
public class SeleniumExecutor { public class SeleniumExecutor {
@Value("${selenium.executor.wait-after-click}") @Value("${selenium.executor.wait-time}")
private Long waitTime; private Long waitTime;
@Value("${screenshot-path}") @Value("${screenshot-path}")
...@@ -57,11 +61,14 @@ public class SeleniumExecutor { ...@@ -57,11 +61,14 @@ public class SeleniumExecutor {
private Set<ElementFeature> currentHistoryFeatures = Sets.newHashSet(); private Set<ElementFeature> currentHistoryFeatures = Sets.newHashSet();
private Queue<String> windowQueue = Queues.newLinkedBlockingDeque(); private Queue<String> urlQueue = Queues.newLinkedBlockingQueue();
private Queue<String> urlQueue = Queues.newLinkedBlockingDeque(); private Queue<ElementEntry> elementQueue = Queues.newLinkedBlockingQueue();
private WebDriverWait webDriverWait;
private Actions actions;
private Map<ElementFeature, WebElement> elements = Maps.newHashMap();
/** /**
* 当前进行的窗口页 * 当前进行的窗口页
*/ */
...@@ -72,21 +79,16 @@ public class SeleniumExecutor { ...@@ -72,21 +79,16 @@ public class SeleniumExecutor {
*/ */
private String currentUrl; private String currentUrl;
/**
* 当前测试url的源码
*/
private String currentSource;
public Report execute(Project project) { public Report execute(Project project) {
driver = WebDriverUtil.getWebDriver(project.getBrowser()); driver = WebDriverUtil.getWebDriver(project.getBrowser());
driver.manage().window().maximize(); driver.manage().window().maximize();
webDriverWait = new WebDriverWait(driver, waitTime);
actions = new Actions(driver);
inputs = project.getInputs(); inputs = project.getInputs();
List<Measure> measures = Lists.newArrayList(); List<Measure> measures = Lists.newArrayList();
String os = ""; String os = Strings.EMPTY;
currentUrl = project.getUrl(); currentUrl = project.getUrl();
currentWindow = driver.getWindowHandle(); currentWindow = driver.getWindowHandle();
while (nonNull(currentWindow)) {
driver.switchTo().window(currentWindow);
while (nonNull(currentUrl)) { while (nonNull(currentUrl)) {
Measure measure = testUrl(currentUrl); Measure measure = testUrl(currentUrl);
if (nonNull(measure)) { if (nonNull(measure)) {
...@@ -94,10 +96,6 @@ public class SeleniumExecutor { ...@@ -94,10 +96,6 @@ public class SeleniumExecutor {
} }
currentUrl = urlQueue.poll(); currentUrl = urlQueue.poll();
} }
currentWindow = windowQueue.poll();
driver.close();
checkWindow();
}
driver.quit(); driver.quit();
return new Report( return new Report(
null, null,
...@@ -112,205 +110,193 @@ public class SeleniumExecutor { ...@@ -112,205 +110,193 @@ public class SeleniumExecutor {
private Measure testUrl(String currentUrl) { private Measure testUrl(String currentUrl) {
Measure measure = new Measure(); Measure measure = new Measure();
measure.setUrl(currentUrl); measure.setUrl(currentUrl);
measure.setResponseTime(-1);
//如果该网页是未曾进入过的网页则加入历史记录并进行遍历测试 //如果该网页是未曾进入过的网页则加入历史记录并进行遍历测试
if (!historyUrls.contains(currentUrl)) { if (!historyUrls.contains(currentUrl)) {
historyUrls.add(driver.getCurrentUrl()); historyUrls.add(currentUrl);
//打开网页 记录响应时间 log.info("当前URL:{} ", currentUrl);
long startTime = System.currentTimeMillis(); boolean connectAble = checkConnect(currentUrl);
driver.get(currentUrl); if (connectAble) {
currentSource = driver.getPageSource(); //打开网页 记录响应时间
long endTime = System.currentTimeMillis(); long responseTime = load(currentUrl);
Long responseTime = endTime - startTime; measure.setResponseTime((int) responseTime);
sleep(); log.info("响应时间 {} ms 开始进行遍历...", responseTime);
log.info("当前URL:{} 响应时间 {} ms 开始进行遍历...", currentUrl, responseTime); log.info("剩余URL队列:{}", urlQueue);
log.info("剩余URL队列:{}", urlQueue); StringBuilder message = new StringBuilder();
log.info("正在获取当前网页所有元素..."); Set<String> messages = Sets.newHashSet();
StringBuilder message = new StringBuilder(); String error = checkJsError();
Set<String> messages = Sets.newHashSet(); if (nonNull(error)) {
String error = checkJsError(); messages.add(error);
if (nonNull(error)) { }
messages.add(error); //获取当前网页的所有元素并放入元素队列
} log.info("获取完毕...共{}个元素...", elementQueue.size());
//获取当前网页的所有元素并放入元素队列 //当前页面的历史元素记录重置
elements.clear(); currentHistoryFeatures.clear();
elements = getAllElements(driver); //开始遍历操作元素队列中的元素 返回各个元素测试信息
log.info("获取完毕...共{}个元素...", elements.size()); List<ElementDetail> elementDetails = traversal();
//当前页面的历史元素记录重置 measure.setElementDetails(elementDetails);
currentHistoryFeatures.clear(); //如果全部元素通过则是通过
//开始遍历操作元素队列中的元素 返回各个元素测试信息 Boolean success = elementDetails.stream()
List<ElementDetail> elementDetails = Lists.newArrayList(); .filter(Objects::nonNull)
traversal(elementDetails); .allMatch(ElementDetail::getSuccess);
elementDetails = elementDetails.stream() //如果未通过 则提供截图
.filter(Objects::nonNull) if (!success) {
.collect(Collectors.toList()); String screenshotName = alterUrlName(currentUrl) + ".png";
//如果全部元素通过则是通过 screenshot(screenshotName);
Boolean success = elementDetails.stream() measure.setScreenshot(String.format("/%s", screenshotName));
.filter(Objects::nonNull) }
.allMatch(ElementDetail::getSuccess); measure.setSuccess(success);
//如果出错 则提供截图 //总合信息
String screenshot = null; messages.addAll(elementDetails.stream()
if (!success) { .filter(Objects::nonNull)
String screenshotName = alterUrlName(currentUrl) + ".png"; .map(ElementDetail::getMessage)
screenshot(screenshotName); .filter(Strings::isNotEmpty)
screenshot = String.format("/%s", screenshotName); .collect(Collectors.toList()));
} for (String msg : messages) {
//总合信息 message.append(msg);
messages.addAll(elementDetails.stream() message.append(";");
.filter(Objects::nonNull) }
.map(ElementDetail::getMessage) measure.setMessage(message.toString());
.filter(Objects::nonNull) log.info("遍历完毕...");
.collect(Collectors.toList())); } else {
for (String msg : messages) { measure.setMessage("无法访问的URL;");
message.append(msg); measure.setElementDetails(Lists.newArrayList());
message.append(";");
} }
log.info("遍历完毕...");
measure = new Measure(
currentUrl,
success,
responseTime.intValue(),
message.toString(),
screenshot,
elementDetails
);
} }
return measure; return measure;
} }
private void traversal(List<ElementDetail> elementDetails) { private List<ElementDetail> traversal() {
for (ElementFeature feature : elements.keySet()) { List<ElementDetail> elementDetails = Lists.newArrayList();
WebElement element = elements.get(feature); while (!elementQueue.isEmpty()) {
if (!currentHistoryFeatures.contains(feature) && isInputAble(element)) { ElementEntry elementEntry = elementQueue.poll();
ActResult act = act(feature, element, INPUT); ElementFeature feature = elementEntry.getFeature();
ElementDetail elementDetail = act.getElementDetail(); if (!currentHistoryFeatures.contains(feature)) {
elementDetails.add(elementDetail); if (isInput(feature)) {
} ElementDetail elementDetail = act(elementEntry, INPUT);
} if (!isSkipped(elementDetail)) {
for (ElementFeature feature : elements.keySet()) { elementDetails.add(elementDetail);
WebElement element = elements.get(feature); }
if (!currentHistoryFeatures.contains(feature) && isClickAble(element)) { } else {
ActResult act = act(feature, element, CLICK); ElementDetail elementDetail = act(elementEntry, CLICK);
ElementDetail elementDetail = act.getElementDetail(); if (!isSkipped(elementDetail)) {
elementDetails.add(elementDetail); elementDetails.add(elementDetail);
if (act.getStaleness()) { }
reload();
traversal(elementDetails);
return;
} }
} }
} }
return elementDetails;
} }
private ActResult act(ElementFeature feature, WebElement element, String actType) { private ElementDetail act(ElementEntry elementEntry, String actType) {
String type = String.format("<%s>%s", element.getTagName(), element.getText()); WebElement element = elementEntry.getElement();
String message = null; ElementFeature feature = elementEntry.getFeature();
String type = String.format("<%s>%s", feature.getTag(), feature.getText());
String message = Strings.EMPTY;
long responseTime = -1L; long responseTime = -1L;
boolean success = false; boolean success = false;
boolean staleness = false;
try { try {
if (isEnabled(element)) { if (nonNull(elementEntry.getFrame())) {
log.info("元素 ----- tag:[{}] ------ text:[{}] ---- feature:[{}] ------ notStale:{}", element.getTagName(), element.getText(), feature, !ExpectedConditions.stalenessOf(element).apply(driver)); driver.switchTo().frame(elementEntry.getFrame());
}
if (isEnabled(element) && isDisPlayed(element)) {
log.info("元素 ----- feature:[{}]", feature);
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
if (Objects.equals(actType, INPUT)) { if (Objects.equals(actType, INPUT)) {
log.info("Input操作"); log.info("input操作");
if (!inputs.isEmpty()) { if (!inputs.isEmpty()) {
Input input = inputs.remove(0); Input input = inputs.remove(0);
element.sendKeys(input.getValue()); element.sendKeys(input.getValue());
} }
success = true; success = true;
} else if (Objects.equals(actType, CLICK)) { } else if (Objects.equals(actType, CLICK)) {
log.info("Click操作"); log.info("click操作");
element.click(); actions.moveToElement(element).click().perform();
sleep();
success = true; success = true;
} }
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
//响应时间
responseTime = endTime - startTime; responseTime = endTime - startTime;
Alert alert = ExpectedConditions.alertIsPresent().apply(driver); //检查窗口切换
String jsMsg = checkJsError(); checkWindow();
Boolean locationMatch = checkLocation(element); //检查页面变化 有变化则重新读取URL和元素
if (!locationMatch) { boolean urlChanged = checkPage();
message = "布局错误"; boolean elementStaled = ExpectedConditions.stalenessOf(element).apply(driver);
success = false; boolean pageChanged = urlChanged || elementStaled;
log.error("error:布局错误"); if (pageChanged) {
} log.warn("page changed.reload...");
if (nonNull(alert)) { load(currentUrl);
message = "error:出现警告窗:" + alert.getText(); log.info("reload complete.");
alert.accept(); } else {
success = false; //页面无变化
log.error("error:出现警告窗:{}", alert.getText()); //检查警告窗
} else if (nonNull(jsMsg)) { Alert alert = ExpectedConditions.alertIsPresent().apply(driver);
message = jsMsg; if (nonNull(alert)) {
success = false; message = "出现警告窗:" + alert.getText();
log.error("error:出现js异常:{}", jsMsg); alert.accept();
success = false;
log.error("出现警告窗:{}", alert.getText());
} else {
//通过读取浏览器日志来检查js异常
String jsMsg = checkJsError();
if (nonNull(jsMsg)) {
message = jsMsg;
success = false;
log.error("出现js异常:{}", jsMsg);
}
}
} }
staleness = checkPage();
} }
} catch (ElementNotInteractableException e) {
log.error("error:可操作范围之外的元素");
return new ActResult(false, null);
} catch (StaleElementReferenceException e) {
log.error("元素过期");
return new ActResult(false, null);
} catch (TimeoutException e) { } catch (TimeoutException e) {
message = "页面超时"; message = "元素超时";
success = false; success = false;
log.error("error:页面超时"); log.error("元素超时");
} catch (NoSuchElementException e) { } catch (MoveTargetOutOfBoundsException e) {
message = "依赖缺失"; message = "元素布局错误";
success = false; success = false;
log.error("error:依赖缺失"); log.error("元素布局错误");
} catch (WebDriverException e) {
message = "无法访问的地址";
success = false;
log.error("error:无法访问的地址");
} catch (Exception e) { } catch (Exception e) {
message = "出现预料之外的错误"; message = "出现预料之外的错误";
success = false; success = false;
e.printStackTrace();
log.error("error:" + e); log.error("error:" + e);
} }
if (nonNull(elementEntry.getFrame())) {
driver.switchTo().defaultContent();
}
historyFeatures.add(feature); historyFeatures.add(feature);
currentHistoryFeatures.add(feature); currentHistoryFeatures.add(feature);
return new ActResult( return new ElementDetail(type, (int) responseTime, success, message);
staleness, }
new ElementDetail(
type, private Boolean isSkipped(ElementDetail elementDetail) {
(int) responseTime, return Objects.equals(elementDetail.getResponseTime(), -1) && Objects.equals(elementDetail.getMessage(), Strings.EMPTY);
success,
message
)
);
} }
private Boolean checkPage(){ private Boolean checkPage() {
boolean staleness = false;
boolean urlChanged = checkURl(); boolean urlChanged = checkURl();
boolean sourceChanged = checkSource(); boolean pageChanged = false;
if (urlChanged) { if (urlChanged) {
boolean newPage = !historyUrls.contains(driver.getCurrentUrl()) log.info("URL changed.");
&& !Sets.newHashSet(urlQueue).contains(driver.getCurrentUrl()) pageChanged = true;
&& sourceChanged; String practiseCurrentUrl = driver.getCurrentUrl();
boolean newPage = !historyUrls.contains(practiseCurrentUrl)
&& !Sets.newHashSet(urlQueue).contains(practiseCurrentUrl);
if (newPage) { if (newPage) {
log.info("检测到新url:{} 加入队列 ", driver.getCurrentUrl()); log.info("检测到新URL:{} 加入队列 ", driver.getCurrentUrl());
urlQueue.add(driver.getCurrentUrl()); urlQueue.add(driver.getCurrentUrl());
urlQueue = queueDuplicateRemoval(urlQueue); urlQueue = queueDuplicateRemoval(urlQueue);
staleness = true;
} }
reload();
} }
return staleness; return pageChanged;
} }
private Boolean checkURl() { private Boolean checkURl() {
String practiseUrl = driver.getCurrentUrl(); String practiseUrl = webDriverWait.until(WebDriver::getCurrentUrl);
return !Objects.equals(currentUrl, practiseUrl); return !Objects.equals(currentUrl, practiseUrl);
} }
private Boolean checkSource() {
String practise = driver.getPageSource();
return !Objects.equals(practise, currentSource);
}
private Queue<String> queueDuplicateRemoval(Queue<String> queue) { private Queue<String> queueDuplicateRemoval(Queue<String> queue) {
HashSet<String> set = Sets.newHashSet(queue); HashSet<String> set = Sets.newHashSet(queue);
return Queues.newLinkedBlockingDeque(set); return Queues.newLinkedBlockingDeque(set);
...@@ -333,16 +319,36 @@ public class SeleniumExecutor { ...@@ -333,16 +319,36 @@ public class SeleniumExecutor {
} }
private void checkWindow() { private void checkWindow() {
if (!windowQueue.isEmpty()) { Set<String> practise = webDriverWait.until(WebDriver::getWindowHandles);
windowQueue = Queues.newLinkedBlockingQueue(driver.getWindowHandles()); boolean windowChanged = practise.size() >= 2;
if (windowChanged) {
for (String newWindow : practise) {
if (!Objects.equals(newWindow, currentWindow)) {
driver.switchTo().window(newWindow);
log.info("here comes a new window.");
String practiseCurrentUrl = driver.getCurrentUrl();
boolean newPage = !historyUrls.contains(practiseCurrentUrl)
&& !Sets.newHashSet(urlQueue).contains(practiseCurrentUrl);
if (newPage) {
log.info("检测到新URL:{} 加入队列 ", driver.getCurrentUrl());
urlQueue.add(driver.getCurrentUrl());
urlQueue = queueDuplicateRemoval(urlQueue);
}
driver.close();
driver.switchTo().window(currentWindow);
break;
}
}
} }
} }
private void reload() { private Long load(String currentUrl) {
long startTime = System.currentTimeMillis();
driver.get(currentUrl); driver.get(currentUrl);
sleep(); long endTime = System.currentTimeMillis();
currentSource = driver.getPageSource(); long responseTime = endTime - startTime;
elements = getAllElements(driver); getAllElements();
return responseTime;
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
...@@ -354,59 +360,53 @@ public class SeleniumExecutor { ...@@ -354,59 +360,53 @@ public class SeleniumExecutor {
} }
} }
private Map<ElementFeature, WebElement> getAllElements(WebDriver driver) { private void getAllElements() {
List<WebElement> webElements = Lists.newArrayList(); elementQueue.clear();
driver.findElements(By.xpath("*")) // List<WebElement> frames = webDriverWait.until(webDriver -> webDriver.findElements(By.tagName("iframe")));
.forEach(element -> getSubElements(element, webElements)); // List<WebElement> webElements = webDriverWait.until(webDriver -> driver.findElements(By.xpath("//*")).stream().filter(element -> element.findElements(By.xpath("*")).isEmpty()).collect(Collectors.toList()));
Map<ElementFeature, WebElement> result = Maps.newHashMap(); List<WebElement> webElements = webDriverWait.until(webDriver -> driver.findElements(By.xpath("//*")));
for (WebElement webElement : webElements) { for (WebElement webElement : webElements) {
result.put(toFeature(webElement), webElement); ElementFeature feature = toFeature(webElement);
ElementEntry entry = new ElementEntry(feature, webElement, null);
elementQueue.add(entry);
} }
return result; // if (!frames.isEmpty()) {
// for (WebElement frame : frames) {
// List<WebElement> webElementsInFrame = webDriverWait.until(webDriver -> frame.findElements(By.xpath("//*")).stream().filter(element -> element.findElements(By.xpath("*")).isEmpty()).collect(Collectors.toList()));
// Queue<ElementEntry> queue = Queues.newLinkedBlockingQueue();
// for (WebElement webElement : webElementsInFrame) {
// ElementFeature feature = toFeature(webElement);
// ElementEntry entry = new ElementEntry(feature, webElement, frame);
// queue.add(entry);
// }
// }
// }
} }
private void getSubElements(WebElement element, List<WebElement> elements) { private Boolean isInput(ElementFeature feature) {
List<WebElement> results = element.findElements(By.xpath("*")); return Objects.equals(feature.getTag(), LabelType.INPUT);
if (results.isEmpty()) {
elements.add(element);
} else {
results.forEach(webElement -> getSubElements(webElement, elements));
}
} }
private Boolean isInputAble(WebElement element) { private Boolean isEnabled(WebElement element) {
return isEnabled(element) && Objects.equals(element.getTagName(), LabelType.INPUT); return element.isEnabled();
}
@SuppressWarnings("unused")
private Boolean isClickAble(WebElement element) {
try {
return nonNull(ExpectedConditions.elementToBeClickable(element).apply(driver));
} catch (Exception e) {
return false;
}
} }
private Boolean isEnabled(WebElement element) { private Boolean isDisPlayed(WebElement element) {
try { return element.isDisplayed();
return nonNull(ExpectedConditions.elementToBeClickable(element).apply(driver));
} catch (Exception e) {
return false;
}
} }
private String alterUrlName(String fileName) { private String alterUrlName(String fileName) {
// /\?*:"<>| // /\?*:"<>|
return fileName.replace("/", "") return fileName.replace("/", Strings.EMPTY)
.replace("\\", "") .replace("\\", Strings.EMPTY)
.replace("#", "") .replace("#", Strings.EMPTY)
.replace("?", "") .replace("?", Strings.EMPTY)
.replace("*", "") .replace("*", Strings.EMPTY)
.replace(":", "") .replace(":", Strings.EMPTY)
.replace("<", "") .replace("<", Strings.EMPTY)
.replace(".", "") .replace(".", Strings.EMPTY)
.replace(">", "") .replace(">", Strings.EMPTY)
.replace("|", ""); .replace("|", Strings.EMPTY);
} }
private void screenshot(String name) { private void screenshot(String name) {
...@@ -438,27 +438,13 @@ public class SeleniumExecutor { ...@@ -438,27 +438,13 @@ public class SeleniumExecutor {
return result; return result;
} }
private Boolean checkLocation(WebElement element) {
try {
Dimension size = driver.manage().window().getSize();
Point elementLocation = element.getLocation();
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 false;
} catch (Exception e) {
log.error("判断位置时出现错误:" + e);
return false;
}
}
@SuppressWarnings("OptionalGetWithoutIsPresent")
private String checkJsError() { private String checkJsError() {
try { try {
return analyseLogError(driver.manage().logs().get(LogType.BROWSER).getAll().stream().findFirst().orElse(null)); List<LogEntry> entries = webDriverWait.until(webDriver -> webDriver.manage().logs().get(LogType.BROWSER).getAll());
return analyseLogError(entries.stream().findFirst().orElse(null));
} catch (Exception e) { } catch (Exception e) {
log.error("出现异常:");
e.printStackTrace();
return null; return null;
} }
} }
...@@ -469,27 +455,67 @@ public class SeleniumExecutor { ...@@ -469,27 +455,67 @@ public class SeleniumExecutor {
String errorConnection = "Failed to load resource: net::ERR_CONNECTION_RESET"; String errorConnection = "Failed to load resource: net::ERR_CONNECTION_RESET";
String resourceFailure = "Failed to load resource: "; String resourceFailure = "Failed to load resource: ";
String referenceError = "Uncaught ReferenceError: "; String referenceError = "Uncaught ReferenceError: ";
if (logEntry.getMessage().contains(typeError)) { if (nonNull(logEntry) && nonNull(logEntry.getMessage())) {
return "JS类型错误"; if (logEntry.getMessage().contains(typeError)) {
} else if (logEntry.getMessage().contains(fileNotFound)) { return "JS类型错误";
return "资源加载错误"; } else if (logEntry.getMessage().contains(fileNotFound)) {
} else if (logEntry.getMessage().contains(errorConnection)) { return "资源加载错误";
return "数据请求错误"; } else if (logEntry.getMessage().contains(errorConnection)) {
} else if (logEntry.getMessage().contains(resourceFailure)) { return "数据请求错误";
return "加载依赖错误"; } else if (logEntry.getMessage().contains(resourceFailure)) {
} else if (logEntry.getMessage().contains(referenceError)) { return "加载依赖错误";
return "没有依赖"; } else if (logEntry.getMessage().contains(referenceError)) {
return "依赖缺失";
}
} }
return null; return null;
} }
private ElementFeature toFeature(WebElement element) { private ElementFeature toFeature(WebElement element) {
return new ElementFeature( return new ElementFeature(
element.getLocation(),
element.getSize(),
element.getTagName(), element.getTagName(),
element.getText() element.getText(),
element.getRect()
); );
} }
private Boolean checkConnect(String url) {
boolean connect = false;
String httpPrefix = "http";
String filePrefix = "file";
String ftpPrefix = "ftp";
if (url.startsWith(httpPrefix)) {
try {
URL u = new URL(url);
HttpURLConnection uConnection = (HttpURLConnection) u.openConnection();
uConnection.connect();
connect = true;
uConnection.disconnect();
} catch (Exception e) {
connect = false;
}
} else if (url.startsWith(filePrefix)) {
try {
URL u = new URL(url);
FileURLConnection uConnection = (FileURLConnection) u.openConnection();
uConnection.connect();
connect = true;
uConnection.close();
} catch (Exception e) {
connect = false;
}
} else if (url.startsWith(ftpPrefix)) {
try {
URL u = new URL(url);
FtpURLConnection uConnection = (FtpURLConnection) u.openConnection();
uConnection.connect();
connect = true;
uConnection.close();
} catch (Exception e) {
connect = false;
}
}
return connect;
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论