diff --git a/pom.xml b/pom.xml index e4186a2..066faf1 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ 2.5 1.3.3 1.19 - 1.16.18 + 1.7 2.3.2 2.7.0 @@ -286,7 +286,11 @@ io.netty netty-all - + + org.projectlombok + lombok + + diff --git a/src/main/java/com/luckyframe/common/utils/client/WebDebugCaseEntity.java b/src/main/java/com/luckyframe/common/utils/client/WebDebugCaseEntity.java index b8ed565..d088af1 100644 --- a/src/main/java/com/luckyframe/common/utils/client/WebDebugCaseEntity.java +++ b/src/main/java/com/luckyframe/common/utils/client/WebDebugCaseEntity.java @@ -17,9 +17,12 @@ public class WebDebugCaseEntity implements Serializable { */ private static final long serialVersionUID = 1L; private Integer caseId; - private Integer userId; - private String loadpath; - + private Integer userId; + private String loadpath; + //修改点 + private Integer caseType; + private Integer browserType; + public Integer getCaseId() { return caseId; } @@ -39,4 +42,15 @@ public class WebDebugCaseEntity implements Serializable { this.loadpath = loadpath; } + //修改点 + public Integer getCaseType(){return caseType; } + public void setCaseType(Integer caseType) { + this.caseType = caseType; + } + public Integer getBrowserType() { + return browserType; + } + public void setBrowserType(Integer browserType) { + this.browserType = browserType; + } } diff --git a/src/main/java/com/luckyframe/project/api/OpenPostApiController.java b/src/main/java/com/luckyframe/project/api/OpenPostApiController.java index 6b92c35..556c580 100644 --- a/src/main/java/com/luckyframe/project/api/OpenPostApiController.java +++ b/src/main/java/com/luckyframe/project/api/OpenPostApiController.java @@ -297,7 +297,7 @@ public class OpenPostApiController tce.setCaseId(projectCase.getCaseId()); TaskCaseExecute taskCaseExecute = taskCaseExecuteService.selectTaskCaseExecuteByTaskIdAndCaseId(tce); - List loglist = taskCaseLogService.selectTaskCaseLogListByTaskCaseId(taskCaseExecute.getTaskCaseId()); + List loglist = taskCaseLogService.selectTaskCaseLogListByTaskCaseId(taskCaseExecute.getTaskCaseId(),null); for(TaskCaseLog tcl:loglist){ if(tcl.getLogDetail().contains("测试结果:")){ result = tcl.getLogDetail(); diff --git a/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/controller/TaskCaseLogController.java b/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/controller/TaskCaseLogController.java index 239c0e7..7d38b9f 100644 --- a/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/controller/TaskCaseLogController.java +++ b/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/controller/TaskCaseLogController.java @@ -54,13 +54,15 @@ public class TaskCaseLogController extends BaseController response.setCharacterEncoding("utf-8"); PrintWriter pw = response.getWriter(); String taskCaseIdStr = request.getParameter("taskCaseId"); + String errorInfo = request.getParameter("errorInfo"); + int taskCaseId = 0; // 得到客户端传递的查询参数 if (StringUtils.isNotEmpty(taskCaseIdStr)) { taskCaseId = Integer.parseInt(taskCaseIdStr); } - List loglist = taskCaseLogService.selectTaskCaseLogListByTaskCaseId(taskCaseId); + List loglist = taskCaseLogService.selectTaskCaseLogListByTaskCaseId(taskCaseId,errorInfo); // 转换成json字符串 JSONArray recordJson= JSONArray.parseArray(JSON.toJSONString(loglist)); pw.print(recordJson); diff --git a/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/ITaskCaseLogService.java b/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/ITaskCaseLogService.java index 164a472..3077983 100644 --- a/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/ITaskCaseLogService.java +++ b/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/ITaskCaseLogService.java @@ -35,7 +35,7 @@ public interface ITaskCaseLogService * @author Seagull * @date 2019年4月11日 */ - List selectTaskCaseLogListByTaskCaseId(Integer taskCaseId); + List selectTaskCaseLogListByTaskCaseId(Integer taskCaseId,String errorInfo); /** * 新增用例日志明细 diff --git a/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/TaskCaseLogServiceImpl.java b/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/TaskCaseLogServiceImpl.java index cc6df5e..d8bf0ac 100644 --- a/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/TaskCaseLogServiceImpl.java +++ b/src/main/java/com/luckyframe/project/testexecution/taskCaseLog/service/TaskCaseLogServiceImpl.java @@ -2,6 +2,7 @@ package com.luckyframe.project.testexecution.taskCaseLog.service; import java.util.List; +import com.luckyframe.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,10 +54,13 @@ public class TaskCaseLogServiceImpl implements ITaskCaseLogService * @date 2019年4月11日 */ @Override - public List selectTaskCaseLogListByTaskCaseId(Integer taskCaseId) + public List selectTaskCaseLogListByTaskCaseId(Integer taskCaseId,String errorInfo) { TaskCaseLog taskCaseLog = new TaskCaseLog(); taskCaseLog.setTaskCaseId(taskCaseId); + if(StringUtils.isNotEmpty(errorInfo)) { + taskCaseLog.setLogGrade(errorInfo); + } return taskCaseLogMapper.selectTaskCaseLogList(taskCaseLog); } diff --git a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseDebugController.java b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseDebugController.java index b9fe518..72a6598 100644 --- a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseDebugController.java +++ b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseDebugController.java @@ -2,6 +2,7 @@ package com.luckyframe.project.testmanagmt.projectCase.controller; import java.util.List; +import cn.hutool.json.JSONUtil; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -62,6 +63,8 @@ public class ProjectCaseDebugController extends BaseController ProjectCaseDebug projectCaseDebug=new ProjectCaseDebug(); projectCaseDebug.setCaseId(caseId); projectCaseDebug.setUserId(ShiroUtils.getUserId().intValue()); + //修改点 + projectCaseDebug.setCaseType(projectCase.getCaseType()); List clients=clientService.selectClientsByProjectId(projectCase.getProjectId()); if(clients.size()>0){ List driverPathList=clientService.selectClientDriverListById(clients.get(0).getClientId()); @@ -95,6 +98,9 @@ public class ProjectCaseDebugController extends BaseController } webDebugCaseEntity.setCaseId(projectCaseDebug.getCaseId()); webDebugCaseEntity.setUserId(ShiroUtils.getUserId().intValue()); + //修改点 + webDebugCaseEntity.setCaseType(projectCaseDebug.getCaseType()); + webDebugCaseEntity.setBrowserType(projectCaseDebug.getBrowserType()); Client client = clientService.selectClientById(projectCaseDebug.getClientId()); String url= "http://"+client.getClientIp()+":"+ClientConstants.CLIENT_MONITOR_PORT+"/webDebugCase"; String result=HttpRequest.httpClientPost(url, client,JSONObject.toJSONString(webDebugCaseEntity),3000); diff --git a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseStepsController.java b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseStepsController.java index 579c9c1..7f871ab 100644 --- a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseStepsController.java +++ b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/ProjectCaseStepsController.java @@ -7,17 +7,13 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.luckyframe.common.utils.poi.ExcelUtil; +import com.luckyframe.project.testmanagmt.projectCaseModule.domain.ProjectCaseModule; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -162,4 +158,36 @@ public class ProjectCaseStepsController extends BaseController return toAjax(projectCaseStepsService.updateProjectCaseSteps(projectCaseSteps)); } + + /** + * @author lifengyang + * 用例步骤导出 + */ + @RequiresPermissions("testmanagmt:projectCase:exportcasestep") + @PostMapping("/export") + @ResponseBody + public AjaxResult export(@RequestParam("caseId") Integer caseId) + { + ProjectCase projectCase=projectCaseService.selectProjectCaseById(caseId); + ProjectCaseSteps projectCaseSteps = new ProjectCaseSteps(); + projectCaseSteps.setCaseId(caseId); + List stepsList=projectCaseStepsService.selectProjectCaseStepsList(projectCaseSteps); + + if(stepsList.size()==0){ + projectCaseSteps.setAction(""); + projectCaseSteps.setExpectedResult(""); + projectCaseSteps.setExtend(""); + projectCaseSteps.setProjectId(projectCase.getProjectId()); + projectCaseSteps.setStepId(0); + projectCaseSteps.setStepOperation(""); + projectCaseSteps.setStepParameters(""); + projectCaseSteps.setStepPath(""); + projectCaseSteps.setStepSerialNumber(1); + projectCaseSteps.setStepType(projectCase.getCaseType()); + stepsList.add(projectCaseSteps); + } + + ExcelUtil util = new ExcelUtil<>(ProjectCaseSteps.class); + return util.exportExcel(stepsList, "测试用例步骤"); + } } diff --git a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/RecordController.java b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/RecordController.java new file mode 100644 index 0000000..65198ec --- /dev/null +++ b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/controller/RecordController.java @@ -0,0 +1,123 @@ +package com.luckyframe.project.testmanagmt.projectCase.controller; + +import com.luckyframe.common.utils.poi.ExcelUtil; +import com.luckyframe.project.testmanagmt.projectCase.domain.ProjectCaseSteps; +import com.luckyframe.project.testmanagmt.projectCase.service.IProjectCaseService; +import com.luckyframe.project.testmanagmt.projectCase.service.IProjectCaseStepsService; +import com.luckyframe.project.testmanagmt.projectCaseModule.domain.ProjectCaseModule; +import com.luckyframe.rc.ReadTxt; +import com.luckyframe.rc.Readfile; +import com.luckyframe.rc.entity.ElementAction; +import com.luckyframe.rc.entity.RcWebCaseSteps; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +/** + * @Author lifengyang + * @Date 2021-11-05 + * @Version 2.0 + */ +@Slf4j +@RestController +@RequestMapping("/testmanagmt/RecordController") +public class RecordController { + + @Autowired + private IProjectCaseStepsService projectCaseStepsService; + + /** + * 脚本录入插入数据 + * StepType默认类型 0 HTTP接口 1 Web UI 2 API驱动 3移动端 + */ + @PostMapping(value = "/insert",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResponseEntity insertRecord(@RequestParam("file") MultipartFile file,@RequestParam("projectId") int ProjectId,@RequestParam("caseId") int CaseId,@RequestParam("stepType") int StepType) throws Exception { + log.info("StepType:"+StepType); + if (file.getOriginalFilename().toLowerCase().endsWith(".xlsx")){ + ExcelUtil util = new ExcelUtil<>(ProjectCaseSteps.class); + List caseStepsList = util.importExcel(file.getInputStream()); + int stepSerialNumber=1; + log.info("开始插入步骤"); + for(ProjectCaseSteps projectCaseSteps:caseStepsList){ + projectCaseSteps.setProjectId(ProjectId); + projectCaseSteps.setCaseId(CaseId); + projectCaseSteps.setStepSerialNumber(stepSerialNumber); + projectCaseSteps.setCreateTime(new Date()); + log.info("第"+stepSerialNumber+"步骤为:\n"+projectCaseSteps); + projectCaseStepsService.insertProjectCaseSteps(projectCaseSteps); + stepSerialNumber++; + } + }else { + if (StepType==3){ + //解析app自动化测试录制的脚本 + ReadTxt readTxt = new ReadTxt(); + List stepList = readTxt.Extract(file); + for (ElementAction elementAction : stepList) { + log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+ elementAction); + } + List listSteps = new ArrayList<>(); + for (ElementAction elementAction : stepList) { + ProjectCaseSteps projectCaseSteps = new ProjectCaseSteps(); + projectCaseSteps.setCaseId(CaseId); + projectCaseSteps.setProjectId(ProjectId); + projectCaseSteps.setStepPath(elementAction.getAccess()); + projectCaseSteps.setStepParameters(elementAction.getActionValue()); + projectCaseSteps.setStepOperation(elementAction.getAction()); + projectCaseSteps.setStepType(StepType); + projectCaseSteps.setCreateBy("admin"); + projectCaseSteps.setCreateTime(new Date()); + listSteps.add(projectCaseSteps); + } + int stepSerialNumber=1; + for(ProjectCaseSteps projectCaseSteps:listSteps){ + projectCaseSteps.setStepSerialNumber(stepSerialNumber); + log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2"+projectCaseSteps); + projectCaseStepsService.insertProjectCaseSteps(projectCaseSteps); + stepSerialNumber++; + } + }else if(StepType==1){ + //解析web自动化测试录制的脚本 + Readfile Readfile = new Readfile(); + LinkedList stepList = Readfile.saveAction(file); + for (RcWebCaseSteps rcWebCaseSteps : stepList) { + log.info("设置包|定位路径:"+ rcWebCaseSteps.getStepPath()); + } + List listSteps = new ArrayList<>(); + for (RcWebCaseSteps rcWebCaseSteps : stepList) { + ProjectCaseSteps projectCaseSteps = new ProjectCaseSteps(); + projectCaseSteps.setCaseId(CaseId); + projectCaseSteps.setProjectId(ProjectId); + projectCaseSteps.setStepPath(rcWebCaseSteps.getStepPath()); + projectCaseSteps.setStepParameters(rcWebCaseSteps.getStepParameters()); + projectCaseSteps.setStepOperation(rcWebCaseSteps.getStepOperation()); + projectCaseSteps.setStepType(StepType); + projectCaseSteps.setCreateBy("admin"); + projectCaseSteps.setCreateTime(new Date()); + listSteps.add(projectCaseSteps); + } + int stepSerialNumber=1; + log.info("开始插入步骤"); + for(ProjectCaseSteps projectCaseSteps:listSteps){ + projectCaseSteps.setStepSerialNumber(stepSerialNumber); + log.info("第"+stepSerialNumber+"步骤为:\n"+projectCaseSteps); + projectCaseStepsService.insertProjectCaseSteps(projectCaseSteps); + stepSerialNumber++; + } + } + } + + + return ResponseEntity.ok().build(); + } + +} diff --git a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseDebug.java b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseDebug.java index 8c5d9cf..173c15b 100644 --- a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseDebug.java +++ b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseDebug.java @@ -1,5 +1,6 @@ package com.luckyframe.project.testmanagmt.projectCase.domain; +import com.luckyframe.framework.aspectj.lang.annotation.Excel; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.luckyframe.framework.web.domain.BaseEntity; @@ -30,6 +31,28 @@ public class ProjectCaseDebug extends BaseEntity private Integer clientId; /** 客户端驱动路径 */ private String driverPath; + //修改点 + /** 默认类型 0 HTTP接口 1 Web UI 2 API驱动 3移动端 */ + private Integer caseType; + + /** web UI自动化浏览器类型 0 IE 1 火狐 2 谷歌 3 Edge */ + private Integer browserType; + + public void setCaseType(Integer caseType) { + this.caseType = caseType; + } + + public Integer getCaseType() { + return caseType; + } + + public Integer getBrowserType() { + return browserType; + } + + public void setBrowserType(Integer browserType) { + this.browserType = browserType; + } public Integer getClientId() { return clientId; @@ -47,69 +70,70 @@ public class ProjectCaseDebug extends BaseEntity this.driverPath = driverPath; } - public void setDebugId(Integer debugId) + public void setDebugId(Integer debugId) { this.debugId = debugId; } - public Integer getDebugId() + public Integer getDebugId() { return debugId; } - public void setCaseId(Integer caseId) + public void setCaseId(Integer caseId) { this.caseId = caseId; } - public Integer getCaseId() + public Integer getCaseId() { return caseId; } - public void setUserId(Integer userId) + public void setUserId(Integer userId) { this.userId = userId; } - public Integer getUserId() + public Integer getUserId() { return userId; } - public void setDebugIsend(Integer debugIsend) + public void setDebugIsend(Integer debugIsend) { this.debugIsend = debugIsend; } - public Integer getDebugIsend() + public Integer getDebugIsend() { return debugIsend; } - public void setLogLevel(String logLevel) + public void setLogLevel(String logLevel) { this.logLevel = logLevel; } - public String getLogLevel() + public String getLogLevel() { return logLevel; } - public void setLogDetail(String logDetail) + public void setLogDetail(String logDetail) { this.logDetail = logDetail; } - public String getLogDetail() + public String getLogDetail() { return logDetail; } - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("debugId", getDebugId()) - .append("caseId", getCaseId()) - .append("userId", getUserId()) - .append("debugIsend", getDebugIsend()) - .append("logLevel", getLogLevel()) - .append("logDetail", getLogDetail()) - .toString(); - } + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("debugId", getDebugId()) + .append("caseId", getCaseId()) + .append("userId", getUserId()) + .append("caseType",getCaseType()) + .append("debugIsend", getDebugIsend()) + .append("logLevel", getLogLevel()) + .append("logDetail", getLogDetail()) + .toString(); + } } diff --git a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseSteps.java b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseSteps.java index 845e24a..1697300 100644 --- a/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseSteps.java +++ b/src/main/java/com/luckyframe/project/testmanagmt/projectCase/domain/ProjectCaseSteps.java @@ -1,5 +1,6 @@ package com.luckyframe.project.testmanagmt.projectCase.domain; +import com.luckyframe.framework.aspectj.lang.annotation.Excel; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -18,26 +19,36 @@ public class ProjectCaseSteps extends BaseEntity /** 步骤ID */ private Integer stepId; /** 用例ID */ + @Excel(name = "用例ID") private Integer caseId; /** 项目ID */ + @Excel(name = "项目ID") private Integer projectId; /** 步骤序号 */ private Integer stepSerialNumber; /** 包路径|定位路径 */ + @Excel(name = "包路径|定位路径") private String stepPath; /** 方法名|操作 */ + @Excel(name = "方法名|操作") private String stepOperation; /** 参数 */ + @Excel(name = "参数") private String stepParameters; /** 步骤动作 */ + @Excel(name = "步骤动作") private String action; /** 预期结果 */ + @Excel(name = "预期结果") private String expectedResult; /** 默认类型 0 HTTP接口 1 Web UI 2 API驱动 3移动端 */ + @Excel(name = "默认类型") private Integer stepType; /** 扩展字段,可用于备注、存储HTTP模板等 */ + @Excel(name = "扩展字段") private String extend; /** 备注字段,用于接口类型的步骤的备注 */ + @Excel(name = "备注字段") private String stepRemark; public void setStepId(Integer stepId) diff --git a/src/main/java/com/luckyframe/rc/ReadTxt.java b/src/main/java/com/luckyframe/rc/ReadTxt.java new file mode 100644 index 0000000..e868133 --- /dev/null +++ b/src/main/java/com/luckyframe/rc/ReadTxt.java @@ -0,0 +1,118 @@ +package com.luckyframe.rc; +import com.luckyframe.rc.entity.ElementAction; +import org.springframework.web.multipart.MultipartFile; + +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + +public class ReadTxt { + //存放控件集合 + ArrayList elementActionArrayList; + //剪贴板字符串 + String clipStr = ""; + + public void getStrFromClip(){ + Clipboard clipct = Toolkit.getDefaultToolkit().getSystemClipboard(); + // 获取剪切板中的内容 + Transferable clipTf= clipct.getContents(null); + if (clipTf!=null) + { + // 检查内容是否是文本类型 + if (clipTf.isDataFlavorSupported(DataFlavor.stringFlavor)) { + try { + clipStr = (String) clipTf.getTransferData(DataFlavor.stringFlavor); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + System.out.println(clipStr); + } + + /** + * + * @param file 录制好的app自动化测试脚本文件 + * @return + * @throws IOException + */ + public List Extract(MultipartFile file) throws IOException { + //初始化 + elementActionArrayList=new ArrayList<>(); + //读取脚本 + if (file.isEmpty() || file.getSize() <= 0) { + file = null; + } + BufferedReader reader=new BufferedReader(new InputStreamReader(file.getInputStream(),"utf-8")); + String line; + //按行读取,如果还没有读到尾,一直执行 + while ((line= reader.readLine())!=null){ + //如果读到的这行是获取控件 + if(line.contains("findElementBy")) { + if (!line.contains("//")) { + ElementAction elementAction = new ElementAction(); + + //按格式截取相应的值,存入集合 + int index = line.indexOf("findElement"); + + String way; + //判断获取控件的方式 + if (line.substring(index, line.indexOf("\"") - 1).contains("Id")) + way = "id"; + else + way = "xpath"; + + way = way + "=" + line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")); + + + elementAction.setAccess(way); + //获取控件之后必为操作 + line = reader.readLine(); + elementAction.setAction(line.substring(line.indexOf(".") + 1, line.indexOf("("))); + + if (line.contains("\"")) + elementAction.setActionValue(line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""))); + elementActionArrayList.add(elementAction); + + } + } + //如果读到这行是滑动操作 + else if(line.contains("(new TouchAction(driver))")) { + line =reader.readLine(); + if(line.contains(".press")) + { + String actionValue=""; + + actionValue=actionValue+line.substring(line.indexOf(":")+2,line.indexOf(",")+1)+line.substring(line.lastIndexOf(":")+2,line.lastIndexOf("}"))+"|"; + + line =reader.readLine(); + if(line.contains(".moveto")) + { + line=line.substring(line.indexOf(":")+2); + + + actionValue=actionValue+line.substring(0,line.indexOf(":"))+","+line.substring(line.lastIndexOf(":")+2,line.lastIndexOf("}")); + + ElementAction elementAction=new ElementAction(); + elementAction.setAction("moveto"); + elementAction.setActionValue(actionValue); + elementActionArrayList.add(elementAction); + } + } + } + } + for (ElementAction elementAction : elementActionArrayList) { + System.out.println(elementAction); + } + + reader.close(); + + return elementActionArrayList; + } + +} diff --git a/src/main/java/com/luckyframe/rc/Readfile.java b/src/main/java/com/luckyframe/rc/Readfile.java new file mode 100644 index 0000000..adf0105 --- /dev/null +++ b/src/main/java/com/luckyframe/rc/Readfile.java @@ -0,0 +1,127 @@ +package com.luckyframe.rc; + +import com.luckyframe.rc.entity.RcWebCaseSteps; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; + + +@Slf4j +public class Readfile { + + /** + * 保存活动 + * @param file 读取录制好的web自动化测试脚本文件内容 + * @throws IOException + */ + public LinkedList saveAction(MultipartFile file) throws IOException { + LinkedList rcWebCaseStepsLinkedList=new LinkedList<>(); + if (file.isEmpty() || file.getSize() <= 0) { + file = null; + } + BufferedReader reader=new BufferedReader(new InputStreamReader(file.getInputStream(),"utf-8")); + StringBuilder StringBuilder=new StringBuilder();//用来显示内容用的StringBuilder + String line; + //按行读取内容,如果还没有读到尾,一直执行 + StringBuilder.append("\n"); + int n=0; + int start = 99999999; + int end; + LinkedList var=new LinkedList<>(); + while ((line= reader.readLine())!=null){ + StringBuilder.append(line).append("\n"); + var.add(line); + n++; + line=line.trim(); + if(line.startsWith("driver.get(")) { + //打开网页 + log.info("打开网页"); + RcWebCaseSteps rcWebCaseSteps=new RcWebCaseSteps(); + rcWebCaseSteps.setStepOperation("open"); + //解析网页路径 + String url; + url=line.substring(line.indexOf("driver.get(")+"driver.get(".length(),line.indexOf(")")).replace("\"",""); + rcWebCaseSteps.setStepParameters(url); + rcWebCaseStepsLinkedList.add(rcWebCaseSteps); + rcWebCaseSteps=null; + }else if (line.startsWith("driver.findElement(")){ + //查找元素 + if (line.contains("By.id(")){ + //通过id查找 + log.info("通过id查找"); + String id; + id=line.substring(line.indexOf("By.id(")+"By.id(".length(),line.indexOf(")")).replace("\"",""); + log.info("id="+id); + + RcWebCaseSteps rcWebCaseSteps=new RcWebCaseSteps(); + rcWebCaseSteps.setStepPath("id="+id); + //解析操作 + if(line.endsWith(".click();")) { + rcWebCaseSteps.setStepOperation("click"); + }else if(line.contains(".sendKeys(")){ + rcWebCaseSteps.setStepOperation("sendkeys"); + //解析SendKeys的value + String param=line.substring(line.indexOf(".sendKeys(")+".sendKeys(".length(),line.indexOf(";")-1).replace("\"",""); + rcWebCaseSteps.setStepParameters(param); + } + rcWebCaseStepsLinkedList.add(rcWebCaseSteps); + rcWebCaseSteps=null; + }else if (line.contains("By.cssSelector")){ + //通过css选择器查找 + log.info("通过css查找"); + String id; + id=line.substring(line.indexOf("By.cssSelector(")+"By.cssSelector(".length(),line.indexOf("\"",("driver.findElement(By.cssSelector(\"").length())).replace("\"",""); + log.info("cssselector="+id); + + RcWebCaseSteps rcWebCaseSteps=new RcWebCaseSteps(); + rcWebCaseSteps.setStepPath("cssselector="+id); + //解析操作 + if(line.endsWith(".click();")) { + rcWebCaseSteps.setStepOperation("click"); + }else if(line.contains(".sendKeys(")){ + rcWebCaseSteps.setStepOperation("sendkeys"); + //解析SendKeys的value + String param=line.substring(line.indexOf(".sendKeys(")+".sendKeys(".length(),line.indexOf(";")-1).replace("\"",""); + rcWebCaseSteps.setStepParameters(param); + } + rcWebCaseStepsLinkedList.add(rcWebCaseSteps); + rcWebCaseSteps=null; + } + }else if(line.startsWith("driver.manage().window().setSize(")){ + //设置浏览器大小 + log.info("设置浏览器大小"); + RcWebCaseSteps rcWebCaseSteps=new RcWebCaseSteps(); + rcWebCaseSteps.setStepOperation("windowsetsize"); + //解析窗口大小 + String operationValue; + operationValue=line.substring("driver.manage().window().setSize(new Dimension(".length(),line.indexOf(")","driver.manage().window().setSize(new Dimension(".length())); + rcWebCaseSteps.setStepParameters(operationValue); + rcWebCaseStepsLinkedList.add(rcWebCaseSteps); + rcWebCaseSteps=null; + }else if(line.startsWith("driver.switchTo().window")){ + //切换窗口句柄 + log.info("切换窗口句柄"); + RcWebCaseSteps rcWebCaseSteps=new RcWebCaseSteps(); + rcWebCaseSteps.setStepOperation("switchtowindow"); + rcWebCaseStepsLinkedList.add(rcWebCaseSteps); + rcWebCaseSteps=null; + }else if (line.startsWith("{")){ + start=n; + }else if(line.startsWith("}")){ + end=n; + if (end>start){ + for (int i=0;i').find('table'); @@ -125,11 +123,11 @@ cellStyle: function (value, row, index, field) { if (row.logGrade != "info") { return { - css: {"color": "#ff0000"} + css: {"color": "#ff0000","class":"test1"} }; } else { return { - css: {"color": "#00bf5f"} + css: {"color": "#00bf5f","class":"test2"} }; } } @@ -153,7 +151,7 @@ return '' + value + ' ' + '同步结果 '; } else { - return '' + value + ''; + return '' + value + ''; } } else { return '' + value + ''; @@ -165,10 +163,9 @@ } },], //无线循环取子表,直到子表里面没有记录 - onExpandRow: function (index, row, $Subdetail) { - oInit.InitSubTable(index, row, $Subdetail); - }, - + // onExpandRow: function (index, row, $Subdetail) { + // oInit.InitSubTable(index, row, $Subdetail); + // }, }); }; var options = { @@ -215,17 +212,20 @@ { field : 'caseId', title : '用例ID', - visible: false + width : '5%', + visible: true }, { field : 'taskId', title : '任务ID', - visible: false + width : '5%', + visible: true }, { field : 'projectId', title : '项目ID', - visible: false + width : '5%', + visible: true }, { field : 'caseSign', @@ -236,7 +236,7 @@ { field : 'caseName', title : '用例名称', - width : '50%', + width : '20%', class : 'myTDLengthHidden' }, { @@ -278,7 +278,22 @@ return '未执行'; } } - }], + }, + //修改点 + { + field : 'failureReason', + title : '失败原因', + width : '15%', + id:'myTDLengthHiddenFy', + class : 'myTDLengthHidden', + formatter : function(value, + row, index) { + var innerText = getFailedInfo(row.taskCaseId,'error'); + + return ''+ innerText+''; + + } + }], //注册加载子表的事件。注意下这里的三个参数! onExpandRow : function(index, row, $detail) { InitSubTable(index, row, $detail); @@ -286,8 +301,11 @@ }; $.table.init(options); + + }); - + + /* 同步测试结果到用例步骤 */ function updateStep(logId){ $.modal.confirm("确认要同步测试结果到步骤中吗?", function() { @@ -296,7 +314,26 @@ $.operate.submit(url, "post", "json", data); }); } - + + + + + /*获取失败原因*/ + function getFailedInfo(taskCaseId,error){ + var url =logPrefix + "/list"; + var options = ""; + var data = {"taskCaseId": taskCaseId,"errorInfo": error}; + $.ajaxSettings.async = false; + $.getJSON(url, data, function call(result) { + /*设置新的调度列表*/ + $.each(result, function(i, node){ + options = options + node.logDetail ; + }); + }); + return options; + } + + /* 运行所有非成功用例 */ function run(){ $.modal.confirm("确认要运行所有非成功用例吗?", function() { @@ -337,12 +374,12 @@ /*设置新的调度列表*/ $.each(result, function(i, node){ options += ""+node.taskName+""; - }); + }); $("#taskId").html(options); }); } - - /*弹出层展示图片*/ + + /*弹出层展示图片*/ function showPlanCase(logId) { var url = prefix+"/showImage.do?logId="+logId; $.modal.openViewFull($.table._option.childrenModalName, url, null, null); diff --git a/src/main/resources/templates/testexecution/taskScheduling/taskScheduling.html b/src/main/resources/templates/testexecution/taskScheduling/taskScheduling.html index 3ae8487..b95274a 100644 --- a/src/main/resources/templates/testexecution/taskScheduling/taskScheduling.html +++ b/src/main/resources/templates/testexecution/taskScheduling/taskScheduling.html @@ -105,7 +105,8 @@ { field : 'schedulingId', title : '调度ID', - visible: false, + visible: true, + width : '5%', sortable: true }, { @@ -116,7 +117,7 @@ { field : 'schedulingName', title : '调度名称', - width : '20%', + width : '15%', formatter : function(value, row, index) { return ''+ value + ' '; diff --git a/src/main/resources/templates/testmanagmt/projectCase/debugCase.html b/src/main/resources/templates/testmanagmt/projectCase/debugCase.html index 32778d2..f811a9e 100644 --- a/src/main/resources/templates/testmanagmt/projectCase/debugCase.html +++ b/src/main/resources/templates/testmanagmt/projectCase/debugCase.html @@ -7,12 +7,21 @@ - + + + 浏览器类型: + + IE + 火狐 + 谷歌 + Edge + + + 客户端: - + @@ -113,6 +122,14 @@ $("#driverPath option[index='1']").remove(); } } + + //修改点 + //控制BrowserType显示 + if($("#caseType").attr("value")==1){ + $("#divBrowserType").css("display","block"); + }else { + $("#divBrowserType").css("display", "none"); + };