学生信息管理系统自动化测试
项目地址:
http://82.156.151.156:8080/login.html
一、系统测试用例
二、测试实现过程
先是根据自己的项目设计了一个 UI 自动化测试用例, 然后根据这个测试用例使用了 selenium4自动化测试工具和 JUnit5单元测试框架结合实现的 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:07SimpleDateFormat 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 的操作并释放相关资源@Testpublic void driverQuit() {driver = getDriver();driver.quit();}
}
2.测试登录界面
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutoTestUtils {public static EdgeDriver driver;@BeforeAllpublic 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"));// 查找登录页面的第一个提示信息元素的 XPathdriver.findElement(By.id("password"));// 查找登录页面的第二个提示信息元素的 XPathdriver.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;@BeforeAllpublic static void baseController() {driver = getDriver();driver.get("http://82.156.151.156:8080/login.html");}/*** 登录后学生列表列表页可以正常显示*/@Testpublic 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 {@BeforeAllpublic 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 {@BeforeAllpublic 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 {@BeforeAllpublic 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 {@BeforeAllpublic static void baseSetup() {driver = getDriver();driver.get("http://82.156.151.156:8080/login.html");}/*** 删除单个用户测试* @throws IOException*/@Testpublic 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 {@BeforeAllpublic static void baseSetup() {driver = getDriver();driver.get("http://82.156.151.156:8080/login.html");}@Testpublic 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)测试截图