提交 5c5c7825 authored 作者: 黄承天's avatar 黄承天

[feature]

增加参数添加机制
上级 90c06041
......@@ -7,6 +7,10 @@ package com.zjty.autotest.common.action;
*/
public interface InputType {
String ORDER = "序号";
String COOKIES = "cookies";
String LOCAL_STORAGE = "local storage";
String SESSION_STORAGE = "session storage";
}
......@@ -63,7 +63,7 @@ public class TestController {
if (isRunning) {
throw new RuntimeException("已有正在执行的测试");
} else {
Report report = seleniumExecutor.execute(testRequest.getTestCase(), testRequest.getBrowser(), testRequest.getHeadless());
Report report = seleniumExecutor.execute(testRequest.getTestCase(), testRequest.getBrowser(), testRequest.getParams(), testRequest.getHeadless());
reportService.save(report);
}
return ResponseEntity.ok(ImmutableMap.of("message", "测试完毕"));
......
......@@ -6,6 +6,8 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
......@@ -17,7 +19,10 @@ public class TestRequest {
@ApiModelProperty(value = "是否静默模式 true/false", example = "true", position = 2)
private Boolean headless;
@ApiModelProperty(value = "测试用例", position = 3)
@ApiModelProperty(value = "输入参数 如cookies localStorage", position = 3)
private List<Param> params;
@ApiModelProperty(value = "测试用例", position = 4)
private TestCase testCase;
}
......@@ -2,11 +2,13 @@ package com.zjty.autotest.service;
import com.google.common.collect.Lists;
import com.zjty.autotest.common.action.Browser;
import com.zjty.autotest.pojo.request.Param;
import com.zjty.autotest.pojo.vo.report.Report;
import com.zjty.autotest.pojo.vo.report.Step;
import com.zjty.autotest.pojo.vo.project.Command;
import com.zjty.autotest.pojo.vo.project.TestCase;
import com.zjty.autotest.service.helper.SeleniumHelper;
import com.zjty.autotest.util.JavaScriptUtil;
import com.zjty.autotest.util.WebDriverUtil;
import com.zjty.autotest.websocket.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
......@@ -18,10 +20,14 @@ import org.springframework.stereotype.Service;
import java.util.*;
import static com.alibaba.fastjson.JSON.parseArray;
import static com.alibaba.fastjson.JSON.toJSONString;
import static com.zjty.autotest.common.action.CommandType.*;
import static com.zjty.autotest.common.action.InputType.COOKIES;
import static com.zjty.autotest.common.action.InputType.SESSION_STORAGE;
import static com.zjty.autotest.common.action.TargetType.*;
import static java.lang.String.format;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
......@@ -45,6 +51,8 @@ public class SeleniumExecutor {
return isRunning;
}
private List<Param> params = new ArrayList<>();
private String os = System.getProperty("os.name");
/**
......@@ -62,11 +70,11 @@ public class SeleniumExecutor {
private Date endTime = null;
private Long costTime = -1L;
private Long costTime = 0L;
private Integer finished = -1;
private Integer finished = 0;
private Integer total = -1;
private Integer total = 0;
private List<Step> steps = Lists.newArrayList();
......@@ -79,7 +87,7 @@ public class SeleniumExecutor {
* @param headless 是否静默模式
* @return 测试报告数据
*/
public Report execute(TestCase testCase, String browser, Boolean headless) {
public Report execute(TestCase testCase, String browser, List<Param> params, Boolean headless) {
//重置测试报告数据
clear();
try {
......@@ -89,6 +97,7 @@ public class SeleniumExecutor {
projectId = testCase.getProjectId();
testId = testCase.getId();
name = testCase.getName();
this.params = params;
List<Command> commands = testCase.getCommands();
total = commands.size();
//根据浏览器 获取driver
......@@ -124,6 +133,22 @@ public class SeleniumExecutor {
return getReport();
}
private void addParams(List<Param> params) {
if (nonNull(params)) {
driver.manage().deleteAllCookies();
for (Param param : params) {
switch (param.getType()) {
case COOKIES:
driver.manage().addCookie(new Cookie(param.getName(), param.getValue()));
break;
case SESSION_STORAGE:
JavaScriptUtil.setItemInSessionStorage(driver, param.getName(), param.getValue());
}
}
}
}
/**
* 执行一个步骤
* 并返回该步骤的测试结果数据
......@@ -153,6 +178,8 @@ public class SeleniumExecutor {
if (connectAble) {
driver.get(target);
costTime = System.currentTimeMillis() - stepStartTime;
addParams(params);
driver.get(target);
success = true;
} else {
message = "无响应的地址";
......@@ -205,7 +232,10 @@ public class SeleniumExecutor {
break;
case CLICK:
content = format("点击元素:[%s]", target);
element = locateElement(target);
if (isNull(element)) {
element = getElement(targets);
}
if (nonNull(element)) {
//如果该点击打开了新标签页 则通过对比当前与历史找出新的标签页句柄并存入Map
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
......@@ -227,7 +257,10 @@ public class SeleniumExecutor {
break;
case DOUBLE_CLICK:
content = format("双击元素:[%s]", target);
element = locateElement(target);
if (isNull(element)) {
element = getElement(targets);
}
if (nonNull(element)) {
//如果该双击打开了新标签页 则通过对比当前与历史找出新的标签页句柄并存入Map
boolean newWindow = nonNull(command.getOpensWindow()) && command.getOpensWindow();
......@@ -266,8 +299,11 @@ public class SeleniumExecutor {
}
break;
case MOUSE_OVER:
element = getElement(targets);
content = format("鼠标悬停:[%s]", target);
element = locateElement(target);
if (isNull(element)) {
element = getElement(targets);
}
if (nonNull(element)) {
new Actions(driver).moveToElement(element).perform();
costTime = System.currentTimeMillis() - stepStartTime;
......@@ -280,8 +316,11 @@ public class SeleniumExecutor {
}
break;
case TYPE:
element = getElement(targets);
content = format("输入内容:[%s]", value);
element = locateElement(target);
if (isNull(element)) {
element = getElement(targets);
}
if (nonNull(element)) {
String elementType = element.getAttribute("type");
if (!Objects.equals(elementType, "file")) {
......@@ -312,7 +351,7 @@ public class SeleniumExecutor {
.setSuccess(false)
.setCostTime(-1L)
.setContent("无")
.setMessage("未识别的Command类型");
.setMessage("未识别的操作类型:" + type);
}
} catch (Exception e) {
log.error(e.getLocalizedMessage());
......@@ -388,7 +427,7 @@ public class SeleniumExecutor {
return null;
}
//用于下拉框的元素定位 类型待补充
//根据单个target的元素定位 类型待补充
private WebElement locateElement(String target) {
String[] type_value = target.split("=", 2);
String type = type_value[0];
......@@ -396,6 +435,7 @@ public class SeleniumExecutor {
try {
switch (type) {
case "name":
case "css":
return driver.findElement(By.cssSelector(value));
case "id":
return driver.findElement(By.id(value));
......@@ -430,6 +470,7 @@ public class SeleniumExecutor {
finished = -1;
total = -1;
steps.clear();
params.clear();
seleniumHelper.getHistoryHandles().clear();
}
......
package com.zjty.autotest.util;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
public class JavaScriptUtil {
public void removeItemFromLocalStorage(WebDriver driver,String item) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(String.format(
"window.localStorage.removeItem('%s');", item));
}
public boolean isItemPresentInLocalStorage(WebDriver driver,String item) {
JavascriptExecutor js = (JavascriptExecutor) driver;
return !(js.executeScript(String.format(
"return window.localStorage.getItem('%s');", item)) == null);
}
public String getItemFromLocalStorage(WebDriver driver,String key) {
JavascriptExecutor js = (JavascriptExecutor) driver;
return (String) js.executeScript(String.format(
"return window.localStorage.getItem('%s');", key));
}
public String getKeyFromLocalStorage(WebDriver driver,int key) {
JavascriptExecutor js = (JavascriptExecutor) driver;
return (String) js.executeScript(String.format(
"return window.localStorage.key('%s');", key));
}
public Long getLocalStorageLength(WebDriver driver) {
JavascriptExecutor js = (JavascriptExecutor) driver;
return (Long) js.executeScript("return window.localStorage.length;");
}
public static void setItemInSessionStorage(WebDriver driver,String item, String value) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(String.format(
"window.sessionStorage.setItem('%s','%s');", item, value));
}
public static void clearSessionStorage(WebDriver driver) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(String.format("window.sessionStorage.clear();"));
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论