Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
A
auto-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
黄承天
auto-test
Commits
94c58e3a
提交
94c58e3a
authored
3月 26, 2020
作者:
黄承天
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
完成遍历测试执行类与方法
上级
e5dccc09
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
139 行增加
和
90 行删除
+139
-90
pom.xml
pom.xml
+6
-0
ElementDetail.java
...ain/java/com/zjty/autotest/pojo/report/ElementDetail.java
+10
-6
Measure.java
src/main/java/com/zjty/autotest/pojo/report/Measure.java
+4
-0
TransHelper.java
src/main/java/com/zjty/autotest/service/TransHelper.java
+0
-1
SeleniumExecutor.java
...java/com/zjty/autotest/service/impl/SeleniumExecutor.java
+87
-74
AutotestApplicationTests.java
...test/java/com/zjty/autotest/AutotestApplicationTests.java
+32
-9
没有找到文件。
pom.xml
浏览文件 @
94c58e3a
...
...
@@ -101,6 +101,12 @@
<artifactId>
selenium-java
</artifactId>
<version>
4.0.0-alpha-4
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>
org.jsoup
</groupId>
<artifactId>
jsoup
</artifactId>
<version>
1.13.1
</version>
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/zjty/autotest/pojo/report/Detail.java
→
src/main/java/com/zjty/autotest/pojo/report/
Element
Detail.java
浏览文件 @
94c58e3a
package
com
.
zjty
.
autotest
.
pojo
.
report
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* <p>Description : autotest
* <p>Date : 2020/3/24 11:15
* <p>@author : C
* 元素测试信息
*/
public
class
Detail
{
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
ElementDetail
{
/**
* 元素类型
...
...
@@ -17,11 +25,6 @@ public class Detail {
*/
private
Integer
responseTime
;
/**
* 路径
*/
private
String
url
;
/**
* 是否通过
*/
...
...
@@ -31,4 +34,5 @@ public class Detail {
* 信息(未通过理由)
*/
private
String
message
;
}
src/main/java/com/zjty/autotest/pojo/report/Measure.java
浏览文件 @
94c58e3a
...
...
@@ -44,4 +44,8 @@ public class Measure {
*/
private
String
screenshot
;
/**
* 所有元素测试信息
*/
private
List
<
ElementDetail
>
elementDetails
;
}
src/main/java/com/zjty/autotest/service/TransHelper.java
浏览文件 @
94c58e3a
...
...
@@ -3,7 +3,6 @@ package com.zjty.autotest.service;
import
org.springframework.stereotype.Service
;
@SuppressWarnings
(
"SpringJavaAutowiredFieldsWarningInspection"
)
@Service
public
class
TransHelper
{
...
...
src/main/java/com/zjty/autotest/service/impl/SeleniumExecutor.java
浏览文件 @
94c58e3a
...
...
@@ -3,6 +3,7 @@ package com.zjty.autotest.service.impl;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Queues
;
import
com.google.common.collect.Sets
;
import
com.zjty.autotest.pojo.report.ElementDetail
;
import
com.zjty.autotest.pojo.report.Measure
;
import
com.zjty.autotest.pojo.report.Report
;
import
com.zjty.autotest.pojo.test.Input
;
...
...
@@ -11,15 +12,15 @@ import com.zjty.autotest.util.FileUtil;
import
com.zjty.autotest.util.WebDriverUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.openqa.selenium.*
;
import
org.openqa.selenium.support.ui.ExpectedCondition
;
import
org.openqa.selenium.support.ui.WebDriverWait
;
import
org.openqa.selenium.support.ui.ExpectedConditions
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
java.util.*
;
import
java.util.concurrent.TimeUnit
;
import
java.util.function.Predicate
;
import
static
com
.
zjty
.
autotest
.
common
.
action
.
LabelType
.
*
;
import
static
com
.
zjty
.
autotest
.
common
.
action
.
LabelType
.
INPUT
;
import
static
java
.
util
.
Objects
.
nonNull
;
/**
...
...
@@ -66,8 +67,14 @@ public class SeleniumExecutor {
*/
private
String
currentUrl
;
/**
* 当前测试url的源码
*/
private
String
currentSource
;
public
Report
execute
(
Project
project
)
{
driver
=
WebDriverUtil
.
getWebDriver
(
project
.
getBrowser
());
driver
.
manage
().
timeouts
().
pageLoadTimeout
(
2L
,
TimeUnit
.
SECONDS
);
inputs
=
project
.
getInputs
();
List
<
Measure
>
measures
=
Lists
.
newArrayList
();
String
os
=
""
;
...
...
@@ -102,111 +109,120 @@ public class SeleniumExecutor {
//打开网页 记录响应时间
long
startTime
=
System
.
currentTimeMillis
();
driver
.
get
(
currentUrl
);
currentSource
=
driver
.
getPageSource
();
long
endTime
=
System
.
currentTimeMillis
();
Long
responseTime
=
endTime
-
startTime
;
log
.
info
(
"当前URL:{} 响应时间 {} ms 开始进行遍历..."
,
currentUrl
,
responseTime
);
log
.
info
(
"剩余URL队列:{}"
,
urlQueue
);
log
.
info
(
"正在获取当前网页所有元素..."
);
//获取当前网页的所有元素并放入元素队列
getAllElements
(
driver
);
log
.
info
(
"获取完毕...共{}个元素..."
,
elements
.
size
());
//元素序号重置
elementIndex
=
0
;
//开始遍历操作元素队列中的元素 返回
错误
信息
String
message
=
traversal
();
//如果
无错误信息
则是通过
Boolean
success
=
Objects
.
equals
(
message
,
""
);
//开始遍历操作元素队列中的元素 返回
各个元素测试
信息
List
<
ElementDetail
>
elementDetails
=
traversal
();
//如果
全部元素通过
则是通过
Boolean
success
=
elementDetails
.
stream
().
allMatch
(
ElementDetail:
:
getSuccess
);
//如果出错 则提供截图
String
screenshot
=
""
;
String
screenshot
=
null
;
if
(!
success
)
{
String
screenshotName
=
alterUrlName
(
currentUrl
);
screenshot
(
screenshotName
);
screenshot
=
String
.
format
(
"http://%s:%s/screenshots/%s"
,
screenshotPrefixHost
,
screenshotPrefixPort
,
screenshotName
);
}
//总合信息
HashSet
<
String
>
messages
=
Sets
.
newHashSet
();
elementDetails
.
forEach
(
elementDetail
->
messages
.
add
(
elementDetail
.
getMessage
()));
StringBuilder
message
=
new
StringBuilder
();
messages
.
forEach
(
message:
:
append
);
log
.
info
(
"遍历完毕..."
);
measure
=
new
Measure
(
currentUrl
,
success
,
responseTime
.
intValue
(),
message
,
screenshot
message
.
toString
(),
screenshot
,
elementDetails
);
}
return
measure
;
}
private
String
traversal
()
{
StringBuilder
message
=
new
StringBuilder
();
private
List
<
ElementDetail
>
traversal
()
{
List
<
ElementDetail
>
elementDetails
=
Lists
.
newArrayList
();
while
(
elementIndex
<
elements
.
size
())
{
WebElement
element
=
elements
.
get
(
elementIndex
);
String
elementMsg
=
act
(
element
);
if
(
nonNull
(
elementMsg
))
{
message
.
append
(
elementMsg
);
ElementDetail
elementDetail
=
act
(
element
);
elementIndex
++;
boolean
urlChanged
=
checkURl
();
boolean
sourceChanged
=
checkSource
();
if
(
urlChanged
)
{
boolean
newPage
=
!
historyUrls
.
contains
(
driver
.
getCurrentUrl
())
&&
!
Sets
.
newHashSet
(
urlQueue
).
contains
(
driver
.
getCurrentUrl
())
&&
sourceChanged
;
if
(
newPage
)
{
log
.
info
(
"检测到新url:{} 加入队列 "
,
driver
.
getCurrentUrl
());
urlQueue
.
add
(
driver
.
getCurrentUrl
());
urlQueue
=
queueDuplicateRemoval
(
urlQueue
);
}
reload
();
}
if
(
sourceChanged
)
{
reload
();
}
elementDetails
.
add
(
elementDetail
);
}
return
message
.
toString
()
;
return
elementDetails
;
}
private
String
act
(
WebElement
element
)
{
private
ElementDetail
act
(
WebElement
element
)
{
String
type
=
""
;
String
message
=
null
;
elementIndex
++;
Long
responseTIme
=
0L
;
boolean
success
=
false
;
try
{
if
(
isEnabled
AndDisplayed
(
element
))
{
if
(
isEnabled
(
element
))
{
log
.
info
(
"操作第{}个元素 ------ text:[{}] ----- tag:[{}]"
,
elementIndex
+
1
,
element
.
getText
(),
element
.
getTagName
());
if
(
is
EnabledInput
(
element
))
{
if
(
is
InputAble
(
element
)
&&
!
inputs
.
isEmpty
(
))
{
Input
input
=
inputs
.
remove
(
0
);
element
.
sendKeys
(
input
.
getValue
());
}
element
.
click
();
if
(
waitTime
>
0
)
{
sleep
();
}
//一旦页面发生过跳转 通过重新打开回到原来的页面后需要重新获取元素
Boolean
pageChanged
=
checkPage
();
if
(
pageChanged
)
{
reload
();
traversal
();
}
//警告窗口处理
Alert
alert
=
getAlert
();
success
=
true
;
Alert
alert
=
ExpectedConditions
.
alertIsPresent
().
apply
(
driver
);
if
(
nonNull
(
alert
))
{
message
=
"出现警告窗:"
+
alert
.
getText
();
alert
.
accept
();
success
=
false
;
}
}
else
{
log
.
info
(
"操作第{}个元素 ------ 该元素Enabled 跳过"
,
elementIndex
+
1
);
}
}
catch
(
ElementNotInteractableException
e
)
{
message
=
"异常的布局;"
;
log
.
error
(
"error:在可操作范围之外的元素"
);
}
catch
(
TimeoutException
ignored
)
{
}
catch
(
StaleElementReferenceException
e
)
{
reload
();
traversal
();
success
=
false
;
log
.
error
(
"error:存在可操作范围之外的元素"
);
}
catch
(
Exception
e
)
{
message
=
"预料之外的异常:"
+
e
.
getMessage
()
+
";"
;
success
=
false
;
log
.
error
(
"error:"
+
e
);
}
return
message
;
return
new
ElementDetail
(
type
,
responseTIme
.
intValue
(),
success
,
message
);
}
private
Boolean
checkPage
()
{
boolean
pageChange
=
!
Objects
.
equals
(
currentUrl
,
driver
.
getCurrentUrl
()
);
if
(
pageChange
)
{
boolean
newPage
=
!
historyUrls
.
contains
(
driver
.
getCurrentUrl
());
if
(
newPage
)
{
urlQueue
.
add
(
driver
.
getCurrentUrl
());
//去重防止重复添加
urlQueue
=
queueDuplicateRemoval
(
urlQueue
);
driver
.
get
(
currentUrl
);
}
return
true
;
}
else
{
return
false
;
}
private
Boolean
checkURl
()
{
String
practiseUrl
=
driver
.
getCurrentUrl
();
return
!
Objects
.
equals
(
currentUrl
,
practiseUrl
);
}
private
Boolean
checkSource
()
{
String
practise
=
driver
.
getPageSource
();
return
!
Objects
.
equals
(
practise
,
currentSource
);
}
private
Queue
<
String
>
queueDuplicateRemoval
(
Queue
<
String
>
queue
)
{
...
...
@@ -236,28 +252,20 @@ 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
);
currentSource
=
driver
.
getPageSource
();
getAllElements
(
driver
);
}
@SuppressWarnings
(
"unused"
)
private
void
sleep
()
{
try
{
Thread
.
sleep
(
waitTime
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
if
(
waitTime
>
0
)
{
try
{
Thread
.
sleep
(
waitTime
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
...
...
@@ -279,12 +287,17 @@ public class SeleniumExecutor {
}
}
private
Boolean
is
EnabledInput
(
WebElement
element
)
{
private
Boolean
is
InputAble
(
WebElement
element
)
{
return
Objects
.
equals
(
element
.
getTagName
(),
INPUT
);
}
private
Boolean
isEnabledAndDisplayed
(
WebElement
element
)
{
return
element
.
isEnabled
()
&&
element
.
isDisplayed
();
@SuppressWarnings
(
"unused"
)
private
Boolean
isClickAble
(
WebElement
element
)
{
return
nonNull
(
ExpectedConditions
.
elementToBeClickable
(
element
).
apply
(
driver
));
}
private
Boolean
isEnabled
(
WebElement
element
)
{
return
nonNull
(
ExpectedConditions
.
elementToBeClickable
(
element
).
apply
(
driver
));
}
private
String
alterUrlName
(
String
fileName
)
{
...
...
src/test/java/com/zjty/autotest/AutotestApplicationTests.java
浏览文件 @
94c58e3a
...
...
@@ -9,18 +9,21 @@ 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.jsoup.Jsoup
;
import
org.jsoup.nodes.Document
;
import
org.jsoup.nodes.Element
;
import
org.jsoup.select.Elements
;
import
org.junit.jupiter.api.Test
;
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.openqa.selenium.support.ui.ExpectedConditions
;
import
org.openqa.selenium.support.ui.Sleeper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
java.time.Duration
;
import
java.util.*
;
import
java.util.logging.Level
;
import
java.util.concurrent.TimeUnit
;
import
java.util.stream.Collectors
;
@Slf4j
@SpringBootTest
...
...
@@ -30,10 +33,10 @@ class AutotestApplicationTests {
SeleniumExecutor
seleniumExecutor
;
@Test
public
void
execute
()
{
public
void
execute
()
throws
InterruptedException
{
List
<
Input
>
inputs
=
Lists
.
newArrayList
();
inputs
.
add
(
new
Input
(
null
,
null
,
null
,
"caozuoyuan"
));
inputs
.
add
(
new
Input
(
null
,
null
,
null
,
"caozuoyuan123"
));
inputs
.
add
(
new
Input
(
null
,
null
,
null
,
"caozuoyuan"
));
inputs
.
add
(
new
Input
(
null
,
null
,
null
,
"caozuoyuan123"
));
String
url
=
"http://192.168.1.244:8080/person/#/login"
;
Project
project
=
new
Project
(
...
...
@@ -43,9 +46,29 @@ class AutotestApplicationTests {
url
,
inputs
);
// String url2 = "file:///C:/code/wps/index.html";
// WebDriver driver = WebDriverUtil.getWebDriver("firefox");
// driver.manage().timeouts().pageLoadTimeout(4L, TimeUnit.SECONDS);
// driver.get(url);
// Sleeper.SYSTEM_SLEEPER.sleep(Duration.ofSeconds(2));
// String source1 = driver.getPageSource();
// driver.get(url2);
// driver.get(url);
// Sleeper.SYSTEM_SLEEPER.sleep(Duration.ofSeconds(2));
// String source2 = driver.getPageSource();
// System.out.println(Objects.equals(source1,source2));
Report
report
=
seleniumExecutor
.
execute
(
project
);
for
(
Measure
measure
:
report
.
getMeasures
())
{
System
.
out
.
println
(
measure
);
}
// Document document = Jsoup.parse(driver.getPageSource());
// List<Element> elements = document.getAllElements().stream()
// .filter(element -> element.childrenSize() == 0)
// .collect(Collectors.toList());
// for (Element element : elements) {
// System.out.println(element.attributes());
// }
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论