Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
A
auto-test-case
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
黄承天
auto-test-case
Commits
5c5c7825
提交
5c5c7825
authored
12月 03, 2020
作者:
黄承天
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[feature]
增加参数添加机制
上级
90c06041
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
111 行增加
和
13 行删除
+111
-13
InputType.java
src/main/java/com/zjty/autotest/common/action/InputType.java
+5
-1
TestController.java
...ain/java/com/zjty/autotest/controller/TestController.java
+1
-1
TestRequest.java
...main/java/com/zjty/autotest/pojo/request/TestRequest.java
+6
-1
SeleniumExecutor.java
...main/java/com/zjty/autotest/service/SeleniumExecutor.java
+51
-10
JavaScriptUtil.java
src/main/java/com/zjty/autotest/util/JavaScriptUtil.java
+48
-0
没有找到文件。
src/main/java/com/zjty/autotest/common/action/InputType.java
浏览文件 @
5c5c7825
...
...
@@ -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"
;
}
src/main/java/com/zjty/autotest/controller/TestController.java
浏览文件 @
5c5c7825
...
...
@@ -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
.
get
Params
(),
testRequest
.
get
Headless
());
reportService
.
save
(
report
);
}
return
ResponseEntity
.
ok
(
ImmutableMap
.
of
(
"message"
,
"测试完毕"
));
...
...
src/main/java/com/zjty/autotest/pojo/request/TestRequest.java
浏览文件 @
5c5c7825
...
...
@@ -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
;
}
src/main/java/com/zjty/autotest/service/SeleniumExecutor.java
浏览文件 @
5c5c7825
...
...
@@ -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
=
-
1
L
;
private
Long
costTime
=
0
L
;
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
=
getElement
(
targets
);
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
=
getElement
(
targets
);
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
();
}
...
...
src/main/java/com/zjty/autotest/util/JavaScriptUtil.java
0 → 100644
浏览文件 @
5c5c7825
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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论