Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
A
automated-testing
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
黄承天
automated-testing
Commits
cc1eb907
提交
cc1eb907
authored
3月 04, 2020
作者:
黄承天
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
每个步骤里面
元素定位类型增加1种 link_text:通过文本来定位 操作类型增加2种 clear:清除输入框文本 select:下拉框选择 选择序号填在value字段里 从0开始
上级
5bcb21a8
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
41 行增加
和
110 行删除
+41
-110
Action.java
.../java/com/zjty/automatedtesting/common/action/Action.java
+5
-0
ByType.java
.../java/com/zjty/automatedtesting/common/action/ByType.java
+2
-0
Step.java
src/main/java/com/zjty/automatedtesting/pojo/test/Step.java
+1
-7
SeleniumServiceImpl.java
...ty/automatedtesting/service/impl/SeleniumServiceImpl.java
+10
-1
自动测试-详细设计.md
自动测试-详细设计.md
+23
-102
没有找到文件。
src/main/java/com/zjty/automatedtesting/common/action/Action.java
浏览文件 @
cc1eb907
...
...
@@ -15,4 +15,9 @@ public interface Action {
String
SWITCH
=
"switch"
;
String
HOME
=
"home"
;
String
CLEAR
=
"clear"
;
String
SELECT
=
"select"
;
}
src/main/java/com/zjty/automatedtesting/common/action/ByType.java
浏览文件 @
cc1eb907
...
...
@@ -15,4 +15,6 @@ public interface ByType {
String
NAME
=
"name"
;
String
LINK_TEXT
=
"link_text"
;
}
src/main/java/com/zjty/automatedtesting/pojo/test/Step.java
浏览文件 @
cc1eb907
...
...
@@ -59,13 +59,7 @@ public class Step {
/**
* 判断类型
*/
@ApiModelProperty
(
value
=
"
判断类型
"
,
position
=
7
)
@ApiModelProperty
(
value
=
"
断言
"
,
position
=
7
)
private
List
<
Assert
>
asserts
;
/**
* 期望结果
*/
@ApiModelProperty
(
value
=
"期望结果"
,
example
=
"ty"
,
position
=
8
)
private
String
expected
;
}
src/main/java/com/zjty/automatedtesting/service/impl/SeleniumServiceImpl.java
浏览文件 @
cc1eb907
...
...
@@ -17,12 +17,14 @@ import org.openqa.selenium.*;
import
org.openqa.selenium.chrome.ChromeDriver
;
import
org.openqa.selenium.firefox.FirefoxDriver
;
import
org.openqa.selenium.ie.InternetExplorerDriver
;
import
org.openqa.selenium.support.ui.Select
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.concurrent.TimeUnit
;
import
java.util.stream.Collectors
;
import
static
com
.
zjty
.
automatedtesting
.
common
.
action
.
Action
.*;
...
...
@@ -92,6 +94,11 @@ public class SeleniumServiceImpl implements SeleniumService {
webElement
.
click
();
}
else
if
(
Objects
.
equals
(
step
.
getAction
(),
SWITCH
))
{
driver
.
switchTo
().
frame
(
webElement
);
}
else
if
(
Objects
.
equals
(
step
.
getAction
(),
CLEAR
))
{
webElement
.
clear
();
}
else
if
(
Objects
.
equals
(
step
.
getAction
(),
SELECT
))
{
Select
select
=
new
Select
(
webElement
);
select
.
selectByIndex
(
Integer
.
parseInt
(
step
.
getValue
()));
}
else
{
throw
new
WebDriverException
(
"不匹配的操作类型:"
+
step
.
getAction
());
}
...
...
@@ -175,7 +182,7 @@ public class SeleniumServiceImpl implements SeleniumService {
@SuppressWarnings
(
"DuplicatedCode"
)
private
WebElement
getWebElement
(
String
getMethod
,
String
key
,
WebDriver
driver
)
{
WebElement
webElement
=
null
;
driver
.
manage
().
timeouts
().
implicitlyWait
(
6
,
TimeUnit
.
SECONDS
);
if
(
Objects
.
equals
(
getMethod
,
XPATH
))
{
webElement
=
driver
.
findElement
(
By
.
xpath
(
key
));
}
else
if
(
Objects
.
equals
(
getMethod
,
CSS
))
{
...
...
@@ -184,6 +191,8 @@ public class SeleniumServiceImpl implements SeleniumService {
webElement
=
driver
.
findElement
(
By
.
id
(
key
));
}
else
if
(
Objects
.
equals
(
getMethod
,
NAME
))
{
webElement
=
driver
.
findElement
(
By
.
name
(
key
));
}
else
if
(
Objects
.
equals
(
getMethod
,
LINK_TEXT
))
{
webElement
=
driver
.
findElement
(
By
.
linkText
(
key
));
}
if
(
Objects
.
nonNull
(
webElement
))
{
...
...
自动测试-详细设计.md
浏览文件 @
cc1eb907
...
...
@@ -75,20 +75,18 @@
操作类型:有以下4种
-
input:
对输入框输入文字的操作,需要填写元素的定位方式、定位关键值、输入值
。
-
input:
定位到输入框就是输入文本的操作,需要填写元素的定位方式、定位关键值、输入值。定位到上传文件按钮则是上传输入值所指路径的本地文件
。
-
clear:清除输入框内容。
-
click:对按钮的点击操作,需要填写元素的定位方式、定位关键值。
-
select:下拉框选择,需要填写元素的定位方式、定位关键值、输入值。
-
select:下拉框选择,需要填写元素的定位方式、定位关键值、输入值。输入值为选择的序号,从0开始算。
-
switch:切换至指定的内置框,需要填写元素的定位方式、定位关键值。
-
home:回到起始地址,不需要填写其它值。
另外,元素的定位方式有4种:xpath、id、class、css
。其中xpath最为好用且常用
。
另外,元素的定位方式有4种:xpath、id、class、css
、linked_text
。

断言:用于判断操作执行后,页面中某个指定元素的情况是否和预期的一致。断言可以有多个,可添加或删除断言。
断言:用于判断操作执行后,页面中某个指定元素的情况是否和预期的一致。断言可以有多个,可添加或删除断言。
未设置断言时未出现异常则为通过,否则不通过。设置了断言时则断言全部满足则为通过,否则不通过。
添加断言时同样需要填写元素定位方式与定位关键值,为了找到指定的元素。此外还需要填写断言类型。
...
...
@@ -202,110 +200,32 @@ has changed to Firefox ≥60.
IE浏览器的版本对应这个并没有找到具体所对应的版本,
**一般用2.5版本**
比较好一些(ie11)。
### 元素定位方法
假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。
```
html
<html>
<head>
<body
link=
"#0000cc"
>
<a
id=
"result_logo"
href=
"/"
ο
nm
ο
used
ο
wn=
"return c({'fm':'tab','tab':'logo'})"
>
<form
id=
"form"
class=
"fm"
name=
"f"
action=
"/s"
>
<span
class=
"soutu-btn"
></span>
<input
id=
"kw"
class=
"s_ipt"
name=
"wd"
value=
""
maxlength=
"255"
autocomplete=
"off"
>
```
我们的目的是要定位input标签的输入框。
-
通过id定位:
```
java
driver
.
findElement
(
By
.
id
(
"kw"
))
```
-
通过
name
定位:
```
java
driver
.
findElement
(
By
.
name
(
"wd"
))
```
-
通过
class
name
定位:
```
java
driver
.
findElement
(
By
.
className
(
"s_ipt"
))
```
-
通过
tag
name
定位:
```
java
driver
.
findElement
(
By
.
tagName
(
"input"
))
```
-
通过
xpath
定位,
xpath
定位有
N
种写法,这里列几个常用写法:
```
java
driver
.
findElement
(
By
.
xpath
(
"//*[@id='kw']"
))
driver
.
findElement
(
By
.
xpath
(
"//*[@name='wd']"
))
driver
.
findElement
(
By
.
xpath
(
"//input[@class='s_ipt']"
))
driver
.
findElement
(
By
.
xpath
(
"/html/body/form/span/input"
))
driver
.
findElement
(
By
.
xpath
(
"//span[@class='soutu-btn']/input"
))
driver
.
findElement
(
By
.
xpath
(
"//form[@id='form']/span/input"
))
driver
.
findElement
(
By
.
xpath
(
"//input[@id='kw' and @name='wd']"
))
```
-
通过
css
定位,
css
定位有
N
种写法,这里列几个常用写法:
```
java
driver
.
findElement
(
By
.
cssSelector
(
"#kw"
)
driver
.
findElement
(
By
.
cssSelector
(
"[name=wd]"
)
driver
.
findElement
(
By
.
cssSelector
(
".s_ipt"
)
driver
.
findElement
(
By
.
cssSelector
(
"html > body > form > span > input"
)
driver
.
findElement
(
By
.
cssSelector
(
"span.soutu-btn> input#kw"
)
driver
.
findElement
(
By
.
cssSelector
(
"form#form > span > input"
)
```
接下来,我们的页面上有一组文本链接。
```
java
<a
class=
"mnav"
href=
"http://news.baidu.com"
name=
"tj_trnews"
>
新闻
</a>
<a
class=
"mnav"
href=
"http://www.hao123.com"
name=
"tj_trhao123"
>
hao123
</a>
```
- 通过link text定位:
```
java
driver.findElement(By.linkText("新闻")
driver.findElement(By.linkText("hao123")
```
- 通过partialLink text定位:
### 相关接口概览
```
java
driver.findElement(By.partialLinkText("新")
driver.findElement(By.partialLinkText("hao")
driver.findElement(By.partialLinkText("123")
```
测试系统:
关于xpaht和css的定位比较复杂,请参考:
[
xpath语法
](
http://www.w3school.com.cn/xpath/xpath_syntax.asp
)
、
[
css选择器
](
http://www.w3school.com.cn/cssref/css_selectors.asp
)
### 相关接口概览
| url | 类型 | 描述 |
| ---------------- | ---- | ------------------ |
| /system/create | POST | 新增测试系统 |
| /system/get/{id} | GET | 根据id获取测试系统 |
测试用例:
| url | 类型 | 描述 |
| --------------------- | ------ | ------------------------------------------- |
| /testcase/execute | POST | 执行测试用例 |
| /testcase/save | POST | 保存测试用例(不附带id为新增 附带id为修改) |
| /testcase/get | GET | 获取所有测试用例 |
| /testcase/get/{id} | GET | 根据id获取单个测试用例 |
| /testcase/delete/{id} | DELETE | 根据id删除单个测试用例 |
| url | 类型 | 描述 |
| -------------------------- | ------ | ------------------------------------------------------------ |
| /testcase/execute | POST | 执行测试用例 |
| /execute/system/{systemId} | GET | 根据测试系统id.执行改测试系统下的所有测试用例并返回测试结果报告的集合. |
| /testcase/create | POST | 新增测试用例 |
| /testcase/update | POST | 修改测试用例 |
| /testcase/get | GET | 获取所有测试用例 |
| /testcase/get/{id} | GET | 根据id获取单个测试用例 |
| /get/system/{systemId} | GET | 根据测试系统id查询指定测试系统下的所有测试用例. |
| /testcase/delete/{id} | DELETE | 根据id删除单个测试用例 |
测试报告:
| url | 类型 | 描述 |
| ------------------------- | ------ | ------------------------------------------------------------ |
| /report/get | GET | 获取所有测试报告 |
| ------------------------- | ------ | ------------------------------------------------------------ |
| /report/get/case/{caseId} | GET | 根据所属测试用例的id查询测试报告.返回由该测试用例执行后生成的所有报告. |
| /report/get/{id} | GET | 根据id获取单个测试报告 |
| /report/delete/{id} | DELETE | 根据id删除单个测试报告 |
...
...
@@ -324,6 +244,7 @@ IE浏览器的版本对应这个并没有找到具体所对应的版本,**一
-
2020.2.25:修复Chrome驱动无法运行的问题。判断预期结果前和每个步骤执行后会等待2秒以保证结果更精准。
-
2020.2.28:完成测试系统这一块相关功能接口:增加测试系统的新增和查询接口;增加根据测试系统id查询测试用例的接口;增加根据测试系统id批量执行其所有测试用例的接口。
-
2020.3.2:数据结构改动:测试步骤的断言改为集合形式 ;并重新定义了断言的数据结构和判断机制。
-
2020.3.4:每个步骤里面:元素定位类型增加一种link_text;操作类型增加2种,clear为清除输入框文本select为下拉框选择,选择序号填在value字段里,从0开始算。
### 遗留问题
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论