自动化实战 - 测试个人博客系统


前言

本篇使用Selenium3+Junit5对个人博客进行自动化测试,如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
    • 一.web自动化测试用例
    • 二.测试准备
      • 1.注册界面自动化测试
        • 测试过程中遇到的Bug:
      • 2.登录界面自动化测试
        • 登录测试的过程中的Bug:
      • 3.个人博客管理页自动化测试
        • 测试个人博客管理页的Bug
      • 4.博客编辑页自动化测试
        • 博客编辑页出现的Bug
      • 5.总博客列表页自动化测试
      • 6.测试套件 - RunSuiteTest
    • 三、小结
    • 参考代码
  • 总结


本文开始

一.web自动化测试用例

描述:针对个人博客项目,主要测试五个页面:注册页,登录页,个人博客管理页,编辑页,总博客列表页,对其主要功能,注册,登录,编辑,查看,删除,注销等常用功能进行自动化测试;

根据博客系统,设计部分手工测试用例:

在这里插入图片描述

二.测试准备

1.创建Maven项目
2.添加相应的依赖

  • 根据编写的测试用例,对每个页面进行测试,测试每个页面的主要功能
  • 添加公共类
 <dependencies><!--添加selenium依赖--><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!--保存屏幕截图的包--><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><!--Junit5--><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency></dependencies>

公共管理类

public class AutoTestUtils {//每次测试都需要驱动,写一个公共类,实现代码复用public static WebDriver webDriver;@BeforeAllpublic static void SetUp() {if(webDriver == null) {System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");webDriver = new ChromeDriver();}}@AfterAllstatic void TearDown() {webDriver.quit();}
}

对主要测试重点功能,进行自动化测试

1.注册界面自动化测试

  • 注册界面测试 - RegTest
    1.获取驱动,打开注册界面
    2.校验界面是否完整 - 测试是否有注册提交按钮
    3.校验注册正常操作
    4.校验注册失败操作
    5.指定注册测试的顺序,保证注册测试的正常
测试过程中遇到的Bug:
  • 获取弹窗内容必须在弹窗还没有关闭的状态执行,如果弹窗关闭,在去获取弹窗text内容,会包No such alert错误;
  • 在注册过程中,如果数据库中注册信息重复了,但没有弹窗提示,在获取alert()弹窗是也会报No such alert错误;

注册测试代码:

package webAutoTest.TestClass;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
import webAutoTest.common.AutoTestUtils;import java.util.concurrent.TimeUnit;
import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegTest extends AutoTestUtils {/*** 测试注册页面的完整性* 测试注册页面使用XPath获取元素位置 - 需要使用By.xpath()获取,如果使用Css选择器回找不到选择器而报错*/@Order(1)@Testvoid regPageTest() {//1.打开注册页webDriver.get("http://localhost:8080/reg.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//2.校验注册框是否存在String reg_title = webDriver.findElement(By.xpath("/html/body/div[2]/div/h3")).getText();Assertions.assertEquals("注册", reg_title);//3.注册提交按钮是否存在webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);WebElement webElement = webDriver.findElement(By.xpath("//*[@id=\"submit\"]"));Assertions.assertNotNull(webElement);}/*** 测试注册正常操作* 数据库中已有注册账号 - 不会有弹窗提示,操作报错*/@Order(2)@ParameterizedTest@CsvSource({"李四,abc,abc"})void regSuccessTest(String username, String password1, String password2) throws InterruptedException {
//        webDriver.get("http://localhost:8080/reg.html");webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);//1.清空之前注册操作webDriver.findElement(By.xpath("//*[@id=\"username\"]")).clear();webDriver.findElement(By.xpath("//*[@id=\"password\"]")).clear();webDriver.findElement(By.xpath("//*[@id=\"password2\"]")).clear();webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);//2.输入注册账号,密码,确认密码webDriver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys(username);webDriver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password1);webDriver.findElement(By.xpath("//*[@id=\"password2\"]")).sendKeys(password2);//3.点击提交按钮,提交webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);webDriver.findElement(By.xpath("//*[@id=\"submit\"]")).click();//4.显示注册成功弹窗,确认弹窗sleep(1000); //为了测试看清测试过程,也为了让页面不用渲染太快,导致找不到弹窗报错Alert alert = webDriver.switchTo().alert();webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);alert.accept();//5.校验是否注册后跳转到登录页面:sleep(500);String currentUrl = webDriver.getCurrentUrl();Assertions.assertEquals("http://localhost:8080/login.html",currentUrl);//5.再回退到注册页,方便后面的测试webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.navigate().back();}/*** 测试登录失败* @param username* @param password1* @param password2* 获取弹窗内容必须在弹窗还没有关闭的状态执行,如果弹窗关闭,在去获取弹窗text内容,会包No such alert错误;*/@Order(3)@ParameterizedTest@CsvSource({"老六,123,1234"})void regFailTest(String username, String password1, String password2) throws InterruptedException {//1.打开注册页面webDriver.get("http://localhost:8080/reg.html");//2.清空注册框webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.findElement(By.xpath("//*[@id=\"username\"]")).clear();webDriver.findElement(By.xpath("//*[@id=\"password\"]")).clear();webDriver.findElement(By.xpath("//*[@id=\"password2\"]")).clear();//3.输入密码,判断输入密码两次是否一样webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys(username);webDriver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password1);webDriver.findElement(By.xpath("//*[@id=\"password2\"]")).sendKeys(password2);webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.findElement(By.xpath("//*[@id=\"submit\"]")).click();//4.出现弹窗提示,点击确认Alert alert = webDriver.switchTo().alert();webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);Assertions.assertEquals("两次密码不一致!",alert.getText());String info = alert.getText();System.out.println(info);alert.accept();}
}

测试结果界面:

在这里插入图片描述

2.登录界面自动化测试

  • 登录界面自动化测试 - LoginTest
    1.获取驱动,打开登录界面
    2.校验界面是否正常 - 测试是否有登录提交按钮
    3.校验正常登录 - 多参数测试,多个测试用例
    4.校验异常登录 - 错误的密码登录
    5.对于多组测试,需要情况上次输入的内容
    6.使用注解保证测试的顺序
登录测试的过程中的Bug:
  • 设置强制等待,不设置页面会因为渲染过快,alert弹窗还没有弹出,就断言判断页面的url,从而造成错误;
  • 对于多组参数的数据,下一组测试前需要清空上一组测试的数据
  • 测试登录成功后显示个人列表页面,对比成功后页面的url,对于多组测试数据需要回退,不然会断言错误;
package webAutoTest.TestClass;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutoTestUtils;import org.openqa.selenium.support.ui.WebDriverWait;import static java.lang.Thread.sleep;
import static java.time.Duration.ofSeconds;
import java.time.Duration;
import java.util.concurrent.TimeUnit;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutoTestUtils {/*** 测试登录页面是否正常显示*/@Order(1)@Testvoid loginPageTest() {webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//1.打开登录页面,看页面是否正常webDriver.get("http://localhost:8080/login.html");//2.登录标题是否存在webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String login_title = webDriver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText();Assertions.assertEquals("登录",login_title);//3.登录提交按钮是否存在webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);WebElement webElement = webDriver.findElement(By.cssSelector("#submit"));Assertions.assertNotNull(webElement);}/*** 登录成功* @param username* @param password* @throws InterruptedException*/@Order(2)@ParameterizedTest@CsvSource({"张三,123","王五,123"})void loginSuccessTest(String username,String password) throws InterruptedException {webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//1.清理之前的账号,密码 - 多账户登录webDriver.findElement(By.cssSelector("#username")).clear();webDriver.findElement(By.cssSelector("#password")).clear();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//2.找到输入框,输入账号,密码webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);//3.点击提交按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#submit")).click();//4.验证个人列表url,看是否登录成功sleep(200);String currentUrl = webDriver.getCurrentUrl();Assertions.assertEquals("http://localhost:8080/myblog_list.html",currentUrl);//5.为测试多次登录,需要回退到登录页webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.navigate().back();}/*** 登录失败* @param username* @param password* @param list_url* @throws InterruptedException*/@Order(3)@Disabled@ParameterizedTest@CsvFileSource(resources = "LoginFail.csv")void LoginFail(String username, String password, String list_url) throws InterruptedException {//1.打开博客登录页webDriver.get("http://localhost:8080/login.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//2.输入账号:张三, 密码:1234webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//3.点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//4.出现弹窗提示用户或密码错误,点击弹窗确认Alert alert = webDriver.switchTo().alert();System.out.println(alert.getText());webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);//设置等待时间过短,会报错,页面渲染过快,弹窗捕捉不到,导致错误alert.accept();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//5.确认当前是登录页webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String currentUrl = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertNotEquals(list_url,currentUrl);}}

测试结果:

在这里插入图片描述

3.个人博客管理页自动化测试

  • 个人文章列表页自动化测试 - BlogListTest
    1.处于登录状态
    2.校验个人博客管理页是否正常
    3.校验查看博客按钮,编辑博客按钮,删除博客按钮
    4.测试未登录状态,直接跳转登录页
测试个人博客管理页的Bug
  • 必须在登录状态才能看到,个人博客列表
package webAutoTest.TestClass;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import webAutoTest.common.AutoTestUtils;import java.util.Queue;
import java.util.concurrent.TimeUnit;
import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListTest extends AutoTestUtils {/*** 测试个人博客管理页面是否完整*/@Order(1)@ParameterizedTest@CsvSource({"张三,123"})void blogListPageTest(String username, String password) throws InterruptedException {//1.登录webDriver.get("http://localhost:8080/login.html");webDriver.findElement(By.cssSelector("#username")).clear();webDriver.findElement(By.cssSelector("#password")).clear();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到输入框,输入账号,密码webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);//点击提交按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);sleep(500);//2.测试个人博客管理页面标题String title = webDriver.getTitle();System.out.println(title);Assertions.assertEquals("个人博客列表管理页",title);//3.查看全文按钮,修改按钮,删除按钮是否正常webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);WebElement check_button = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(4)"));WebElement update_button = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(5)"));WebElement delete_button = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)"));Assertions.assertNotNull(check_button);Assertions.assertNotNull(update_button);Assertions.assertNotNull(delete_button);}/*** 测试个人博客管理页的* 查看按钮,编辑按钮,删除按钮*/@Order(2)@Testvoid blogListTest() {webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);//1.校验查看全文,点击按钮,进入文章详情页webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(4)")).click();//2.校验是否到文章详细页urlString content_url = webDriver.getCurrentUrl();String expect_url = "http://localhost:8080/blog_content.html";if(content_url.contains(expect_url)) {System.out.println("查看按钮测试通过!");}else {System.out.println("查看按钮测试不通过!");}webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.navigate().back();//2.校验修改文章按钮,点击按钮,进入编辑页webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(5)")).click();//3.校验是否是编辑页的urlString edit_url = webDriver.getCurrentUrl();String expect_url2 = "http://localhost:8080/blog_edit.html";if(edit_url.contains(expect_url2)) {System.out.println("编辑按钮测试通过!");}else {System.out.println("编辑按钮不通过!");}webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.navigate().back();//4.校验删除按钮,点击按钮,删除文章webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();//5.弹窗显示删除成功,点击确认webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);Alert alert = webDriver.switchTo().alert();System.out.println(alert.getText());alert.accept();//6.校验此时第一篇标题webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);String title_text = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();Assertions.assertNotEquals("java",title_text);}/*** 测试未登录状态,博客管理页*/@Disabled // 设置无效,不随整体执行,作为单个测试样例@Testvoid unLoginBlogList() {webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);//1.直接进入个人博客管理页webDriver.get("http://localhost:8080/myblog_list.html");//2.弹窗显示,登录之后再查看Alert alert = webDriver.switchTo().alert();System.out.println(alert.getText());alert.accept();//3.校验是否回到登录页webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);String login_url = webDriver.getCurrentUrl();Assertions.assertEquals("http://localhost:8080/login.html",login_url);}}

测试结果:

在这里插入图片描述

4.博客编辑页自动化测试

  • 博客编辑页自动化测试 - BlogEditTest
    1.校验编辑页面的完整性 - 发布按钮是否存在
    2.校验发布成功后,是否能跳转到个人列表管理页
博客编辑页出现的Bug
  • 获取文章标题,使用getText()获取文本,可能获取不到,获取到空字符串,造成断言失败,可以使用getTitle();
package webAutoTest.TestClass;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import webAutoTest.common.AutoTestUtils;import java.util.concurrent.TimeUnit;import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest extends AutoTestUtils {/*** 测试编辑页的完整性*/@Order(1)@ParameterizedTest@CsvSource("张三,123")void blogEditPageTest(String username, String password) throws InterruptedException {//1.登录webDriver.get("http://localhost:8080/login.html");webDriver.findElement(By.cssSelector("#username")).clear();webDriver.findElement(By.cssSelector("#password")).clear();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到输入框,输入账号,密码webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);//点击提交按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#submit")).click();sleep(500);//2.点击写博客webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();//3.当前是否到博客编辑页webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String edit_url = webDriver.getCurrentUrl();Assertions.assertEquals("http://localhost:8080/blog_add.html",edit_url);//4.校验发布文章按钮是否存在WebElement webElement = webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));Assertions.assertNotNull(webElement);}/*** 测试文章发布,发布后是否成功跳转* @throws InterruptedException*/@Order(2)@Testvoid blogEditTest() throws InterruptedException {webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);//1.输入标题webDriver.findElement(By.cssSelector("#title")).sendKeys("测试实战2");//2.输入正文 - 第三方插件,不能使用sendkeywebDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll")).click();//3.点击发布按钮webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();//4.发布成功,出现弹窗,显示是否继续发布,点击取消sleep(500);Alert alert = webDriver.switchTo().alert();webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);System.out.println(alert.getText());alert.dismiss();//5.校验跳转页面,到个人博客列表管理页webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);String currentUrl = webDriver.getCurrentUrl();Assertions.assertEquals("http://localhost:8080/myblog_list.html",currentUrl);//6.校验发布的文章的标题String text = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();Assertions.assertEquals("测试实战2",text);}
}

测试结果:

在这里插入图片描述

5.总博客列表页自动化测试

  • 总博客列表页自动化测试 - TotalBlogListTest
    1.校验总博客列表页完整 - 首页,上一页,下一页,末页按钮存在
    2.校验在第一页点击首页,处理弹窗
    3.校验在最后一页,点击末页,处理弹窗
    4.未登录,查看总博客列表页功能正常
package webAutoTest.TestClass;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import webAutoTest.common.AutoTestUtils;import java.util.concurrent.TimeUnit;import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class TotalBlogListTest extends AutoTestUtils {/*** 测试总博客列表页是否正常* 校验首页,上一页,下一页,末页*/@Order(1)@ParameterizedTest@CsvSource({"张三,123"})void totalPageTest(String username,String password) throws InterruptedException {//1.登录webDriver.get("http://localhost:8080/login.html");webDriver.findElement(By.cssSelector("#username")).clear();webDriver.findElement(By.cssSelector("#password")).clear();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到输入框,输入账号,密码webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);//点击提交按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);sleep(200);//2.点击主页webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);//2.校验总列表页是否正常,校验首页,上一页,下一页,末页WebElement first_button = webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));WebElement prev_page_button = webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(2)"));WebElement next_page_button = webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(3)"));WebElement last_button = webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)"));Assertions.assertNotNull(first_button);Assertions.assertNotNull(prev_page_button);Assertions.assertNotNull(next_page_button);Assertions.assertNotNull(last_button);}@Order(2)@Testvoid totalBlogListTest() throws InterruptedException {//1.点击首页webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)")).click();//2.出现弹窗,显示已在首页,点击确认sleep(200);Alert alert = webDriver.switchTo().alert();System.out.println(alert.getText());alert.accept();//3.点击下一页,校验urlwebDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(3)")).click();String currentUrl = webDriver.getCurrentUrl();char intdex = currentUrl.charAt(currentUrl.length() - 1);Assertions.assertEquals("2",intdex+"");//4.点击两次末页,校验webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click();webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click();sleep(200);Alert alert1 = webDriver.switchTo().alert();System.out.println(alert1.getText());alert1.accept();//5.点击查看全文,可以跳转到文章详情页webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#artListDiv > div > a")).click();String content_url = webDriver.getCurrentUrl();if(content_url.contains("http://localhost:8080/blog_content.html")) {System.out.println("查看文章按钮通过!");}else {System.out.println("查看文章按钮失败!");}}/*** 未登录,查看总博客列表页* @throws InterruptedException*/@Disabled@Order(3)@Testvoid unLoginTotalBlogListTest() {//1.获取总博客列表页webDriver.get("http://localhost:8080/blog_list.html");//2.文章列表中第一篇文章显示正常String content_title = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();Assertions.assertEquals("测试实战2",content_title);//利用断言验证//3.点击文章,可以查看文章详情webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a")).click();String content_url = webDriver.getCurrentUrl();//4.校验文章详情页urlif(content_url.contains("http://localhost:8080/blog_content.html")) {System.out.println("查看文章按钮通过!");}else {System.out.println("查看文章按钮失败!");}}
}

测试结果:

在这里插入图片描述
未登录查看总博客列表页在这里插入图片描述

6.测试套件 - RunSuiteTest

  • 测试套件 - RunSuiteTest
    • 通过套件,以测试类运行,也可写多个测试类,会按照顺序执行
package webAutoTest.TestClass;import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;@Suite
@SelectClasses({LoginTest.class})
public class RunSuiteTest {
}

测试结果:

在这里插入图片描述

三、小结

注意:

  • 需要注意测试的执行顺序,不关注可能报错
  • 对于多参数测试,需要清空上次输入数据,页面回退
  • 使用@SelectClasses的参数指定执行类的顺序
  • 测试用例并不是越多越好,覆盖较多功能较好
  • 测试功能会有遗漏的情况,对于测试用例执行顺序会有错误情况;

测试优势:
1.使用Junit5单元测试框架中的注释:提高测试的稳定性,提高自动化执行效率;(指定执行测试顺序,指定参数)
2.根据个人博客设计的手工测试用例,对每个测试用例的常用功能实现自动化测试
3.使用工具类每次测试都需要驱动,写一个公共类,实现代码复用
4.使用测试套件,降低测试人员的工作量
5.使用等待:提高自动化运行效率,提高自动化的稳定性,减小误报的可能性

参考代码

点击查看,自动化测试源代码


总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/185820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云备份|| 日志 day5】文件热点管理模块

云备份day5 热点管理模块 热点管理模块 服务器端的热点文件管理是对上传的非热点文件进行压缩存储&#xff0c;节省磁盘空间。 而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内&#xff0c;比如如果一个文件一天都没有被访问过我们就认为这是一个非…

采集Prestashop独立站

这是一个用Lua编写的爬虫程序&#xff0c;用于采集Prestashop独立站的内容。爬虫程序使用代理信息&#xff1a;proxy_host: jshk.com.cn。 -- 首先&#xff0c;我们需要导入所需的库 local http require(socket.http) local url require(socket.url)-- 然后&#xff0c;我们…

jenkins原理篇——成员权限管理

大家好&#xff0c;我是蓝胖子&#xff0c;前面几节我讲述了jenkins的语法以及我是如何使用jenkins对测试和正式环境进行发布的。但正式环境使用jenkins还有一点很重要&#xff0c;那就是权限管理。正式环境的权限往往不能对所有人开放&#xff0c;以及要做到每次发布都是谁在操…

Android T窗口动画显示和退出流程(更新中)

序 如何创建一个窗口动画&#xff1f;我们通过先从APP创建一个窗口&#xff0c;以这个窗口的创建过程的窗口动画为例 这个demo就是点击BUTTON显示窗口&#xff0c;点击CLOSE WINDOW关闭窗口&#xff0c;下面简述关键代码 //定义WindowManager和LayoutParams private Window…

官方Redis视图化工具Redisinsight

一、下载最新版本的 docker pull redislabs/redisinsight mkdir /data/redisinsight docker run -d -u root -p 8001:8001 -v /etc/localtime:/etc/localtime -v /data/redisinsight:/db --restartunless-stopped redislabs/redisinsight:latest 二、浏览器打开 http://192…

网际报文协议ICMP及ICMP重定向实例详解

目录 1、ICMP的概念 2、ICMP重定向 3、利用ICMP重定向进行攻击的原理 4、如何禁止ICMP重定向功能&#xff1f; 4.1、在Linux系统中禁用 4.2、在Windows系统中禁用 5、关于ICMP重定向的问题实例 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xf…

Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集

Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集 前言前提条件相关介绍实验环境按类别和比例从Labelme数据集中划分出训练数据集和测试数据集代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#x…

六大排序算法:插入、选择、冒泡、快排、希尔、归并

1、插入排序 解析&#xff1a;第一个元素设定为已经排好序&#xff0c;依次选择后续的元素插入到已经排好序的组内进行排序。 图示&#xff1a; 代码&#xff1a; public static void insertionSort(int[] arr) {int n arr.length;for (int i 1; i < n; i) {int key a…

虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力

一、故障现象 一辆2017款路虎发现车&#xff0c;搭载3.0L发动机&#xff0c;累计行驶里程约为3.8万km。车主反映&#xff0c;车辆在行驶过程中突然出现发动机抖动且加速无力的现象&#xff0c;于是请求拖车救援。 二、故障诊断 拖车到店后首先试车&#xff0c;发动机怠速轻微抖…

支持C#的开源免费、新手友好的数据结构与算法入门教程 - Hello算法

前言 前段时间完成了C#经典十大排序算法&#xff08;完结&#xff09;然后有很多小伙伴问想要系统化的学习数据结构和算法&#xff0c;不知道该怎么入门&#xff0c;有无好的教程推荐的。今天给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程&#xff1a;He…

什么是观察者模式?用 Python 如何实现 Observer(观察者或发布订阅)对象行为型模式?

什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;其相关依赖对象都会得到通知并自动更新。 在观察者模式中&am…

实现前后端分离开发:构建现代化Web应用

文章目录 什么是前后端分离开发&#xff1f;为什么要采用前后端分离开发&#xff1f;前后端分离的最佳实践1. 定义API2. 使用RESTful风格3. 选择适当的前端框架4. 选择合适的后端技术5. 数据交互格式6. 前端路由7. 自动化构建和部署8. 跨域问题 示例&#xff1a;前后端分离开发…

多元高斯分布

下面我们来看一下多元高斯分布&#xff0c;叫做 multivariative 高斯分布&#xff0c;也就是目前的情况是向量的形式&#xff0c;也就是说我的 x 它是一个向量&#xff0c;那这个情况下我们的高斯分布应该怎么去表示&#xff1f;我们这里面重点还是来看一下它的一个表示的方法&…

高速信号PCB布局怎么布?(电子硬件)

对于高速信号&#xff0c;pcb的设计要求会更多&#xff0c;因为高速信号很容易收到其他外在因素的干扰&#xff0c;导致实际设计出来的东西和原本预期的效果相差很多。 所以在高速信号pcb设计中&#xff0c;需要提前考虑好整体的布局布线&#xff0c;良好的布局可以很好的决定布…

Python爬虫-获取汽车之家车家号

前言 本文是该专栏的第9篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly9jaGVqaWFoYW8uYXV0b2hvbWUuY29tLmNuL0F1dGhvcnMjcHZhcmVhaWQ9MjgwODEwNA== 需求:获取汽车之家车家号数据 笔者将在正文中介绍详细的思路以及采集方法,废话不多说,跟着笔者直接往…

MySQL中表格的自我复制,与复制表格

先创建一个空表&#xff0c;my_tab01 CREATE TABLE my_tab01(id INT ,name VARCHAR(32),sal DOUBLE,job VARCHAR(32),deptno INT); SELECT * FROM my_tab01;准备一张有数据的表格&#xff1a; 将另一张表格的数据插入到my_tab01的表格中&#xff1a; -- 演示如何自我复制 --…

Python进行数据可视化,探索和发现数据中的模式和趋势。

文章目录 前言第一步&#xff1a;导入必要的库第二步&#xff1a;加载数据第三步&#xff1a;创建基本图表第四步&#xff1a;添加更多细节第五步&#xff1a;使用Seaborn库创建更复杂的图表关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyth…

算法通过村第十八关-回溯|白银笔记|经典问题

文章目录 前言组合总和问题分割回文串子集问题排序问题字母大小写全排列单词搜索总结 前言 提示&#xff1a;我不愿再给你写信了。因为我终于感到&#xff0c;我们的全部通信知识一个大大的幻影&#xff0c;我们每个人知识再给自己写信。 --安德烈纪德 回溯主要解决一些暴力枚举…

5-爬虫-打码平台、打码平台自动登录打码平台、selenium爬取京东商品信息、scrapy介绍安装、scrapy目录结构

1 打码平台 1.1 案例 2 打码平台自动登录打码平台 3 selenium爬取京东商品信息 4 scrapy介绍安装 5 scrapy目录结构 1 打码平台 # 1 登录某些网站&#xff0c;会有验证码---》想自动破解-数字字母&#xff1a;python模块&#xff1a;ddddocr-计算题&#xff0c;成语题&#xf…

在现实生活中传感器GV-H130/GV-21的使用

今天&#xff0c;收获了传感器GV-H130/GV-21&#xff0c;调试探头的用法&#xff0c;下面就来看看吧&#xff01;如有不妥欢迎指正&#xff01;&#xff01;&#xff01;&#xff01; 目录 传感器GV-H130/GV-21外观 传感器调试探头 探头与必要准备工作 传感器数值更改调试 …