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