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

修正测试执行机制 取消jsoup使用

上级 866f299f
package com.zjty.autotest.pojo.test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
/**
* @author C
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ElementFeature {
private Point location;
private Dimension size;
private String tag;
private String text;
}
...@@ -9,14 +9,12 @@ import com.zjty.autotest.pojo.report.ElementDetail; ...@@ -9,14 +9,12 @@ 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.ActResult;
import com.zjty.autotest.pojo.test.ElementFeature;
import com.zjty.autotest.pojo.test.Input; import com.zjty.autotest.pojo.test.Input;
import com.zjty.autotest.pojo.test.Project; 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.jsoup.Jsoup;
import org.jsoup.nodes.Attributes;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element; import org.jsoup.nodes.Element;
import org.openqa.selenium.*; import org.openqa.selenium.*;
import org.openqa.selenium.logging.LogEntry; import org.openqa.selenium.logging.LogEntry;
...@@ -55,15 +53,15 @@ public class SeleniumExecutor { ...@@ -55,15 +53,15 @@ public class SeleniumExecutor {
private Set<String> historyUrls = Sets.newHashSet(); private Set<String> historyUrls = Sets.newHashSet();
private Set<Attributes> historyAttributes = Sets.newHashSet(); private Set<ElementFeature> historyFeatures = Sets.newHashSet();
private Set<Attributes> currentHistoryAttributes = Sets.newHashSet(); private Set<ElementFeature> currentHistoryFeatures = Sets.newHashSet();
private Queue<String> windowQueue = Queues.newLinkedBlockingDeque(); private Queue<String> windowQueue = Queues.newLinkedBlockingDeque();
private Queue<String> urlQueue = Queues.newLinkedBlockingDeque(); private Queue<String> urlQueue = Queues.newLinkedBlockingDeque();
private Map<Attributes, WebElement> elements = Maps.newHashMap(); private Map<ElementFeature, WebElement> elements = Maps.newHashMap();
/** /**
* 当前进行的窗口页 * 当前进行的窗口页
*/ */
...@@ -112,7 +110,8 @@ public class SeleniumExecutor { ...@@ -112,7 +110,8 @@ public class SeleniumExecutor {
} }
private Measure testUrl(String currentUrl) { private Measure testUrl(String currentUrl) {
Measure measure = null; Measure measure = new Measure();
measure.setUrl(currentUrl);
//如果该网页是未曾进入过的网页则加入历史记录并进行遍历测试 //如果该网页是未曾进入过的网页则加入历史记录并进行遍历测试
if (!historyUrls.contains(currentUrl)) { if (!historyUrls.contains(currentUrl)) {
historyUrls.add(driver.getCurrentUrl()); historyUrls.add(driver.getCurrentUrl());
...@@ -137,10 +136,13 @@ public class SeleniumExecutor { ...@@ -137,10 +136,13 @@ public class SeleniumExecutor {
elements = getAllElements(driver); elements = getAllElements(driver);
log.info("获取完毕...共{}个元素...", elements.size()); log.info("获取完毕...共{}个元素...", elements.size());
//当前页面的历史元素记录重置 //当前页面的历史元素记录重置
currentHistoryAttributes.clear(); currentHistoryFeatures.clear();
//开始遍历操作元素队列中的元素 返回各个元素测试信息 //开始遍历操作元素队列中的元素 返回各个元素测试信息
List<ElementDetail> elementDetails = Lists.newArrayList(); List<ElementDetail> elementDetails = Lists.newArrayList();
traversal(elementDetails); traversal(elementDetails);
elementDetails = elementDetails.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
//如果全部元素通过则是通过 //如果全部元素通过则是通过
Boolean success = elementDetails.stream() Boolean success = elementDetails.stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
...@@ -176,18 +178,18 @@ public class SeleniumExecutor { ...@@ -176,18 +178,18 @@ public class SeleniumExecutor {
} }
private void traversal(List<ElementDetail> elementDetails) { private void traversal(List<ElementDetail> elementDetails) {
for (Attributes attributes : elements.keySet()) { for (ElementFeature feature : elements.keySet()) {
WebElement element = elements.get(attributes); WebElement element = elements.get(feature);
if (!currentHistoryAttributes.contains(attributes) && isInputAble(element)) { if (!currentHistoryFeatures.contains(feature) && isInputAble(element)) {
ActResult act = act(attributes, element, INPUT); ActResult act = act(feature, element, INPUT);
ElementDetail elementDetail = act.getElementDetail(); ElementDetail elementDetail = act.getElementDetail();
elementDetails.add(elementDetail); elementDetails.add(elementDetail);
} }
} }
for (Attributes attributes : elements.keySet()) { for (ElementFeature feature : elements.keySet()) {
WebElement element = elements.get(attributes); WebElement element = elements.get(feature);
if (!currentHistoryAttributes.contains(attributes) && isClickAble(element)) { if (!currentHistoryFeatures.contains(feature) && isClickAble(element)) {
ActResult act = act(attributes, element, CLICK); ActResult act = act(feature, element, CLICK);
ElementDetail elementDetail = act.getElementDetail(); ElementDetail elementDetail = act.getElementDetail();
elementDetails.add(elementDetail); elementDetails.add(elementDetail);
if (act.getStaleness()) { if (act.getStaleness()) {
...@@ -199,8 +201,7 @@ public class SeleniumExecutor { ...@@ -199,8 +201,7 @@ public class SeleniumExecutor {
} }
} }
@SuppressWarnings("AlibabaMethodTooLong") private ActResult act(ElementFeature feature, WebElement element, String actType) {
private ActResult act(Attributes attributes, WebElement element, String actType) {
String type = String.format("<%s>%s", element.getTagName(), element.getText()); String type = String.format("<%s>%s", element.getTagName(), element.getText());
String message = null; String message = null;
long responseTime = -1L; long responseTime = -1L;
...@@ -208,7 +209,7 @@ public class SeleniumExecutor { ...@@ -208,7 +209,7 @@ public class SeleniumExecutor {
boolean staleness = false; boolean staleness = false;
try { try {
if (isEnabled(element)) { if (isEnabled(element)) {
log.info("元素 ----- tag:[{}] ------ text:[{}] ---- attrs:[{}] ------ notStale:{}", element.getTagName(), element.getText(), attributes, !ExpectedConditions.stalenessOf(element).apply(driver)); log.info("元素 ----- tag:[{}] ------ text:[{}] ---- feature:[{}] ------ notStale:{}", element.getTagName(), element.getText(), feature, !ExpectedConditions.stalenessOf(element).apply(driver));
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
if (Objects.equals(actType, INPUT)) { if (Objects.equals(actType, INPUT)) {
log.info("Input操作"); log.info("Input操作");
...@@ -222,23 +223,6 @@ public class SeleniumExecutor { ...@@ -222,23 +223,6 @@ public class SeleniumExecutor {
element.click(); element.click();
sleep(); sleep();
success = true; success = true;
boolean urlChanged = checkURl();
boolean sourceChanged = checkSource();
if (urlChanged) {
boolean newPage = !historyUrls.contains(driver.getCurrentUrl())
&& !Sets.newHashSet(urlQueue).contains(driver.getCurrentUrl())
&& sourceChanged;
if (newPage) {
log.info("检测到新url:{} 加入队列 ", driver.getCurrentUrl());
urlQueue.add(driver.getCurrentUrl());
urlQueue = queueDuplicateRemoval(urlQueue);
}
reload();
}
if (ExpectedConditions.stalenessOf(element).apply(driver)) {
element = elements.get(attributes);
staleness = true;
}
} }
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
responseTime = endTime - startTime; responseTime = endTime - startTime;
...@@ -260,13 +244,14 @@ public class SeleniumExecutor { ...@@ -260,13 +244,14 @@ public class SeleniumExecutor {
success = false; success = false;
log.error("error:出现js异常:{}", jsMsg); log.error("error:出现js异常:{}", jsMsg);
} }
staleness = checkPage();
} }
} catch (ElementNotInteractableException e) { } catch (ElementNotInteractableException e) {
log.error("error:可操作范围之外的元素"); log.error("error:可操作范围之外的元素");
return new ActResult(staleness, null); return new ActResult(false, null);
} catch (StaleElementReferenceException e) { } catch (StaleElementReferenceException e) {
log.error("元素过期"); log.error("元素过期");
return new ActResult(staleness, null); return new ActResult(false, null);
} catch (TimeoutException e) { } catch (TimeoutException e) {
message = "页面超时"; message = "页面超时";
success = false; success = false;
...@@ -284,8 +269,8 @@ public class SeleniumExecutor { ...@@ -284,8 +269,8 @@ public class SeleniumExecutor {
success = false; success = false;
log.error("error:" + e); log.error("error:" + e);
} }
historyAttributes.add(attributes); historyFeatures.add(feature);
currentHistoryAttributes.add(attributes); currentHistoryFeatures.add(feature);
return new ActResult( return new ActResult(
staleness, staleness,
new ElementDetail( new ElementDetail(
...@@ -297,6 +282,25 @@ public class SeleniumExecutor { ...@@ -297,6 +282,25 @@ public class SeleniumExecutor {
); );
} }
private Boolean checkPage(){
boolean staleness = false;
boolean urlChanged = checkURl();
boolean sourceChanged = checkSource();
if (urlChanged) {
boolean newPage = !historyUrls.contains(driver.getCurrentUrl())
&& !Sets.newHashSet(urlQueue).contains(driver.getCurrentUrl())
&& sourceChanged;
if (newPage) {
log.info("检测到新url:{} 加入队列 ", driver.getCurrentUrl());
urlQueue.add(driver.getCurrentUrl());
urlQueue = queueDuplicateRemoval(urlQueue);
staleness = true;
}
reload();
}
return staleness;
}
private Boolean checkURl() { private Boolean checkURl() {
String practiseUrl = driver.getCurrentUrl(); String practiseUrl = driver.getCurrentUrl();
return !Objects.equals(currentUrl, practiseUrl); return !Objects.equals(currentUrl, practiseUrl);
...@@ -350,19 +354,13 @@ public class SeleniumExecutor { ...@@ -350,19 +354,13 @@ public class SeleniumExecutor {
} }
} }
private Map<Attributes, WebElement> getAllElements(WebDriver driver) { private Map<ElementFeature, WebElement> getAllElements(WebDriver driver) {
List<WebElement> webElements = Lists.newArrayList(); List<WebElement> webElements = Lists.newArrayList();
driver.findElements(By.xpath("*")) driver.findElements(By.xpath("*"))
.forEach(element -> getSubElements(element, webElements)); .forEach(element -> getSubElements(element, webElements));
Document document = Jsoup.parse(driver.getPageSource()); Map<ElementFeature, WebElement> result = Maps.newHashMap();
List<Element> jElements = document.getAllElements().stream() for (WebElement webElement : webElements) {
.filter(element -> element.childrenSize() == 0) result.put(toFeature(webElement), webElement);
.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; return result;
} }
...@@ -430,11 +428,11 @@ public class SeleniumExecutor { ...@@ -430,11 +428,11 @@ public class SeleniumExecutor {
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
private Map<Attributes, WebElement> removeHistoryElements(Map<Attributes, WebElement> elements) { private Map<ElementFeature, WebElement> removeHistoryElements(Map<ElementFeature, WebElement> elements) {
Map<Attributes, WebElement> result = Maps.newHashMap(elements); Map<ElementFeature, WebElement> result = Maps.newHashMap(elements);
elements.forEach((attributes, element) -> { elements.forEach((feature, element) -> {
if (historyAttributes.contains(attributes)) { if (historyFeatures.contains(feature)) {
result.remove(attributes, element); result.remove(feature, element);
} }
}); });
return result; return result;
...@@ -485,4 +483,13 @@ public class SeleniumExecutor { ...@@ -485,4 +483,13 @@ public class SeleniumExecutor {
return null; return null;
} }
private ElementFeature toFeature(WebElement element) {
return new ElementFeature(
element.getLocation(),
element.getSize(),
element.getTagName(),
element.getText()
);
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论