提交 cc1eb907 authored 作者: 黄承天's avatar 黄承天

每个步骤里面

元素定位类型增加1种 link_text:通过文本来定位 操作类型增加2种 clear:清除输入框文本 select:下拉框选择 选择序号填在value字段里 从0开始
上级 5bcb21a8
......@@ -15,4 +15,9 @@ public interface Action {
String SWITCH = "switch";
String HOME = "home";
String CLEAR = "clear";
String SELECT = "select";
}
......@@ -15,4 +15,6 @@ public interface ByType {
String NAME = "name";
String LINK_TEXT = "link_text";
}
......@@ -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;
}
......@@ -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)) {
......
......@@ -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
![测试步骤编辑](D:\Documents\黄承天-工作文件\测试步骤编辑.png)
断言:用于判断操作执行后,页面中某个指定元素的情况是否和预期的一致。断言可以有多个,可添加或删除断言。
断言:用于判断操作执行后,页面中某个指定元素的情况是否和预期的一致。断言可以有多个,可添加或删除断言。未设置断言时未出现异常则为通过,否则不通过。设置了断言时则断言全部满足则为通过,否则不通过。
添加断言时同样需要填写元素定位方式与定位关键值,为了找到指定的元素。此外还需要填写断言类型。
......@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论