项目地址:
http://82.156.151.156:8080/login.html
一、系统测试用例
二、测试实现过程
根据自己的项目设计了一个自动化测试用例, 然后根据这个测试用例使用了 selenium自动化测试工具和 JUnit单元测试框架结合实现的 web 自动化测试.。
测试模块划分为三个,有三个包, 一个包下的类是工具类, 主要是用来创建驱动对象的, 避免在自动化测试的时候, 每次都要创建驱动对象. 另一个 包是放测试用例的, 一个页面一个测试类, 最后一个包是个测试套件,通过测试套件把测试类全部都加进去。
三、测试亮点
(1) 使用了 JUnit中提供的注解, 避免生成过多的对象, 造成资源和时间的浪费, 提高了自动化的执行效率;
(2)只创建了一次驱动对象, 避免每个用例重复创建驱动对象造成时间和资源的浪费;
(3)用例使用了参数化注解,保持用例的简洁, 提高代码的可读性;
(4)使用了测试套件, 降低了测试人员的工作量, 通过套件既可以指定哪些测试类需要运行, 也可以一次执行所有要运行的测试用例;
(5) 使用了屏幕截图, 方便问题的追溯以及问题的解决;
(6) 使用了等待, 如当页面发生跳转的时候, 或者页面还没来得及渲染的时候, 获取页面元素, 就会出现元素找不到的异常, 而这可能不是一个 bug, 所以需要加上隐式等待,提高了自动化的稳定性。
四、测试前准备工作
1.写好测试用例;
2.准备好测试数据;
3.创建测试环境:
(1)1. 创建一个 Maven 项目;
(2)导入自动化测试需要的相关依赖;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version> <!-- 替换为你需要的版本号 -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>25.0-jre</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
(3)创建包,管理自己后续要写的代码。
四、写自动化测试代码
1.工具类
(1)创建驱动对象, 提供给其他页面使用;
(2)创建隐式等待, 作用于软件测试的整个生命周期;
(3)创建截图保存的路径;
(4)提供屏幕截图的方法, 以及保存截图的格式。
public class AutoTestUtils {
public static EdgeDriver driver;
// 创建驱动对象
public static EdgeDriver getDriver() {
System.setProperty("webdriver.edge.driver", "msedgedriver.exe");
if(driver == null) {
driver = new EdgeDriver();
}
// 创建隐式等待,作用于driver的整个生命周期 (10秒)
//Duration.ofSeconds(10) 创建了一个持续时间对象,表示等待时间为10秒。然后,通过调用 toMillis() 方法,将持续时间转换为毫秒数。
// 最后,使用 TimeUnit.MILLISECONDS 将毫秒作为单位传递给 implicitlyWait() 方法。
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10).toMillis(), TimeUnit.MILLISECONDS);
return driver;
}
// 屏幕截图, 保存文件的格式
//获取当前时间,并将其格式化为指定的文件名和文件夹名
public List<String> getTime() {
// 文件夹按照天数的维度进行保存
// 文件格式 2023-4-3 20:07
SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");//年月日时分秒
SimpleDateFormat sim2 = new SimpleDateFormat("yyyy-MM-dd");//年月日
String filename = sim1.format(System.currentTimeMillis());//文件名
String dirname = sim2.format(System.currentTimeMillis());//文件夹名
// 创建一个包含文件夹名和文件名的列表
List<String> list = new ArrayList<>();
list.add(dirname);
list.add(filename);
return list;
}
// 屏幕截图的方法
public void getScreenShotAs(String str) throws IOException {
// 调用 getTime() 方法获取当前日期和时间的列表
List<String> list = getTime();
// 构建截图文件的路径
String filePath = "./src/test/java/com/example/student_manage_test/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";
// 获取页面截图并保存为文件
//OutputType.FILE 是一个枚举类型,表示捕获页面截图的输出类型为文件。
File srcFile = driver.getScreenshotAs(OutputType.FILE);
//从源文件复制到指定路径下
FileUtils.copyFile(srcFile, new File(filePath));
}
}
(5)释放驱动
@SpringBootTest
public class DriverQuitTest extends AutoTestUtils {
public static EdgeDriver driver;
//停止 WebDriver 的操作并释放相关资源
@Test
public void driverQuit() {
driver = getDriver();
driver.quit();
}
}
2.测试登录界面
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutoTestUtils {
public static EdgeDriver driver;
@BeforeAll
public static void baseController() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
/**
* 检查登录页面是否正常打开
* 检查登录页的登录,用户名,密码等字样是否出现
*/
@Test
@Order(1)
//标记方法在测试执行时的顺序
public void loginPageLoadRight() throws IOException {
// 查找登录页面标题元素的 CSS 选择器
driver.findElement(By.id("loginname"));
// 查找登录页面的第一个提示信息元素的 XPath
driver.findElement(By.id("password"));
// 查找登录页面的第二个提示信息元素的 XPath
driver.findElement(By.cssSelector("#submit"));
// 对当前页面进行截图
getScreenShotAs(getClass().getName());
}
/**
* 检查异常登录的情况 4 种情况
* (1)账号密码错误
* 账号密码错误, 会弹窗提示
*/
@ParameterizedTest
@CsvSource({"admin,345", "zhangsan,111", "lucy,111"})
@Order(2)
public void loginFail(String loginname, String password) throws InterruptedException, IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 登录步骤
driver.findElement(By.id("loginname")).sendKeys(loginname);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.cssSelector("#submit")).click();
// 检测登录失败的场景
// 切换到弹窗, 进行弹窗的处理(隐式等待不生效,不得不加入强制等待)
//等待时间
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("用户名或密码错误,请重试!"));
driver.switchTo().alert().accept();
//截图
getScreenShotAs(getClass().getName());
}
/**
* (2)未输入密码
*
* @param loginname 登录名
* @throws InterruptedException
*/
@ParameterizedTest
@ValueSource(strings = {"张三"})
@Order(3)
public void loginFail2(String loginname) throws InterruptedException, IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 登录步骤
driver.findElement(By.id("loginname")).sendKeys(loginname);
driver.findElement(By.cssSelector("#submit")).click();
// 检测登录失败的场景
// 切换到弹窗, 进行弹窗的处理
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("请先输入密码!"));
alert.accept();
getScreenShotAs(getClass().getName());
}
/**
* 未输入用户名
*
* @param password 密码
* @throws InterruptedException
*/
@ParameterizedTest
@ValueSource(strings = {"111"})
@Order(4)
public void loginFail3(String password) throws InterruptedException, IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 登录步骤
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.cssSelector("#submit")).click();
// 检测登录失败的场景
// 切换到弹窗, 进行弹窗的处理
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("请先输入用户名!"));
alert.accept();
getScreenShotAs(getClass().getName());
}
/**
* 账号,, 密码都没有输入
*
* @throws InterruptedException
*/
@Test
@Order(5)
public void loginFail4() throws InterruptedException, IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
driver.findElement(By.cssSelector("#submit")).click();
// 检测登录失败的场景
// 切换到弹窗, 进行弹窗的处理
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("请先输入用户名!"));
// 警告弹窗
alert.accept();
getScreenShotAs(getClass().getName());
}
/**
* 检查正常登录的情况
* 页面是否显示登录名, 密码, 提交字样
*/
//@ParameterizedTest指示一个测试方法是参数化测试方法,CsvSource指定参数化测试方法的参数来源为 CSV 格式的数据源。
@ParameterizedTest
@CsvSource({"admin,admin"})
@Order(6)
public void loginSuccess(String logianname, String password) throws IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 登录步骤
driver.findElement(By.id("loginname")).sendKeys(logianname);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.cssSelector("#submit")).click();
//等待时间
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("登录成功"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
// 一个用户测试完了,需要进行回退
driver.navigate().back();
}
}
3.测试学生列表界面
@SpringBootTest
public class ListTest extends AutoTestUtils {
public static EdgeDriver driver;
@BeforeAll
public static void baseController() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
/**
* 登录后学生列表列表页可以正常显示
*/
@Test
public void MyListPageLoadRight() throws IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 先登录
driver.findElement(By.id("loginname")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin");
driver.findElement(By.cssSelector("#submit")).click();
// 接收弹窗
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
// 使用适当的定位器(By)查询目标元素
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"info\"]/tr[1]"));
// 验证查询结果是否为空
assertTrue(elements.size() > 0);
getScreenShotAs(getClass().getName());
driver.navigate().back();
}
}
4.测试查询功能
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SelectTest extends AutoTestUtils {
@BeforeAll
public static void baseController() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
/**
* 查询学生通过姓名
*/
@Test
@Order(1)
public void selectByStuname() throws IOException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 先登录
driver.findElement(By.id("loginname")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin");
driver.findElement(By.cssSelector("#submit")).click();
// 接收弹窗
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
//传入参数
driver.findElement(By.id("ipt_name")).sendKeys("超级管理员");
driver.findElement(By.id("submit1")).click();
// 使用适当的定位器(By)查询目标元素
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"info\"]/tr/th[3]"));
// 验证查询结果是否为空
assertTrue(elements.size() > 0);
//截图
getScreenShotAs(getClass().getName());
}
/**
* 查询学生通过籍贯
*/
@Test
@Order(2)
public void selectByAddress() throws IOException {
driver.findElement(By.id("ipt_name")).clear();
driver.findElement(By.id("ipt_address")).clear();
driver.findElement(By.id("ipt_stunum")).clear();
//传入参数
driver.findElement(By.id("ipt_address")).sendKeys("北京");
driver.findElement(By.id("submit1")).click();
// 使用适当的定位器(By)查询目标元素
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"info\"]/tr[1]/th[6]"));
// 验证查询结果是否为空
assertTrue(elements.size() > 0);
//截图
getScreenShotAs(getClass().getName());
}
/**
* 查询学生通过学号
*/
@Test
@Order(3)
public void selectByStunum() throws IOException {
driver.findElement(By.id("ipt_name")).clear();
driver.findElement(By.id("ipt_address")).clear();
driver.findElement(By.id("ipt_stunum")).clear();
//传入参数
driver.findElement(By.id("ipt_stunum")).sendKeys("2002");
driver.findElement(By.id("submit1")).click();
// 使用适当的定位器(By)查询目标元素
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"info\"]/tr/th[8]"));
// 验证查询结果是否为空
assertTrue(elements.size() > 0);
//截图
getScreenShotAs(getClass().getName());
}
/**
* 查询学生通过姓名和籍贯
*/
@Test
@Order(4)
public void selectByStuname_Address() throws IOException {
driver.findElement(By.id("ipt_name")).clear();
driver.findElement(By.id("ipt_address")).clear();
driver.findElement(By.id("ipt_stunum")).clear();
//传入参数
driver.findElement(By.id("ipt_name")).sendKeys("超级管理员");
driver.findElement(By.id("ipt_address")).sendKeys("成都");
driver.findElement(By.id("submit1")).click();
// 使用适当的定位器(By)查询目标元素
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"info\"]/tr/th[3]"));
// 验证查询结果是否为空
assertTrue(elements.size() > 0);
//截图
getScreenShotAs(getClass().getName());
}
/**
* 查询学生通过姓名、籍贯和学号
*/
@Test
@Order(5)
public void selectByStuname_Address_Stunum() throws IOException {
driver.findElement(By.id("ipt_name")).clear();
driver.findElement(By.id("ipt_address")).clear();
driver.findElement(By.id("ipt_stunum")).clear();
//传入参数
driver.findElement(By.id("ipt_name")).sendKeys("超级管理员");
driver.findElement(By.id("ipt_address")).sendKeys("成都");
driver.findElement(By.id("ipt_stunum")).sendKeys("10000");
driver.findElement(By.id("submit1")).click();
// 使用适当的定位器(By)查询目标元素
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"info\"]/tr[1]/th[3]"));
// 验证查询结果是否为空
assertTrue(elements.size() > 0);
//截图
getScreenShotAs(getClass().getName());
driver.navigate().back();
}
}
5.测试添加功能
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AddTest extends AutoTestUtils {
@BeforeAll
public static void baseSetup() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
/**
* 添加用户成功测试
* @throws IOException
*/
@Order(1)
@ParameterizedTest
@CsvSource({"李四,李四,111,111,20,1873234890819,2007"})
public void addStudentSuccess(String loginname, String stuname, String password, String password2, int age,String phone,String stunum) throws IOException, InterruptedException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 先登录
driver.findElement(By.id("loginname")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin");
driver.findElement(By.cssSelector("#submit")).click();
// 接收弹窗
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
// 点击添加用户按钮
driver.findElement(By.id("add_student")).click();
driver.findElement(By.id("loginname")).sendKeys(loginname);
driver.findElement(By.id("stuname")).sendKeys(stuname);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.id("password2")).sendKeys(password2);
driver.findElement(By.id("age")).sendKeys(String.valueOf(age));
driver.findElement(By.id("phone")).sendKeys(phone);
driver.findElement(By.id("stunum")).sendKeys(stunum);
driver.findElement(By.id("btn_sub")).click();
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("添加成功"));
driver.switchTo().alert().accept();
driver.switchTo().alert().dismiss();
getScreenShotAs(getClass().getName());
}
/**
* 添加用户失败测试-登录名重复
* @throws IOException
*/
@Order(2)
@ParameterizedTest
@CsvSource({"超级管理员,张三,111,111,20,2011"})
public void addStudentFail1(String loginname, String stuname, String password, String password2, int age, String stunum) throws IOException, InterruptedException {
// 点击添加用户按钮
driver.findElement(By.id("add_student")).click();
// 检查添加页面是否打开
driver.findElement(By.id("loginname")).sendKeys(loginname);
driver.findElement(By.id("stuname")).sendKeys(stuname);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.id("password2")).sendKeys(password2);
driver.findElement(By.id("age")).sendKeys(String.valueOf(age));
driver.findElement(By.id("stunum")).sendKeys(stuname);
driver.findElement(By.id("btn_sub")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("添加失败,请重试"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
}
/**
* 添加用户失败测试-学号重复
* @throws IOException
*/
@Order(3)
@ParameterizedTest
@CsvSource({"小黑,小黑,111,111,20,10000"})
public void addStudentFail2(String loginname, String stuname, String password, String password2, int age, String stunum) throws IOException, InterruptedException {
// 点击添加用户按钮
driver.findElement(By.id("add_student")).click();
// 检查添加页面是否打开
driver.findElement(By.id("loginname")).sendKeys(loginname);
driver.findElement(By.id("stuname")).sendKeys(stuname);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.id("password2")).sendKeys(password2);
driver.findElement(By.id("age")).sendKeys(String.valueOf(age));
driver.findElement(By.id("stunum")).sendKeys(stunum);
driver.findElement(By.id("btn_sub")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("添加失败,请重试"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
driver.navigate().back();
driver.navigate().back();
}
}
6.测试修改功能
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class UpdateTest extends AutoTestUtils {
@BeforeAll
public static void baseSetup() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
/**
* 更新用户成功测试--1.修改姓名
* @throws IOException
*/
@Order(1)
@ParameterizedTest
@CsvSource({"小红"})
public void UpdateStudentSuccess1(String stuname ) throws IOException, InterruptedException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 先登录
driver.findElement(By.id("loginname")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin");
driver.findElement(By.cssSelector("#submit")).click();
// 接收弹窗
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
// 找到要修改的行
WebElement row = driver.findElement(By.xpath("//*[@id=\"info\"]/tr[3]"));
// 找到修改按钮元素
WebElement deleteButton = row.findElement(By.xpath("//*[@id=\"info\"]/tr[3]/th[10]/a[1]"));
// 点击修改按钮
deleteButton.click();
driver.findElement(By.id("stuname")).clear();
driver.findElement(By.id("stuname")).sendKeys(stuname);
driver.findElement(By.id("btn_sub")).click();
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("修改成功"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
}
/**
* 更新用户成功测试--2.修改密码
* @throws IOException
*/
@Order(2)
@ParameterizedTest
@CsvSource({"111,111"})
public void UpdateStudentSuccess2(String password,String password2 ) throws IOException, InterruptedException {
// 找到要修改的行
WebElement row = driver.findElement(By.xpath("//*[@id=\"info\"]/tr[3]"));
// 找到修改按钮元素
WebElement deleteButton = row.findElement(By.xpath("//*[@id=\"info\"]/tr[3]/th[10]/a[1]"));
// 点击修改按钮
deleteButton.click();
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.id("password2")).sendKeys(password2);
driver.findElement(By.id("btn_sub")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("修改成功"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
}
/**
* 更新用户失败测试--1.未输姓名
* @throws IOException
*/
@Test
@Order(3)
public void UpdateStudentFail() throws IOException, InterruptedException {
// 找到要修改的行
WebElement row = driver.findElement(By.xpath("//*[@id=\"info\"]/tr[3]"));
// 找到修改按钮元素
WebElement deleteButton = row.findElement(By.xpath("//*[@id=\"info\"]/tr[3]/th[10]/a[1]"));
// 点击修改按钮
deleteButton.click();
driver.findElement(By.id("stuname")).clear();
driver.findElement(By.id("btn_sub")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
assertTrue(alertText.contains("请先输入"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
}
//更新用户失败测试--2.登录名和学号是唯一的,在写代码时这两个值不能改,所以不用测试
}
7.测试删除功能
(1)删除单条
@SpringBootTest
public class DeleteOneTest extends AutoTestUtils {
@BeforeAll
public static void baseSetup() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
/**
* 删除单个用户测试
* @throws IOException
*/
@Test
public void deleteStudentOne() throws IOException, InterruptedException {
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 先登录
driver.findElement(By.id("loginname")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin");
driver.findElement(By.cssSelector("#submit")).click();
// 接收弹窗
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
// 随便找一行删除
// 找到要删除的行
WebElement row = driver.findElement(By.xpath("//*[@id=\"info\"]/tr[3]"));
// 找到删除按钮元素
WebElement deleteButton = row.findElement(By.xpath("//*[@id=\"info\"]/tr[3]/th[10]/a[2]"));
// 点击删除按钮
deleteButton.click();
//处理确认删除的弹框
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
//处理删除成功的弹窗
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("删除成功!"));
driver.switchTo().alert().accept();
getScreenShotAs(getClass().getName());
}
}
(2)删除选中
public class DeleteMoreTest extends AutoTestUtils {
@BeforeAll
public static void baseSetup() {
driver = getDriver();
driver.get("http://82.156.151.156:8080/login.html");
}
@Test
public void deleteMoreStudent(){
// 登录之前先清空用户名和密码
driver.findElement(By.id("loginname")).clear();
driver.findElement(By.id("password")).clear();
// 先登录
driver.findElement(By.id("loginname")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin");
driver.findElement(By.cssSelector("#submit")).click();
// 接收弹窗
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
// 找到要删除的行
WebElement row1 = driver.findElement(By.xpath("//*[@id=\"info\"]/tr[2]"));
// 找到这行选中框
WebElement deleteButton1= row1.findElement(By.xpath("//*[@id=\"info\"]/tr[2]/th[1]"));
// 点击删除按钮
deleteButton1.click();
// 找到要删除的行
WebElement row2 = driver.findElement(By.xpath("//*[@id=\"info\"]/tr[3]"));
// 找到这行选中框
WebElement deleteButton2 = row2.findElement(By.xpath("//*[@id=\"info\"]/tr[3]/th[1]"));
// 点击删除按钮
deleteButton2.click();
driver.findElement(By.xpath("//*[@id=\"delete\"]")).click(); // 点击批量删除按钮
//处理确认删除的弹框
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
//处理删除成功的弹窗
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// 获取提示框的文本
String alertText = driver.switchTo().alert().getText();
// 验证文本是否包含了"添加成功"
assertTrue(alertText.contains("选中删除成功!"));
driver.switchTo().alert().accept();
}
}
8.测试套件
//测试登录、列表页、查询功能、添加功能、修改功能、删除单条和删除选中功能
@Suite
@SelectClasses({LoginTest.class, ListTest.class, SelectTest.class, AddTest.class, UpdateTest.class,
DeleteOneTest.class, DeleteMoreTest.class,DriverQuitTest.class })
public class RunSuite1 {
}
五、测试结果
(1)测试通过率
(2)测试截图