提交 da9becd6 authored 作者: 孙洁清's avatar 孙洁清

Merge branch 'master' of git.yfzx.zjtys.com.cn:hct/auto-test

package com.zjty.autotest.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author C
* 静态资源映射
*/
@SuppressWarnings("SpringMVCViewInspection")
@Controller
public class ResourceController {
......@@ -12,4 +17,8 @@ public class ResourceController {
return "index.html";
}
@RequestMapping("/pic/{name}")
public String picture(@PathVariable String name){
return name + ".png";
}
}
......@@ -40,7 +40,6 @@ public class Measure {
/**
* 截图的url
*/
private String picture;
private String screenshot;
}
......@@ -42,15 +42,9 @@ public class Report {
*/
private String os;
/**
* 测试结果信息
*/
private String message;
/**
* 每个路由测试详情
*/
private List<Measure> measures;
}
......@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.List;
/**
......@@ -18,7 +20,7 @@ public class Project {
/**
* 主键
*/
private String id;
private Integer id;
/**
* 项目名称
......
package com.zjty.autotest.service;
package com.zjty.autotest.service.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
import com.google.common.collect.Sets;
import com.zjty.autotest.pojo.report.Measure;
import com.zjty.autotest.pojo.report.Report;
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.WebDriverUtil;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Predicate;
import static com.zjty.autotest.common.action.LabelType.*;
import static java.util.Objects.nonNull;
/**
* @author C
*/
@SuppressWarnings("FieldCanBeLocal")
@Slf4j
@Service
......@@ -23,7 +31,7 @@ public class SeleniumExecutor {
private WebDriver driver;
private Map<String, String> inputs = Maps.newHashMap();
private List<Input> inputs = Lists.newArrayList();
private Set<String> historyUrls = Sets.newHashSet();
......@@ -33,77 +41,135 @@ public class SeleniumExecutor {
private List<WebElement> elements = Lists.newArrayList();
/**
* 元素序号记录
*/
private Integer elementIndex;
/**
* 当前进行的窗口页
*/
private String currentWindow;
/**
* 当前测试的url
*/
private String currentUrl;
public List<String> execute(String url) {
driver.get(url);
currentUrl = driver.getCurrentUrl();
public Report execute(Project project) {
driver = WebDriverUtil.getWebDriver(project.getBrowser());
inputs = project.getInputs();
List<Measure> measures = Lists.newArrayList();
String os = "";
currentUrl = project.getUrl();
currentWindow = driver.getWindowHandle();
while (nonNull(currentWindow)) {
driver.switchTo().window(currentWindow);
while (nonNull(currentUrl)) {
testUrl(currentUrl);
Measure measure = testUrl(currentUrl);
measures.add(measure);
currentUrl = urlQueue.poll();
}
currentWindow = windowQueue.poll();
driver.close();
checkWindow();
}
return Lists.newArrayList(historyUrls);
return new Report(
null,
project.getId(),
project.getName(),
project.getBrowser(),
os,
measures
);
}
private void testUrl(String currentUrl) {
private Measure testUrl(String currentUrl) {
Measure measure = null;
//如果该网页是未曾进入过的网页则加入历史记录并进行遍历测试
if (!historyUrls.contains(currentUrl)) {
historyUrls.add(driver.getCurrentUrl());
log.info("当前URL:{} 开始进行遍历...", currentUrl);
//打开网页 记录响应时间
long startTime = System.currentTimeMillis();
driver.get(currentUrl);
long endTime = System.currentTimeMillis();
Long responseTime = endTime - startTime;
log.info("当前URL:{} 响应时间 {} ms 开始进行遍历...", currentUrl, responseTime);
log.info("正在获取当前网页所有元素...");
//获取当前网页的所有元素并放入元素队列
getAllElements(driver);
log.info("获取完毕...共{}个元素...", elements.size());
//元素序号重置
elementIndex = 0;
traversal();
//开始遍历操作元素队列中的元素 返回错误信息
String message = traversal();
//如果无错误信息则是通过
Boolean success = Objects.equals(message, "");
//如果出错 则提供截图
String screenshot = "";
if (!success) {
screenShot(currentUrl);
screenshot = "http://localhost:13500/screenshots/" + currentUrl;
}
log.info("遍历完毕...");
measure = new Measure(
currentUrl,
success,
responseTime.intValue(),
message,
screenshot
);
}
return measure;
}
private void traversal() {
try {
while (elementIndex < elements.size()) {
WebElement element = elements.get(elementIndex);
act(element);
checkPage();
private String traversal() {
String message = null;
while (elementIndex < elements.size()) {
WebElement element = elements.get(elementIndex);
message = act(element);
if (nonNull(message)) {
break;
}
} catch (Exception e) {
log.error("error:" + e.getMessage());
}
return message;
}
private void act(WebElement element) {
private String act(WebElement element) {
String message = null;
try {
log.info("正在操作第{}个元素 ------ text:[{}] ----- tag:[{}]", elementIndex + 1, element.getText(), element.getTagName());
elementIndex++;
if (isEnabledAndDisplayed(element)){
if (isEnabledAndDisplayed(element)) {
if (isEnabledInput(element)) {
String id = element.getAttribute("id");
String inputValue = inputs.get(id);
element.sendKeys(inputValue);
sleep(1000L);
inputValue(element, inputs);
} else if (isEnabledClick(element)) {
element.click();
}
}
sleep(2000L);
} catch (StaleElementReferenceException e) {
reload();
sleep();
//一旦页面发生过跳转 通过重新打开回到原来的页面后需要重新获取元素
Boolean pageChanged = checkPage();
if (pageChanged) {
reload();
}
//警告窗口处理
Alert alert = getAlert();
if (nonNull(alert)) {
message = "出现警告窗:" + alert.getText();
alert.accept();
}
} catch (ElementNotInteractableException e) {
message = "异常的布局;";
log.error("error:在可操作范围之外的元素");
} catch (Exception e) {
message = "预料之外的异常:" + e.getMessage() + ";";
log.error("error:" + e.getMessage());
}
return message;
}
private void checkPage() {
private Boolean checkPage() {
boolean pageChange = !Objects.equals(currentUrl, driver.getCurrentUrl());
if (pageChange) {
boolean newPage = !historyUrls.contains(driver.getCurrentUrl());
......@@ -111,6 +177,18 @@ public class SeleniumExecutor {
urlQueue.add(driver.getCurrentUrl());
}
reload();
return true;
} else {
return false;
}
}
private void inputValue(WebElement element, List<Input> inputs) {
Predicate<Input> inputMatch = input -> Objects.equals(element.getAttribute(input.getAttrName()), input.getAttrValue());
Optional<Input> inputOptional = inputs.stream().filter(inputMatch).findAny();
if (inputOptional.isPresent()) {
Input input = inputOptional.get();
element.sendKeys(input.getValue());
}
}
......@@ -120,15 +198,26 @@ public class SeleniumExecutor {
}
}
private Alert getAlert() {
WebDriverWait wait = new WebDriverWait(driver, 4);
return wait.until((ExpectedCondition<Alert>) theDriver -> {
try {
return theDriver.switchTo().alert();
} catch (NoAlertPresentException e) {
return null;
}
});
}
private void reload() {
driver.get(currentUrl);
getAllElements(driver);
traversal();
}
private void sleep(Long time) {
private void sleep() {
try {
Thread.sleep(time);
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
......@@ -141,15 +230,11 @@ public class SeleniumExecutor {
}
private void getSubElements(WebElement element) {
try {
List<WebElement> results = element.findElements(By.xpath("*"));
if (results.isEmpty()) {
elements.add(element);
} else {
results.forEach(this::getSubElements);
}
} catch (StaleElementReferenceException e){
List<WebElement> results = element.findElements(By.xpath("*"));
if (results.isEmpty()) {
elements.add(element);
} else {
results.forEach(this::getSubElements);
}
}
......@@ -166,15 +251,9 @@ public class SeleniumExecutor {
}
//
// Setter
//
public void setDriver(WebDriver driver) {
this.driver = driver;
}
public void setInputs(Map<String, String> inputs) {
this.inputs = inputs;
private void screenShot(String name) {
byte[] bytes = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
FileUtil.output(bytes, FileUtil.WORK_PATH + "screenshots\\" + name + ".png");
}
}
......@@ -14,7 +14,18 @@ import java.nio.charset.StandardCharsets;
@Slf4j
public class FileUtil {
private final static String WORK_PATH = System.getProperty("user.dir") + "\\";
public final static String WORK_PATH = System.getProperty("user.dir") + "\\";
public static void output(byte[] bytes,String path) {
File file = new File(path);
try {
OutputStream output = new FileOutputStream(file);
output.write(bytes);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void output(String text, OutputStream os) {
byte[] buffer = new byte[1024];
......
package com.zjty.autotest;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
import com.zjty.autotest.service.SeleniumExecutor;
import com.zjty.autotest.pojo.report.Measure;
import com.zjty.autotest.pojo.report.Report;
import com.zjty.autotest.pojo.test.Project;
import com.zjty.autotest.service.impl.SeleniumExecutor;
import com.zjty.autotest.util.WebDriverUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.*;
import java.util.logging.Level;
@Slf4j
@SpringBootTest
class AutotestApplicationTests {
@Autowired
SeleniumExecutor seleniumExecutor;
@Test
public void execute() {
Map<String, String> inputs = Maps.newHashMap();
inputs.put("name", "root");
inputs.put("password", "root");
System.setProperty("webdriver.firefox.driver", WebDriverUtil.FIRE_FOX_EXE);
FirefoxDriver driver = new FirefoxDriver();
String url = "https://qxmugen.com/";
DesiredCapabilities caps = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.BROWSER, Level.ALL);
caps.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
WebDriver driver = new ChromeDriver();
String url = "file:///C:/MyProjects/auto-test/wps/index.html";
long startTime = System.currentTimeMillis();
driver.get(url);
seleniumExecutor.setDriver(driver);
seleniumExecutor.setInputs(inputs);
seleniumExecutor.execute(url);
// String currentwindowHandle;
// Queue<String> windowHandles = Queues.newLinkedBlockingDeque(driver.getWindowHandles());
// System.out.println(windowHandles);
// driver.findElement(By.xpath("/html/body/div[5]/div[3]/div[1]/div/div/div[2]/div/div[4]/a")).click();
// System.out.println("Current Url:"+driver.getCurrentUrl());
// System.out.println("has Window:"+driver.getWindowHandles().size());
//
//
// windowHandles = Queues.newLinkedBlockingDeque(driver.getWindowHandles());
// System.out.println(windowHandles);
//
// driver.findElement(By.xpath("/html/body/div[5]/div[3]/div[1]/div/div/div[2]/div/div[4]/a")).click();
//
// windowHandles = Queues.newLinkedBlockingDeque(driver.getWindowHandles());
// System.out.println(windowHandles);
Project project = new Project(
null,
null,
"chrome",
url,
Lists.newArrayList()
);
Report report = seleniumExecutor.execute(project);
for (Measure measure : report.getMeasures()) {
System.out.println(measure);
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论