Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
A
auto-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
黄承天
auto-test
Commits
ac9bbc23
提交
ac9bbc23
authored
3月 23, 2020
作者:
黄承天
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
完成遍历测试执行类与方法
上级
3065a019
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
155 行增加
和
76 行删除
+155
-76
ResourceController.java
...java/com/zjty/autotest/controller/ResourceController.java
+9
-0
Measure.java
src/main/java/com/zjty/autotest/pojo/report/Measure.java
+1
-2
Report.java
src/main/java/com/zjty/autotest/pojo/report/Report.java
+0
-6
Project.java
src/main/java/com/zjty/autotest/pojo/test/Project.java
+3
-1
SeleniumExecutor.java
...java/com/zjty/autotest/service/impl/SeleniumExecutor.java
+123
-53
AutotestApplicationTests.java
...test/java/com/zjty/autotest/AutotestApplicationTests.java
+19
-14
没有找到文件。
src/main/java/com/zjty/autotest/controller/ResourceController.java
浏览文件 @
ac9bbc23
package
com
.
zjty
.
autotest
.
controller
;
package
com
.
zjty
.
autotest
.
controller
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
/**
* @author C
* 静态资源映射
*/
@SuppressWarnings
(
"SpringMVCViewInspection"
)
@SuppressWarnings
(
"SpringMVCViewInspection"
)
@Controller
@Controller
public
class
ResourceController
{
public
class
ResourceController
{
...
@@ -12,4 +17,8 @@ public class ResourceController {
...
@@ -12,4 +17,8 @@ public class ResourceController {
return
"index.html"
;
return
"index.html"
;
}
}
@RequestMapping
(
"/pic/{name}"
)
public
String
picture
(
@PathVariable
String
name
){
return
name
+
".png"
;
}
}
}
src/main/java/com/zjty/autotest/pojo/report/Measure.java
浏览文件 @
ac9bbc23
...
@@ -40,7 +40,6 @@ public class Measure {
...
@@ -40,7 +40,6 @@ public class Measure {
/**
/**
* 截图的url
* 截图的url
*/
*/
private
String
picture
;
private
String
screenshot
;
}
}
src/main/java/com/zjty/autotest/pojo/report/Report.java
浏览文件 @
ac9bbc23
...
@@ -42,15 +42,9 @@ public class Report {
...
@@ -42,15 +42,9 @@ public class Report {
*/
*/
private
String
os
;
private
String
os
;
/**
* 测试结果信息
*/
private
String
message
;
/**
/**
* 每个路由测试详情
* 每个路由测试详情
*/
*/
private
List
<
Measure
>
measures
;
private
List
<
Measure
>
measures
;
}
}
src/main/java/com/zjty/autotest/pojo/test/Project.java
浏览文件 @
ac9bbc23
...
@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
...
@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.NoArgsConstructor
;
import
javax.persistence.Entity
;
import
javax.persistence.Id
;
import
java.util.List
;
import
java.util.List
;
/**
/**
...
@@ -18,7 +20,7 @@ public class Project {
...
@@ -18,7 +20,7 @@ public class Project {
/**
/**
* 主键
* 主键
*/
*/
private
String
id
;
private
Integer
id
;
/**
/**
* 项目名称
* 项目名称
...
...
src/main/java/com/zjty/autotest/service/SeleniumExecutor.java
→
src/main/java/com/zjty/autotest/service/
impl/
SeleniumExecutor.java
浏览文件 @
ac9bbc23
package
com
.
zjty
.
autotest
.
service
;
package
com
.
zjty
.
autotest
.
service
.
impl
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Queues
;
import
com.google.common.collect.Queues
;
import
com.google.common.collect.Sets
;
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.FileUtil
;
import
com.zjty.autotest.util.WebDriverUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.openqa.selenium.*
;
import
org.openqa.selenium.*
;
import
org.openqa.selenium.support.ui.ExpectedCondition
;
import
org.openqa.selenium.support.ui.WebDriverWait
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
java.util.*
;
import
java.util.*
;
import
java.util.function.Predicate
;
import
static
com
.
zjty
.
autotest
.
common
.
action
.
LabelType
.*;
import
static
com
.
zjty
.
autotest
.
common
.
action
.
LabelType
.*;
import
static
java
.
util
.
Objects
.
nonNull
;
import
static
java
.
util
.
Objects
.
nonNull
;
/**
* @author C
*/
@SuppressWarnings
(
"FieldCanBeLocal"
)
@SuppressWarnings
(
"FieldCanBeLocal"
)
@Slf4j
@Slf4j
@Service
@Service
...
@@ -21,7 +31,7 @@ public class SeleniumExecutor {
...
@@ -21,7 +31,7 @@ public class SeleniumExecutor {
private
WebDriver
driver
;
private
WebDriver
driver
;
private
Map
<
String
,
String
>
inputs
=
Maps
.
newHashMap
();
private
List
<
Input
>
inputs
=
Lists
.
newArrayList
();
private
Set
<
String
>
historyUrls
=
Sets
.
newHashSet
();
private
Set
<
String
>
historyUrls
=
Sets
.
newHashSet
();
...
@@ -31,83 +41,135 @@ public class SeleniumExecutor {
...
@@ -31,83 +41,135 @@ public class SeleniumExecutor {
private
List
<
WebElement
>
elements
=
Lists
.
newArrayList
();
private
List
<
WebElement
>
elements
=
Lists
.
newArrayList
();
/**
* 元素序号记录
*/
private
Integer
elementIndex
;
private
Integer
elementIndex
;
/**
* 当前进行的窗口页
*/
private
String
currentWindow
;
private
String
currentWindow
;
/**
* 当前测试的url
*/
private
String
currentUrl
;
private
String
currentUrl
;
public
List
<
String
>
execute
(
String
url
)
{
public
Report
execute
(
Project
project
)
{
currentUrl
=
url
;
driver
=
WebDriverUtil
.
getWebDriver
(
project
.
getBrowser
());
inputs
=
project
.
getInputs
();
List
<
Measure
>
measures
=
Lists
.
newArrayList
();
String
os
=
""
;
currentUrl
=
project
.
getUrl
();
currentWindow
=
driver
.
getWindowHandle
();
currentWindow
=
driver
.
getWindowHandle
();
while
(
nonNull
(
currentWindow
))
{
while
(
nonNull
(
currentWindow
))
{
driver
.
switchTo
().
window
(
currentWindow
);
driver
.
switchTo
().
window
(
currentWindow
);
while
(
nonNull
(
currentUrl
))
{
while
(
nonNull
(
currentUrl
))
{
testUrl
(
currentUrl
);
Measure
measure
=
testUrl
(
currentUrl
);
measures
.
add
(
measure
);
currentUrl
=
urlQueue
.
poll
();
currentUrl
=
urlQueue
.
poll
();
}
}
currentWindow
=
windowQueue
.
poll
();
currentWindow
=
windowQueue
.
poll
();
driver
.
close
();
driver
.
close
();
checkWindow
();
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
))
{
if
(!
historyUrls
.
contains
(
currentUrl
))
{
historyUrls
.
add
(
driver
.
getCurrentUrl
());
historyUrls
.
add
(
driver
.
getCurrentUrl
());
//打开网页 记录响应时间
long
startTime
=
System
.
currentTimeMillis
();
long
startTime
=
System
.
currentTimeMillis
();
driver
.
get
(
currentUrl
);
driver
.
get
(
currentUrl
);
long
endTime
=
System
.
currentTimeMillis
();
long
endTime
=
System
.
currentTimeMillis
();
long
cost
Time
=
endTime
-
startTime
;
Long
response
Time
=
endTime
-
startTime
;
log
.
info
(
"当前URL:{} 响应时间 {} ms 开始进行遍历..."
,
currentUrl
,
cost
Time
);
log
.
info
(
"当前URL:{} 响应时间 {} ms 开始进行遍历..."
,
currentUrl
,
response
Time
);
log
.
info
(
"正在获取当前网页所有元素..."
);
log
.
info
(
"正在获取当前网页所有元素..."
);
//获取当前网页的所有元素并放入元素队列
getAllElements
(
driver
);
getAllElements
(
driver
);
log
.
info
(
"获取完毕...共{}个元素..."
,
elements
.
size
());
log
.
info
(
"获取完毕...共{}个元素..."
,
elements
.
size
());
//元素序号重置
elementIndex
=
0
;
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
(
"遍历完毕..."
);
log
.
info
(
"遍历完毕..."
);
measure
=
new
Measure
(
currentUrl
,
success
,
responseTime
.
intValue
(),
message
,
screenshot
);
}
}
return
measure
;
}
}
private
void
traversal
()
{
private
String
traversal
()
{
try
{
String
message
=
null
;
while
(
elementIndex
<
elements
.
size
())
{
while
(
elementIndex
<
elements
.
size
())
{
WebElement
element
=
elements
.
get
(
elementIndex
);
WebElement
element
=
elements
.
get
(
elementIndex
);
act
(
element
);
message
=
act
(
element
);
checkPage
();
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
{
try
{
log
.
info
(
"正在操作第{}个元素 ------ text:[{}] ----- tag:[{}]"
,
elementIndex
+
1
,
element
.
getText
(),
element
.
getTagName
());
log
.
info
(
"正在操作第{}个元素 ------ text:[{}] ----- tag:[{}]"
,
elementIndex
+
1
,
element
.
getText
(),
element
.
getTagName
());
elementIndex
++;
elementIndex
++;
if
(
isEnabledAndDisplayed
(
element
))
{
if
(
isEnabledAndDisplayed
(
element
))
{
if
(
isEnabledInput
(
element
))
{
if
(
isEnabledInput
(
element
))
{
String
id
=
element
.
getAttribute
(
"id"
);
inputValue
(
element
,
inputs
);
String
inputValue
=
inputs
.
get
(
id
);
element
.
sendKeys
(
inputValue
);
sleep
(
1000L
);
}
else
if
(
isEnabledClick
(
element
))
{
}
else
if
(
isEnabledClick
(
element
))
{
element
.
click
();
element
.
click
();
}
}
}
}
sleep
(
2000L
);
sleep
();
}
catch
(
StaleElementReferenceException
e
)
{
//一旦页面发生过跳转 通过重新打开回到原来的页面后需要重新获取元素
reload
();
Boolean
pageChanged
=
checkPage
();
if
(
pageChanged
)
{
reload
();
}
//警告窗口处理
Alert
alert
=
getAlert
();
if
(
nonNull
(
alert
))
{
message
=
"出现警告窗:"
+
alert
.
getText
();
alert
.
accept
();
}
}
catch
(
ElementNotInteractableException
e
)
{
}
catch
(
ElementNotInteractableException
e
)
{
log
.
error
(
"error:在可操作范围之外的元素"
);
message
=
"异常的布局;"
;
log
.
error
(
"error:在可操作范围之外的元素"
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
message
=
"预料之外的异常:"
+
e
.
getMessage
()
+
";"
;
log
.
error
(
"error:"
+
e
.
getMessage
());
log
.
error
(
"error:"
+
e
.
getMessage
());
}
}
return
message
;
}
}
private
void
checkPage
()
{
private
Boolean
checkPage
()
{
boolean
pageChange
=
!
Objects
.
equals
(
currentUrl
,
driver
.
getCurrentUrl
());
boolean
pageChange
=
!
Objects
.
equals
(
currentUrl
,
driver
.
getCurrentUrl
());
if
(
pageChange
)
{
if
(
pageChange
)
{
boolean
newPage
=
!
historyUrls
.
contains
(
driver
.
getCurrentUrl
());
boolean
newPage
=
!
historyUrls
.
contains
(
driver
.
getCurrentUrl
());
...
@@ -115,6 +177,18 @@ public class SeleniumExecutor {
...
@@ -115,6 +177,18 @@ public class SeleniumExecutor {
urlQueue
.
add
(
driver
.
getCurrentUrl
());
urlQueue
.
add
(
driver
.
getCurrentUrl
());
}
}
reload
();
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
());
}
}
}
}
...
@@ -124,15 +198,26 @@ public class SeleniumExecutor {
...
@@ -124,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
()
{
private
void
reload
()
{
driver
.
get
(
currentUrl
);
driver
.
get
(
currentUrl
);
getAllElements
(
driver
);
getAllElements
(
driver
);
traversal
();
traversal
();
}
}
private
void
sleep
(
Long
time
)
{
private
void
sleep
()
{
try
{
try
{
Thread
.
sleep
(
time
);
Thread
.
sleep
(
2000L
);
}
catch
(
InterruptedException
e
)
{
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
...
@@ -145,15 +230,11 @@ public class SeleniumExecutor {
...
@@ -145,15 +230,11 @@ public class SeleniumExecutor {
}
}
private
void
getSubElements
(
WebElement
element
)
{
private
void
getSubElements
(
WebElement
element
)
{
try
{
List
<
WebElement
>
results
=
element
.
findElements
(
By
.
xpath
(
"*"
));
List
<
WebElement
>
results
=
element
.
findElements
(
By
.
xpath
(
"*"
));
if
(
results
.
isEmpty
())
{
if
(
results
.
isEmpty
())
{
elements
.
add
(
element
);
elements
.
add
(
element
);
}
else
{
}
else
{
results
.
forEach
(
this
::
getSubElements
);
results
.
forEach
(
this
::
getSubElements
);
}
}
catch
(
StaleElementReferenceException
e
)
{
}
}
}
}
...
@@ -172,18 +253,7 @@ public class SeleniumExecutor {
...
@@ -172,18 +253,7 @@ public class SeleniumExecutor {
private
void
screenShot
(
String
name
)
{
private
void
screenShot
(
String
name
)
{
byte
[]
bytes
=
((
TakesScreenshot
)
driver
).
getScreenshotAs
(
OutputType
.
BYTES
);
byte
[]
bytes
=
((
TakesScreenshot
)
driver
).
getScreenshotAs
(
OutputType
.
BYTES
);
FileUtil
.
output
(
bytes
,
FileUtil
.
WORK_PATH
+
name
+
".png"
);
FileUtil
.
output
(
bytes
,
FileUtil
.
WORK_PATH
+
"screenshots\\"
+
name
+
".png"
);
}
//
// Setter
//
public
void
setDriver
(
WebDriver
driver
)
{
this
.
driver
=
driver
;
}
public
void
setInputs
(
Map
<
String
,
String
>
inputs
)
{
this
.
inputs
=
inputs
;
}
}
}
}
src/test/java/com/zjty/autotest/AutotestApplicationTests.java
浏览文件 @
ac9bbc23
package
com
.
zjty
.
autotest
;
package
com
.
zjty
.
autotest
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Queues
;
import
com.zjty.autotest.pojo.report.Measure
;
import
com.zjty.autotest.service.SeleniumExecutor
;
import
com.zjty.autotest.pojo.report.Report
;
import
com.zjty.autotest.util.FileUtil
;
import
com.zjty.autotest.pojo.test.Project
;
import
com.zjty.autotest.service.impl.SeleniumExecutor
;
import
com.zjty.autotest.util.WebDriverUtil
;
import
com.zjty.autotest.util.WebDriverUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.Test
;
import
org.openqa.selenium.*
;
import
org.openqa.selenium.*
;
import
org.openqa.selenium.chrome.ChromeDriver
;
import
org.openqa.selenium.chrome.ChromeDriver
;
import
org.openqa.selenium.firefox.FirefoxDriver
;
import
org.openqa.selenium.logging.LogEntries
;
import
org.openqa.selenium.logging.LogEntry
;
import
org.openqa.selenium.logging.LogType
;
import
org.openqa.selenium.logging.LogType
;
import
org.openqa.selenium.logging.LoggingPreferences
;
import
org.openqa.selenium.logging.LoggingPreferences
;
import
org.openqa.selenium.remote.CapabilityType
;
import
org.openqa.selenium.remote.CapabilityType
;
...
@@ -35,18 +34,24 @@ class AutotestApplicationTests {
...
@@ -35,18 +34,24 @@ class AutotestApplicationTests {
inputs
.
put
(
"name"
,
"root"
);
inputs
.
put
(
"name"
,
"root"
);
inputs
.
put
(
"password"
,
"root"
);
inputs
.
put
(
"password"
,
"root"
);
System
.
setProperty
(
"webdriver.firefox.driver"
,
WebDriverUtil
.
FIRE_FOX_EXE
);
System
.
setProperty
(
"webdriver.firefox.driver"
,
WebDriverUtil
.
FIRE_FOX_EXE
);
DesiredCapabilities
caps
=
DesiredCapabilities
.
firefox
();
DesiredCapabilities
caps
=
DesiredCapabilities
.
chrome
();
LoggingPreferences
logPrefs
=
new
LoggingPreferences
();
LoggingPreferences
logPrefs
=
new
LoggingPreferences
();
logPrefs
.
enable
(
LogType
.
BROWSER
,
Level
.
ALL
);
logPrefs
.
enable
(
LogType
.
BROWSER
,
Level
.
ALL
);
caps
.
setCapability
(
CapabilityType
.
LOGGING_PREFS
,
logPrefs
);
caps
.
setCapability
(
CapabilityType
.
LOGGING_PREFS
,
logPrefs
);
WebDriver
driver
=
new
Firefox
Driver
();
WebDriver
driver
=
new
Chrome
Driver
();
String
url
=
"file:///C:/
Users/C/Documents/WeChat%20Files/c18042003295/FileStorage/File/2020-03/test1
.html"
;
String
url
=
"file:///C:/
MyProjects/auto-test/wps/index
.html"
;
long
startTime
=
System
.
currentTimeMillis
();
long
startTime
=
System
.
currentTimeMillis
();
driver
.
get
(
url
);
driver
.
get
(
url
);
long
endTime
=
System
.
currentTimeMillis
();
Project
project
=
new
Project
(
long
costTime
=
endTime
-
startTime
;
null
,
log
.
info
(
"当前URL:{} 响应时间 {} ms 开始进行遍历..."
,
url
,
costTime
);
null
,
driver
.
findElement
(
By
.
xpath
(
"/html/body/div/span"
)).
click
();
"chrome"
,
url
,
Lists
.
newArrayList
()
);
Report
report
=
seleniumExecutor
.
execute
(
project
);
for
(
Measure
measure
:
report
.
getMeasures
())
{
System
.
out
.
println
(
measure
);
}
}
}
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论