提交 18b28b60 authored 作者: zhangshuang's avatar zhangshuang

zs

上级 6dddac82
......@@ -22,6 +22,12 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
<!--webSocket 后台向前端推送消息-->
......@@ -35,6 +41,38 @@
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>okhttp</artifactId>
<groupId>com.squareup.okhttp3</groupId>
</exclusion>
<exclusion>
<artifactId>okio</artifactId>
<groupId>com.squareup.okio</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
<exclusions>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
......@@ -120,6 +158,12 @@
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>3.0.1</version>
<exclusions>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.ethz.ganymed</groupId>
......@@ -151,6 +195,12 @@
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>apiguardian-api</artifactId>
<groupId>org.apiguardian</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
......
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.adaptor.service.SeleniumService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/selenium")
@RestController
@Api(value = "自动化测试管理接口",description = "对web页面进行自动化测试")
public class SeleniumController {
@Autowired
private SeleniumService seleniumService;
@ApiOperation(value = "根据自动化测试")
@RequestMapping(value="/autoTest",method= RequestMethod.GET)
public ServerResponse autoTest(){
return seleniumService.autoTestCase();
}
}
package com.zjty.adaptationmaster.adaptor.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* <p>Description : selenium-test
* <p>Date : 2020/1/3 9:43
* <p>@author : C
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Reports {
private int id;
/**
* 系统名
*/
private String system;
/**
* 浏览器
*/
private String explorer;
/**
* url
*/
private String url;
/**
* 测试步骤详情
*/
private List<Step> steps;
}
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import com.zjty.adaptationmaster.utils.ExcelUtil;
import com.zjty.adaptationmaster.utils.SeleniumUtils;
import com.zjty.adaptationmaster.utils.TestCase;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.*;
@Component
@Slf4j
public class SeleniumService {
@Autowired
private SeleniumUtils seleniumUtils;
@Value("${testCaseExcelTable}")
private String testCaseExcelTable;
@Value("${createTxtPath}")
private String createTxtPath;
public ServerResponse autoTestCase(){
List<TestCase> testCases=null;
try {
testCases = ExcelUtil.importExcel(0, 1, TestCase.class, new FileInputStream(testCaseExcelTable));
String s = ElementAction(testCases);
return ServerResponse.success("测试成功",s);
} catch (Exception e) {
e.printStackTrace();
return ServerResponse.error("测试失败!"+e.getMessage());
}
}
public String ElementAction(List<TestCase> steps) {
WebDriver driver=null;
StringBuilder sb=null;
try {
driver=seleniumUtils.initfifox();
Random random=null;
sb=new StringBuilder();
for (TestCase step : steps) {
Thread.sleep(500);
if(step.getAction().equalsIgnoreCase("get")){
driver.get(step.getElement());
sb.append(step.getTitle()+" : "+step.getElement());
}else if(step.getAction().equalsIgnoreCase("sendkeys")){
String value = step.getValue() == null ? "" : step.getValue();
if(value.equalsIgnoreCase("random")){
random=new Random();
int i = random.nextInt(1000)+1000;
value="test"+i;
}
// driver.findElement(By.xpath(step.getElement())).sendKeys(value);
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
webElement.sendKeys(value);
sb.append(step.getTitle()+": "+step.getElement()+" "+step.getMethod()+" "+step.getAction()+" "+value+"\n");
}else if(step.getAction().equalsIgnoreCase("click")){
// driver.findElement(By.xpath(step.getElement())).click();
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
webElement.click();
sb.append(step.getTitle()+": "+step.getElement()+" "+step.getMethod()+" "+step.getAction()+"\n");
}else if(step.getAction().equalsIgnoreCase("gettext")){
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
if("errorMsg".equalsIgnoreCase(step.getElement())){
if("".equals(webElement.getText())){
sb.append("登录成功!"+"\n");
}
}else {
webElement.getText();
sb.append(webElement.getText()+"\n");
}
}else if(step.getAction().equalsIgnoreCase("readonly")){
String value = step.getValue() == null ? "" : step.getValue();
JavascriptExecutor removeAttribute = (JavascriptExecutor)driver;
//remove readonly attribute
removeAttribute.executeScript("var setDate=document.getElementById(\""+step.getElement()+"\");setDate.removeAttribute('placeholder');");
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
webElement.sendKeys("1990-01-02");
sb.append(step.getTitle()+": "+step.getElement()+" "+step.getMethod()+" "+step.getAction()+" "+value+"\n");
}else if(step.getAction().equalsIgnoreCase("register")){
String value = step.getValue() == null ? "" : step.getValue();
if(value.equals(driver.getCurrentUrl())){
String text = driver.findElement(By.xpath(step.getElement())).getText();
sb.append(text+"\n");
}else {
String errorMsg = driver.findElement(By.id("errorMsg")).getText();
sb.append(errorMsg+"\n");
}
}
}
sb.append("测试结束"+"\n");
// writeTXT(createTxtPath,System.currentTimeMillis()+"",sb.toString());
return sb.toString();
}catch (Exception e){
log.info("报错了:"+e.getMessage());
}finally {
if(driver!=null){
driver.quit();
driver=null;
}
}
return null;//目前没有用,预留返回字段
}
public void writeTXT(String path,String title,String content){
try {
// 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw
/* 写入Txt文件 */
File writename = new File(path);// 相对路径,如果没有则要建立一个新的output。txt文件
if(!writename.exists()){
writename.mkdirs();
}
writename = new File(path+"\\"+title+".txt");// 相对路径,如果没有则要建立一个新的output。txt文件
writename.createNewFile(); // 创建新文件
BufferedWriter out = new BufferedWriter(new FileWriter(writename));
out.write(content); // \r\n即为换行
out.flush(); // 把缓存区内容压入文件
out.close(); // 最后记得关闭文件
} catch (Exception e) {
e.printStackTrace();
}
}
private WebElement selectType(String method, String element, WebDriver driver) {
WebElement element1=null;
if(method.equalsIgnoreCase("xpath")){
element1 = driver.findElement(By.xpath(element));
}else if(method.equalsIgnoreCase("css")){
element1=driver.findElement(By.cssSelector(element));
}else if(method.equalsIgnoreCase("id")){
element1=driver.findElement(By.id(element));
}else if(method.equalsIgnoreCase("name")){
element1=driver.findElement(By.name(element));
}
return element1;
}
}
package com.zjty.adaptationmaster.utils;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.zjty.adaptationmaster.adaptor.entity.Reports;
import com.zjty.adaptationmaster.adaptor.entity.Step;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Map;
/**
* <p>Description : selenium-test
* <p>Date : 2020/1/3 10:58
* <p>@author : C
*/
public class ExcelUtil {
/**
* 解析excel文件
* @param titleRows 标题行
* @param headRows 头行
* @param pojoClass 类型
* @param inputStream 文件
* @return list
*/
public static <T> List<T> importExcel(int titleRows, int headRows, Class<T> pojoClass, InputStream inputStream) throws Exception {
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headRows);
List<T> arrayList;
arrayList = ExcelImportUtil.importExcel(
inputStream,
pojoClass, params);
return arrayList;
}
public static Workbook exportExcel(Reports report) {
String sheet = "测试报告";
return ExcelExportUtil.exportExcel(new ExportParams(report.getSystem(), report.getExplorer(), sheet),
Reports.class, report.getSteps());
}
public static void exportExcel(HttpServletResponse response, Reports report) {
try {
String sheet = "测试报告";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=" + new String((sheet + ".xls").getBytes("gb2312"), "ISO-8859-1"));
OutputStream stream = response.getOutputStream();
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(report.getSystem(), report.getExplorer(), sheet),
Step.class, report.getSteps());
workbook.write(stream);
stream.flush();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static Object mapToObject(Map<Object, Object> map, Class<?> beanClass) {
if (map == null) {
return null;
}
Object obj = null;
try {
obj = beanClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
field.setAccessible(true);
if (map.containsKey(field.getName())) {
try {
if (map.get(field.getName()) == null) {
field.set(obj, "");
} else {
field.set(obj, map.get(field.getName()));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return obj;
}
}
package com.zjty.adaptationmaster.utils;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class SeleniumUtils {
@Value("${driverweb}")
private String driverweb;
public WebDriver initfifox() {
System.out.println(driverweb);
System.setProperty("webdriver.gecko.driver", driverweb);// 设置驱动类型和位置
WebDriver driver = new FirefoxDriver();
return driver;
}
public String ElementAction(List<TestCase> steps) {
WebDriver driver=null;
try {
driver=initfifox();
Random random=null;
for (TestCase step : steps) {
Thread.sleep(1000);
if(step.getAction().equalsIgnoreCase("get")){
driver.get(step.getElement());
}else if(step.getAction().equalsIgnoreCase("sendkeys")){
String value = step.getValue() == null ? "" : step.getValue();
if(value.equalsIgnoreCase("random")){
random=new Random();
int i = random.nextInt(1000)+1000;
value="test"+i;
}
// driver.findElement(By.xpath(step.getElement())).sendKeys(value);
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
webElement.sendKeys(value);
System.out.println(step.getTitle()+": "+step.getElement()+" "+step.getMethod()+" "+step.getAction()+" "+value);
}else if(step.getAction().equalsIgnoreCase("click")){
// driver.findElement(By.xpath(step.getElement())).click();
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
webElement.click();
System.out.println(step.getTitle()+": "+step.getElement()+" "+step.getMethod()+" "+step.getAction()+" ");
}else if(step.getAction().equalsIgnoreCase("gettext")){
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
if("errorMsg".equalsIgnoreCase(step.getElement())){
if("".equals(webElement.getText())){
System.out.println("登录成功!");
}
}else {
webElement.getText();
System.out.println(webElement.getText());
}
}else if(step.getAction().equalsIgnoreCase("readonly")){
String value = step.getValue() == null ? "" : step.getValue();
JavascriptExecutor removeAttribute = (JavascriptExecutor)driver;
//remove readonly attribute
removeAttribute.executeScript("var setDate=document.getElementById(\""+step.getElement()+"\");setDate.removeAttribute('placeholder');");
WebElement webElement = selectType(step.getMethod(), step.getElement(), driver);
webElement.sendKeys("1990-01-02");
System.out.println(step.getTitle()+": "+step.getElement()+" "+step.getMethod()+" "+step.getAction()+" "+value);
}else if(step.getAction().equalsIgnoreCase("register")){
String value = step.getValue() == null ? "" : step.getValue();
if(value.equals(driver.getCurrentUrl())){
String text = driver.findElement(By.xpath(step.getElement())).getText();
System.out.println(text);
}else {
String errorMsg = driver.findElement(By.id("errorMsg")).getText();
System.out.println(errorMsg);
}
}
}
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
driver.quit();
if(driver!=null){
driver=null;
}
}
return null;//目前没有用,预留返回字段
}
private WebElement selectType(String method, String element, WebDriver driver) {
WebElement element1=null;
if(method.equalsIgnoreCase("xpath")){
element1 = driver.findElement(By.xpath(element));
}else if(method.equalsIgnoreCase("css")){
element1=driver.findElement(By.cssSelector(element));
}else if(method.equalsIgnoreCase("id")){
element1=driver.findElement(By.id(element));
}else if(method.equalsIgnoreCase("name")){
element1=driver.findElement(By.name(element));
}
return element1;
}
}
package com.zjty.adaptationmaster.utils;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>Description : assess
* <p>Date : 2020/1/3 17:04
* <p>@author : C
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestCase {
/**
* 标题
*/
@Excel(name = "用例标题")
private String title;
/**
* 前置条件
*/
@Excel(name = "前置条件")
private String condition;
/**
* 步骤
*/
@Excel(name = "步骤")
private String step;
/**
* 元素
*/
@Excel(name = "元素")
private String element;
/**
* 方式
*/
@Excel(name = "方式")
private String method;
/**
* 对象
*/
@Excel(name = "对象")
private String obj;
/**
* 动作
*/
@Excel(name = "动作")
private String action;
@Excel(name = "参数")
private String value;
/**
* 期望
*/
@Excel(name = "期望")
private String respect;
}
......@@ -4,8 +4,8 @@ spring.datasource.url=jdbc:postgresql://localhost:5866/adaptation?useSSL=false&s
spring.datasource.username=sysdba
spring.datasource.password=highgo@123
MAVENHOME=/opt/apache-maven-3.5.4
CTLPATH=/home/taiyuan/桌面/AAS-V9.0/bin/appctl
mavenHome.path=/opt/apache-maven-3.5.4
CTLPATH=/opt/AAS-V9.0/bin/appctl
CTLPWD=Qwert123!@#
......@@ -41,4 +41,8 @@ spring.resources.static-locations=classpath:/uploads/
#highgo
highgo.driver=org.postgresql.Driver
highgo.connectionType=postgresql
highgo.dbName=template1
\ No newline at end of file
highgo.dbName=template1
driverweb=C:/Program Files/driver/geckodriver.exe
testCaseExcelTable=C:/Users/admin/Desktop/test.xls
createTxtPath=C:/
\ No newline at end of file
package com.zjty.adaptationmaster;
import com.zjty.adaptationmaster.adaptor.entity.db.DBManage;
import com.zjty.adaptationmaster.utils.Regular;
import org.junit.Test;
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.SQLException;
public class Test4 {
public static void main(String[] args) {
String s = "\"record_alarm\" bit(1) DEFAULT NULL,";
System.out.println(s.replaceAll("bit(1)","boolean"));
}
@Test
public void testSubPath(){
Path path = Paths.get("D:\\project\\adaptation\\apusicLibTest\\src");
System.out.println(path.subpath(0,1));
for(int i = 0;i<10;i++) {
System.out.println(path.subpath(i, 10));
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论