基于Spring前后端分离版本的论坛系统-自动化测试

news2025/7/12 12:54:56

目录

前言

一、测试环境

二、环境部署

三、测试用例

四、执行测试

4.1、公共类设计

创建浏览器驱动对象

测试套件

释放驱动类

4.2、功能测试

注册页面

登录页面

版块

 帖子

用户个人中心页

站内信

4.3、界面测试

注册页面

登录页面

版块

帖子

用户个人中心页

站内信


前言

        个人论坛系统是一种在线社交平台,为用户提供了丰富的功能,让他们能够轻松地创建帖子、分享信息、讨论话题以及互动交流。

        在开发阶段,实时进行了单元测试,所以本文章主要进行自动化测试(功能、界面),分为设计测试用例和进行测试两方面。

一、测试环境

操作系统:Window11专业版

项目运行环境:IntelliJ IDEA 2022.3.3、JDK1.8、MySQL5.7

浏览器:Chrome、Microsoft Edge

浏览器驱动:ChromeDriver、EdgeDriver

web自动化测试工具:selenium4

单元测试框架:Junit5

测试技术:主要进行功能与界面方面的自动化测试

二、环境部署

在pom.xml中部署

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.0</version>
            <scope>test</scope>
        <dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>4.10.0</version>
		</dependency>
		<!--保存屏幕截图文件所要用到的包        -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.4</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>

三、测试用例

​​​​​​​

四、执行测试

4.1、公共类设计

创建浏览器驱动对象

为了避免在每次测试时都重复创建浏览器驱动对象,浪费资源和时间,我们可以考虑创建一个公共类来统一管理浏览器驱动对象的创建。

public class AutotestUtils {

    public static ChromeDriver chromeDriver;

    public static EdgeDriver edgeDriver;

    //创建驱动对象
    public static ChromeDriver createChromeDriver(){
        //驱动创建好了/没有创建
        if (chromeDriver==null){
            ChromeOptions options=new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            chromeDriver=new ChromeDriver(options);
            //隐式等待
            Duration duration=Duration.ofSeconds(10);
            long millis= duration.toMillis();
            chromeDriver.manage().timeouts().implicitlyWait(millis, TimeUnit.MILLISECONDS);
        }
        return chromeDriver;
    }

    public static EdgeDriver createEdgeDriver(){
        //驱动创建好了/没有创建
        if (edgeDriver==null){
            EdgeOptions options=new EdgeOptions();
            options.addArguments("--remote-allow-origins=*");
            edgeDriver=new EdgeDriver(options);
            //隐式等待
            Duration duration=Duration.ofSeconds(10);
            long millis= duration.toMillis();
            edgeDriver.manage().timeouts().implicitlyWait(millis,TimeUnit.MILLISECONDS);
        }
        return edgeDriver;
    }
}

测试套件

使用suite测试套件来进行测试,指定类来运行用例

@Suite
@SelectClasses({driverQuitTest.class})
public class runSuite {
}

释放驱动类

单独写一个释放驱动类

public class driverQuitTest extends AutotestUtils {
    
    public static ChromeDriver chromeDriver;
    
    public static EdgeDriver edgeDriver;
    
    @Test
    static void driverQuit(){
        if (chromeDriver!=null){
            chromeDriver.quit();
        } else if (edgeDriver!=null) {
            edgeDriver.quit();
        }else {
            chromeDriver.quit();
            edgeDriver.quit();
        }
    }
}

4.2、功能测试

注册页面

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-up.html");
    }

测试空的用户名能否正常注册

    /**
     * 测试空的用户名
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource({",baekhyun,1992,1992"})
    public void testRegisterNullUsername(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String except="用户名不能为空";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signUpForm\"]/div/div[1]/div")).getText();
        Assertions.assertEquals(except,actual);

        Thread.sleep(1000);
        //复原勾选框
        chromeDriver.findElement(By.cssSelector("#policy")).click();
    }

测试空的昵称能否正常注册

    /**
     * 测试空的昵称
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     */
    @Order(2)
    @ParameterizedTest
    @CsvSource({"baekhyun,,1992,1992"})
    public void testRegisterNullNickname(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String except="昵称不能为空";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signUpForm\"]/div/div[2]/div")).getText();
        Assertions.assertEquals(except,actual);

        Thread.sleep(1000);
        //复原勾选框
        chromeDriver.findElement(By.cssSelector("#policy")).click();
    }

测试空的密码能否正常注册

    /**
     * 测试空的密码
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(3)
    @ParameterizedTest
    @CsvSource({"baekhyun,baekhyun,,1992"})
    public void testRegisterNullPassword(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String except="密码不能为空";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signUpForm\"]/div/div[3]/div/div")).getText();
        Assertions.assertEquals(except,actual);

        Thread.sleep(1000);
        //复原勾选框
        chromeDriver.findElement(By.cssSelector("#policy")).click();
    }

测试空的确认密码能否正常注册

    /**
     * 测试空的确认密码
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(4)
    @ParameterizedTest
    @CsvSource({"baekhyun,baekhyun,1992,"})
    public void testRegisterNullPasswordRepeat(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String except="请检查确认密码";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signUpForm\"]/div/div[4]/div/div")).getText();
        Assertions.assertEquals(except,actual);

        Thread.sleep(1000);
        //复原勾选框
        chromeDriver.findElement(By.cssSelector("#policy")).click();
    }

测试密码和确认密码不一致时能否正常注册

    /**
     * 测试密码和确认密码不一致
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(5)
    @ParameterizedTest
    @CsvSource({"baekhyun,baekhyun,1992,1993"})
    public void testRegisterNullSame(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String except="请检查确认密码";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signUpForm\"]/div/div[4]/div/div")).getText();
        Assertions.assertEquals(except,actual);

        Thread.sleep(1000);
        //复原勾选框
        chromeDriver.findElement(By.cssSelector("#policy")).click();
    }

测试用户名已注册时能否正常注册

    /**
     * 测试用户名已存在
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(6)
    @ParameterizedTest
    @CsvSource({"baekhyun,baekhyun,1992,1992"})
    public void testRegisterNullExistUsername(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String exp_url="http://49.232.185.203:58080/sign-up.html";
        String cur_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,cur_url);

        Thread.sleep(1000);
        //复原勾选框
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        Thread.sleep(1000);
    }

测试没有点击同意协议能否正常注册

    /**
     * 测试没有点击同意协议
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(7)
    @ParameterizedTest
    @CsvSource({"do,do,1993,1993"})
    public void testRegisterNullPolicy(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000);
        String exp_url="http://49.232.185.203:58080/sign-up.html";
        String cur_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,cur_url);

        Thread.sleep(1000);
    }

测试输入正确的用户名、昵称、密码、确认密码能否正常注册

    /**
     * 正确的用户名、昵称、密码、确认密码
     * @param username
     * @param nickname
     * @param password
     * @param passwordRepeat
     * @throws InterruptedException
     */
    @Order(8)
    @ParameterizedTest
    @CsvSource({"sehun,sehun,1994,1994"})
    public void testRegisterSuccess(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#nickname")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#passwordRepeat")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        if (nickname!=null){
            chromeDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        }
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        if (passwordRepeat!=null){
            chromeDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        }
        chromeDriver.findElement(By.cssSelector("#policy")).click();
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(3000);
        String exp_url="http://49.232.185.203:58080/sign-in.html";
        String cur_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,cur_url);
    }

测试结果:

登录页面

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
    }

测试输入错误的用户名和密码

    /**
     * 测试错误的用户名或密码
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource({"baekhyun,1999","dd,1993"})
    void testLoginErrorUser(String username,String password) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        String exp_url="http://49.232.185.203:58080/sign-in.html";
        String cur_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,cur_url);
        Thread.sleep(1000);
    }

测试只输入用户名

    /**
     * 测试空的用户名
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(2)
    @ParameterizedTest
    @CsvSource({",1992",",1993"})
    void testLoginNullUsername(String username,String password) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        if (password!=null){
            chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        }
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        String except="用户名不能为空";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signInForm\"]/div[1]/div")).getText();
        Assertions.assertEquals(except,actual);
        Thread.sleep(1000);
    }

测试只输入密码

    /**
     * 测试空的密码
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(3)
    @ParameterizedTest
    @CsvSource({"baekhyun,","do,"})
    void testLoginNullPassword(String username,String password) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        if (username!=null){
            chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        }
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        String except="密码不能为空";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signInForm\"]/div[2]/div/div")).getText();
        Assertions.assertEquals(except,actual);
        Thread.sleep(1000);
    }

测试输入正确的用户名和密码

    /**
     * 测试正确的用户名和密码
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(4)
    @ParameterizedTest
    @CsvSource({"baekhyun,1992","do,1993"})
    void testLoginSuccess(String username,String password) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        String exp_url="http://49.232.185.203:58080/index.html";
        String cur_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,cur_url);
        chromeDriver.navigate().back();
        Thread.sleep(1000);
    }

测试结果:

版块

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */

    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试是否显示所有帖子信息

    /**
     * 测试是否显示板块下所有帖子的信息
     */
    @Order(1)
    @Test
    void testDisplayALLArticle() throws InterruptedException {
        Thread.sleep(1000);
        String exp1=chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("招聘开发岗位",exp1);
        String exp2=chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(2) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("测试测试333",exp2);
        String exp3=chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(3) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("测试测试222",exp3);
        String exp4=chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(4) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("测试测试111",exp4);
    }

测试右上角用户信息

    /**
     * 测试右上角用户信息
     */
    @Order(2)
    @Test
    void testUserInfo() throws InterruptedException {
        Thread.sleep(1000);
        WebElement userinfo=chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown"));
        Assertions.assertNotNull(userinfo);
    }

测试站内信按钮

    /**
     * 测试站内信按钮
     */
    @Order(3)
    @Test
    void testDisplayMail() throws InterruptedException {
        Thread.sleep(1000);
        WebElement mail=chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div"));
        Assertions.assertNotNull(mail);
    }

测试点击用户头像是否出现下拉框信息

    /**
     * 测试点击用户头像是否出现下拉框
     */
    @Order(4)
    @Test
    void testDisplayDownList() throws InterruptedException {
        Thread.sleep(1000);
        //首先得点击下拉框
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();

        String exp1=chromeDriver.findElement(By.xpath("//*[@id=\"index_user_profile\"]")).getText();
        Assertions.assertEquals("我的帖子",exp1);
        String exp2=chromeDriver.findElement(By.xpath("//*[@id=\"index_user_settings\"]")).getText();
        Assertions.assertEquals("个人中心",exp2);
        String quit=chromeDriver.findElement(By.xpath("//*[@id=\"index_user_logout\"]")).getText();
        Assertions.assertEquals("退出",quit);

        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
    }

测试能否跳转到详情页

    /**
     * 测试能否跳转到详情页
     */
    @Order(5)
    @Test
    void testArticleDetail() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
        String except="招聘开发岗位测试";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"details_article_content\"]/p")).getText();
        Thread.sleep(1000);
        Assertions.assertEquals(except,actual);
        chromeDriver.findElement(By.cssSelector("#nav_board_index > a")).click();
    }

测试能否正确跳转到帖子编辑页

    /**
     * 测试发布帖子能否正确跳到帖子编辑页
     */
    @Order(6)
    @Test
    void Publish1() throws InterruptedException {
        Thread.sleep(2000);
        chromeDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
        Thread.sleep(3000);
        String text=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]")).getText();
        Assertions.assertEquals("发新贴",text);
        chromeDriver.findElement(By.cssSelector("#nav_board_index > a")).click();
    }

测试点击版块能否跳转到版块下的所有帖子

    /**
     * 测试点击版块能否跳到板块下所有的帖子
     */
    @Order(7)
    @Test
    void testBoardInfo() throws InterruptedException {
        Thread.sleep(1000);
        chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]")).click();
        Thread.sleep(2000);
        String text=chromeDriver.findElement(By.xpath("//*[@id=\"article_list_board_title\"]")).getText();
        Assertions.assertEquals("Java",text);
        String exp1=chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("测试测试222",exp1);
        String exp2=chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(2) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("测试测试111",exp2);
    }

测试退出按钮能否跳转到登录页面

    /**
     * 测试退出按钮
     */
    @Order(8)
    @Test
    void testQuit() throws InterruptedException {
        //首先得点击下拉框
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_logout\"]")).click();
        Thread.sleep(1000);
        String exp_url="http://49.232.185.203:58080/sign-in.html";
        String actual_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,actual_url);
    }

测试结果:

 帖子

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */

    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试正确发布帖子

    /**
     * 测试发布新帖
     * @throws InterruptedException
     */
    @Order(1)
    @Test
    void Publish1() throws InterruptedException {
        chromeDriver.findElement(By.xpath("//*[@id=\"nav_board_index\"]/a/span[2]")).click();
        chromeDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
        chromeDriver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试标题");
        chromeDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        chromeDriver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")).sendKeys("自动化测试内容");
        chromeDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        chromeDriver.findElement(By.cssSelector("#article_post_submit")).click();
        Thread.sleep(1000);
        String text = chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
        Assertions.assertEquals("自动化测试标题",text);
    }

测试能否正确跳转到帖子详情页

    /**
     * 测试能否跳转到详情页
     */
    @Order(1)
    @Test
    void testArticleDetail() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
        String except="招聘开发岗位测试";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"details_article_content\"]/p")).getText();
        Thread.sleep(1000);
        Assertions.assertEquals(except,actual);
    }

测试能否显示帖子的所有信息和用户信息

    /**
     * 测试是否显示帖子的所有信息和用户信息
     */
    @Order(2)
    @Test
    void testDisplayArticle_userInfo() throws InterruptedException {
        //帖子作者
        String article_username="do";
        String username=chromeDriver.findElement(By.xpath("//*[@id=\"article_details_author_name\"]")).getText();
        //帖子标题
        String article_title="招聘开发岗位";
        String title=chromeDriver.findElement(By.xpath("//*[@id=\"details_article_title\"]")).getText();
        //帖子内容
        String article_content="招聘开发岗位测试";
        String content=chromeDriver.findElement(By.xpath("//*[@id=\"details_article_content\"]/p")).getText();
        Thread.sleep(1000);
        Assertions.assertEquals(article_username,username);
        Assertions.assertEquals(article_title,title);
        Assertions.assertEquals(article_content,content);
    }

测试能否显示帖子的创建时间、点赞数、浏览量、回复数

    /**
     * 测试是否显示帖子的创建时间、点赞数、浏览量、回复数
     */
    @Order(3)
    @Test
    void testDisplayarticleInfo(){
        //帖子创建时间
        String ex_createTime="2024-05-28 12:08:57";
        String createTime=chromeDriver.findElement(By.xpath("//*[@id=\"details_article_createTime\"]")).getText();
        Assertions.assertEquals(ex_createTime,createTime);
        //点赞数
        WebElement like_count_nav=chromeDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(3) > svg"));
        Assertions.assertNotNull(like_count_nav);
        //浏览量
        WebElement browse_nav=chromeDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(2) > svg"));
        Assertions.assertNotNull(browse_nav);
        //回复数
        WebElement reply_nav=chromeDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(4) > svg"));
        Assertions.assertNotNull(reply_nav);
    }

测试用户不是作者,是否会显示点赞选项

    /**
     * 测试如果不是作者,是否出现点赞按钮
     */
    @Order(4)
    @Test
    void testuserNotArticleUser(){
        //不是作者的情况下
        //点赞按钮
        WebElement like_nav=chromeDriver.findElement(By.cssSelector("#details_btn_like_count > svg"));
        Assertions.assertNotNull(like_nav);
    }

测试用户是作者,是否显示点赞、编辑、删除选项

    /**
     * 测试如果是作者,是否显示点赞、编辑、删除按钮
     */
    @Order(5)
    @Test
    void testuserIsArticleUser(){
        //是作者的情况下,需先退出当前帖子详情
        chromeDriver.findElement(By.cssSelector("#nav_board_index > a")).click();
        //进入作者为别人的帖子详情页
        chromeDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(2) > div > div.col > div.text-truncate > a > strong")).click();
        //点赞按钮
        WebElement like_nav=chromeDriver.findElement(By.cssSelector("#details_btn_like_count > svg"));
        Assertions.assertNotNull(like_nav);
        //编辑按钮
        WebElement edit_nav=chromeDriver.findElement(By.cssSelector("#details_artile_edit > svg"));
        Assertions.assertNotNull(edit_nav);
        //删除按钮
        WebElement del_nav=chromeDriver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end > div > div:nth-child(3) > div > a"));
        Assertions.assertNotNull(del_nav);
    }

测试结果:

用户个人中心页

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */

    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("do");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1993");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试能否正确显示当前用户下的所有帖子

    /**
     * 测试能否正确显示当前用户下的所有帖子
     */
    @Order(1)
    @Test
    void testDisplayUserAllArticle() throws InterruptedException {
        Thread.sleep(1000);
        //首先得点击下拉框
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();

        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_profile\"]")).click();
        String article_title=chromeDriver.findElement(By.xpath("//*[@id=\"profile_article_body\"]/li/div[2]/div/div/div/div/div[1]/a/strong")).getText();
        Assertions.assertEquals("招聘开发岗位",article_title);
    }

测试能否正确显示发帖数、邮箱、注册日期、个人介绍

    /**
     * 测试能否正确显示发帖数、邮箱、注册日期、个人介绍
     */
    @Order(2)
    @Test
    void testUserInfo(){
        WebElement articlecount_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/div[1]"));
        Assertions.assertNotNull(articlecount_nav);
        WebElement email_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/div[2]"));
        Assertions.assertNotNull(email_nav);
        WebElement createtime_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/div[3]"));
        Assertions.assertNotNull(createtime_nav);
        WebElement introduce_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[2]/div/div/div[2]/div/div"));
        Assertions.assertNotNull(introduce_nav);
    }

测试能否正确显示他人的帖子信息和用户信息

    /**
     * 测试能否正确显示他人的帖子信息或用户信息
     */
    @Order(3)
    @Test
    void testOtherUserInfo(){
        //点击首页
        chromeDriver.findElement(By.cssSelector("#nav_board_index > a")).click();
        //点击别人文章
        chromeDriver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[2]/div/div[2]/div[1]/a/strong")).click();
        //点击别人的名称进入详情页
        chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[2]/div/div/div[1]/div[1]/div/h3")).click();
        WebElement articlecount_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/div[1]"));
        Assertions.assertNotNull(articlecount_nav);
        WebElement email_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/div[2]"));
        Assertions.assertNotNull(email_nav);
        WebElement createtime_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/div[3]"));
        Assertions.assertNotNull(createtime_nav);
        WebElement introduce_nav=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[2]/div/div/div[2]/div/div"));
        Assertions.assertNotNull(introduce_nav);
    }

测试修改昵称、电子邮箱、电话号码

    /**
     * 测试修改昵称、邮箱地址、电话号码
     */
    @Order(4)
    @Test
    void testModifyUserInfo() throws InterruptedException {
        Thread.sleep(1000);
        //首先得点击下拉框
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
        //点击用户中心
        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_settings\"]")).click();
        Thread.sleep(1000);
        //修改昵称
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_nickname\"]")).clear();
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_nickname\"]")).sendKeys("dodo");
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_submit_nickname\"]")).click();
        Thread.sleep(1000);
        //修改邮箱地址
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_email\"]")).clear();
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_email\"]")).sendKeys("19933@qq.com");
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_submit_email\"]")).click();
        Thread.sleep(1000);
        //修改电话号码
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_phoneNum\"]")).clear();
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_phoneNum\"]")).sendKeys("12727178333");
        Thread.sleep(1000);
        chromeDriver.findElement(By.xpath("//*[@id=\"setting_submit_phoneNum\"]")).click();
        Thread.sleep(2000);

        //退出
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_logout\"]")).click();
        Thread.sleep(1000);
        //登录
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("do");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(3000);


        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_settings\"]")).click();
        Thread.sleep(1000);
        String nickname=chromeDriver.findElement(By.xpath("//*[@id=\"settings_nickname\"]")).getText();
        Assertions.assertEquals("dodo",nickname);
    }

测试修改密码

    /**
     * 测试修改密码
     */
    @Order(5)
    @Test
    void testModifyPassword() throws InterruptedException {
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
        //点击用户中心
        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_settings\"]")).click();
        Thread.sleep(1000);
        //填写旧密码
        chromeDriver.findElement(By.xpath("//*[@id=\"settings_input_oldPassword\"]")).sendKeys("1992");
        //新密码
        chromeDriver.findElement(By.xpath("//*[@id=\"settings_input_newPassword\"]")).sendKeys("1993");
        //确认密码
        chromeDriver.findElement(By.xpath("//*[@id=\"settings_input_passwordRepeat\"]")).sendKeys("1993");
        Thread.sleep(2000);
        chromeDriver.findElement(By.xpath("//*[@id=\"settings_submit_password\"]")).click();
        Thread.sleep(1000);

        String exp_url="http://49.232.185.203:58080/sign-in.html";
        String actual_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,actual_url);
        Thread.sleep(1000);

        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("do");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1993");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(3000);

        String exp_url2="http://49.232.185.203:58080/index.html";
        String actual_url2=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url2,actual_url2);
    }

测试结果:

站内信

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */

    public static ChromeDriver chromeDriver=createChromeDriver();

    public static EdgeDriver edgeDriver=createEdgeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("do");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1993");
        chromeDriver.findElement(By.cssSelector("#submit")).click();

        edgeDriver.get("http://49.232.185.203:58080/sign-in.html");
        edgeDriver.findElement(By.cssSelector("#username")).clear();
        edgeDriver.findElement(By.cssSelector("#password")).clear();
        edgeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        edgeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        edgeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试能否成功发送站内信

    /**
     * 测试能否成功发送站内信
     */
    @Order(1)
    @Test()
    @Transactional
    void testSendMailSuccess() throws InterruptedException {
        edgeDriver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a/strong")).click();
        edgeDriver.findElement(By.xpath("//*[@id=\"btn_details_send_message\"]")).click();
        edgeDriver.findElement(By.xpath("//*[@id=\"index_message_receive_content\"]")).sendKeys("我是baekhyun");
        edgeDriver.findElement(By.xpath("//*[@id=\"btn_index_send_message\"]")).click();
        Thread.sleep(1000);
        String exp_url="http://49.232.185.203:58080/index.html";
        String actual_url=chromeDriver.getCurrentUrl();
        Assertions.assertEquals(exp_url,actual_url);
        Thread.sleep(1000);
    }

测试能否正确显示站内信

    /**
     * 测试能否正确显示站内信
     */
    @Order(2)
    @Test
    void testDisplayMail() throws InterruptedException {
        chromeDriver.navigate().refresh();
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        String receive=chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/div")).getText();
        Assertions.assertEquals("我是baekhyun",receive);
    }

测试站内信未读时,前方是否有[未读]标志

    /**
     * 测试站内信未读时,前方是否有[未读]标志
     */
    @Order(3)
    @Test
    void testUnread() throws InterruptedException {
        chromeDriver.navigate().refresh();
        Thread.sleep(1000);
        //点击站内信
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        String expect=chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/a/span[1]")).getText();
        Assertions.assertEquals("[未读]",expect);
    }

测试站内信已读时,前方是否有[已读]标志

    /**
     * 测试站内信已读时,前方是否有[已读]标志
     */
    @Order(4)
    @Test
    void testread() throws InterruptedException {
        chromeDriver.navigate().refresh();
        Thread.sleep(1000);
        //点击站内信
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        //点击要读取的站内信
        chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/a")).click();
        //点击退出
        chromeDriver.findElement(By.xpath("//*[@id=\"index_message_reply_modal\"]/div/div/div[1]/button")).click();
        Thread.sleep(1000);
        chromeDriver.navigate().refresh();
        //点击站内信
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        String expect=chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/a/span[1]")).getText();
        Assertions.assertEquals("[已读]",expect);
    }

测试站内信已回复时,前方是否有[已回复]标志

    /**
     * 测试站内信已回复时,前方是否有[已回复]标志
     */
    @Order(5)
    @Test
    void testReplied() throws InterruptedException {
        Thread.sleep(1000);
        chromeDriver.navigate().refresh();
        //点击站内信
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        //点击要回复的站内信
        chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/a")).click();
        //点击回复
        chromeDriver.findElement(By.xpath("//*[@id=\"btn_index_message_reply\"]")).click();
        Thread.sleep(1000);
        //输入要回复的内容
        chromeDriver.findElement(By.xpath("//*[@id=\"index_message_reply_receive_content\"]")).sendKeys("我是do");
        //点击发送
        chromeDriver.findElement(By.xpath("//*[@id=\"btn_index_send_message_reply\"]")).click();
        Thread.sleep(2000);
        chromeDriver.navigate().refresh();
        //点击站内信
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        String expect=chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/a/span[1]")).getText();
        Assertions.assertEquals("[已回复]",expect);
    }

测试回复站内信能否成功

    /**
     * 测试回复站内信能否成功
     */
    @Order(6)
    @Test
    void replySuccess() throws InterruptedException {
        Thread.sleep(1000);
        edgeDriver.navigate().refresh();
        //点击站内信
        edgeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div")).click();
        //点击要回复的站内信
        String text=edgeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div[1]/div/div[2]/div")).getText();
        Assertions.assertEquals("我是do",text);
    }

测试结果:

4.3、界面测试

注册页面

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-up.html");
    }

测试用户注册标题是否存在

    /**
     * 测试用户注册标题是否存在
     */
    @Order(1)
    @Test
    void testRegisterTitle(){
        String expect_title="用户注册";
        String actual=chromeDriver.findElement(By.xpath("//*[@id=\"signUpForm\"]/div/h2")).getText();
        Assertions.assertEquals(expect_title,actual);
    }

测试用户名输入框是否存在

    /**
     * 测试用户名输入框是否存在
     */
    @Order(2)
    @Test
    void testUsernameInput(){
        WebElement userInput=chromeDriver.findElement(By.xpath("//*[@id=\"username\"]"));
        Assertions.assertNotNull(userInput);
    }

测试昵称输入框是否存在

    /**
     * 测试昵称输入框是否存在
     */
    @Order(3)
    @Test
    void testNicknameInput(){
        WebElement nicknameInput=chromeDriver.findElement(By.xpath("//*[@id=\"nickname\"]"));
        Assertions.assertNotNull(nicknameInput);
    }

测试密码输入框是否存在

    /**
     * 测试密码输入框是否存在
     */
    @Order(4)
    @Test
    void testPasswordInput(){
        WebElement passwordInput=chromeDriver.findElement(By.xpath("//*[@id=\"password\"]"));
        Assertions.assertNotNull(passwordInput);
    }

测试确认密码输入框是否存在

    /**
     * 测试密码确认输入框是否存在
     */
    @Order(5)
    @Test
    void testPasswordRepeat(){
        WebElement passwordRepeatInput=chromeDriver.findElement(By.xpath("//*[@id=\"passwordRepeat\"]"));
        Assertions.assertNotNull(passwordRepeatInput);
    }

测试注册按钮是否存在

    /**
     * 测试注册按钮是否存在
     */
    @Order(6)
    @Test
    void testRegisterButton(){
        WebElement registerButton=chromeDriver.findElement(By.xpath("//*[@id=\"submit\"]"));
        Assertions.assertNotNull(registerButton);
    }

测试登录跳转按钮是否存在

    /**
     * 测试登录跳转按钮是否存在
     */
    @Order(7)
    @Test
    void testLoginJumpButton(){
        WebElement loginJumpButton=chromeDriver.findElement(By.xpath("/html/body/div/div/div[2]/a"));
        Assertions.assertNotNull(loginJumpButton);
    }

测试结果:

登录页面

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
    }

测试用户登录标题是否存在

    /**
     * 测试用户登录标题是否存在
     */
    @Order(1)
    @Test
    void testLoginTitle(){
        String login_title="用户登录";
        String except=chromeDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/div/div[2]/div/h2")).getText();
        Assertions.assertEquals(login_title,except);
    }

测试用户名输入框是否存在

    /**
     * 测试用户名输入框是否存在
     */
    @Order(2)
    @Test
    void usernameInput(){
        WebElement usernameInput=chromeDriver.findElement(By.xpath("//*[@id=\"username\"]"));
        Assertions.assertNotNull(usernameInput);
    }

测试密码输入框是否存在

    /**
     * 测试密码输入框是否存在
     */
    @Order(3)
    @Test
    void passwordInput(){
        WebElement passwordInput=chromeDriver.findElement(By.xpath("//*[@id=\"password\"]"));
        Assertions.assertNotNull(passwordInput);
    }

测试登录按钮是否存在

    /**
     * 测试登录按钮是否存在
     */
    @Order(4)
    @Test
    void testLoginButton(){
        WebElement loginButton=chromeDriver.findElement(By.xpath("//*[@id=\"submit\"]"));
        Assertions.assertNotNull(loginButton);
    }

测试注册跳转按钮是否存在

    /**
     * 测试注册跳转按钮是否存在
     */
    @Order(5)
    @Test
    void testLoginJumpButton(){
        WebElement loginJumpButton=chromeDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/div/div[3]/a"));
        Assertions.assertNotNull(loginJumpButton);
    }

测试结果:

版块

首先定义浏览器对象和url

/**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试导航栏中版块是否存在

/**
     * 测试导航栏中版块是否存在
     */
    @Order(1)
    @Test
    void testExistBoard(){
        //首页
        WebElement board1=chromeDriver.findElement(By.xpath("//*[@id=\"nav_board_index\"]/a"));
        Assertions.assertNotNull(board1);
        //java
        WebElement board2=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board2);
        //c++
        WebElement board3=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board3);
        //前端技术
        WebElement board4=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board4);
        //Mysql
        WebElement board5=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board5);
        //面试宝典
        WebElement board6=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board6);
        //经验分享
        WebElement board7=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board7);
        //招聘信息
        WebElement board8=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board8);
        //福利待遇
        WebElement board9=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board9);
        //灌水区
        WebElement board10=chromeDriver.findElement(By.xpath("//*[@id=\"topBoardList\"]/li[2]/a"));
        Assertions.assertNotNull(board10);
    }

测试夜间模式按钮是否存在

/**
     * 测试夜间模式按钮是否存在
     */
    @Order(2)
    @Test
    void testExistButton(){
        WebElement button=chromeDriver.findElement(By.xpath("/html/body/div[1]/header[1]/div/div/div[2]/a[1]"));
        Assertions.assertNotNull(button);
    }

测试结果:

帖子

首先定义浏览器对象和url

/**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试发布帖子按钮是否存在

/**
     * 测试发布帖子按钮是否存在
     */
    @Order(1)
    @Test
    void testPublish(){
        WebElement publish= chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div"));
        Assertions.assertNotNull(publish);
    }

测试发私信按钮是否存在

/**
     * 测试发私信按钮是否存在
     */
    @Order(2)
    @Test
    void testSendMessage(){
        chromeDriver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a/strong")).click();
        WebElement button=chromeDriver.findElement(By.xpath("//*[@id=\"btn_details_send_message\"]"));
        Assertions.assertNotNull(button);
    }

测试我的帖子按钮是否存在

/**
     * 测试我的帖子按钮是否存在
     */
    @Order(3)
    @Test
    void testMyArticle(){
        //首先得点击下拉框
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();

        WebElement button=chromeDriver.findElement(By.xpath("//*[@id=\"index_user_profile\"]"));
        Assertions.assertNotNull(button);
    }

测试结果:

用户个人中心页

首先定义浏览器对象和url

    /**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试昵称输入框是否存在

    /**
     * 测试昵称输入框是否存在
     */
    @Order(1)
    @Test
    void testNicknameInput(){
        //首先得点击下拉框
        chromeDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();
        chromeDriver.findElement(By.xpath("//*[@id=\"index_user_settings\"]")).click();
        WebElement nicknameInput=chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_nickname\"]"));
        Assertions.assertNotNull(nicknameInput);
    }

测试邮箱地址是否存在

    /**
     * 测试邮箱地址输入框是否存在
     */
    @Order(2)
    @Test
    void testEmailInput(){
        WebElement emailInput=chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_email\"]"));
        Assertions.assertNotNull(emailInput);
    }

测试电话号码是否存在

    /**
     * 测试电话号码输入框是否存在
     */
    @Order(3)
    @Test
    void testPhoneNumInput(){
        WebElement phoneNumInput=chromeDriver.findElement(By.xpath("//*[@id=\"setting_input_phoneNum\"]"));
        Assertions.assertNotNull(phoneNumInput);
    }

测试原密码是否存在

    /**
     * 测试原密码输入框是否存在
     */
    @Order(4)
    @Test
    void testOldPasswordInput(){
        WebElement oldPasswordInput=chromeDriver.findElement(By.xpath("//*[@id=\"settings_input_oldPassword\"]"));
        Assertions.assertNotNull(oldPasswordInput);
    }

测试新密码是否存在

    /**
     * 测试新密码输入框是否存在
     */
    @Order(5)
    @Test
    void testNewPasswordInput(){
        WebElement newPasswordInput=chromeDriver.findElement(By.xpath("//*[@id=\"settings_input_newPassword\"]"));
        Assertions.assertNotNull(newPasswordInput);
    }

测试确认密码是否存在

    /**
     * 测试确认密码输入框是否存在
     */
    @Order(6)
    @Test
    void testPasswordRepeatInput(){
        WebElement passwordRepeatInput=chromeDriver.findElement(By.xpath("//*[@id=\"settings_input_passwordRepeat\"]"));
        Assertions.assertNotNull(passwordRepeatInput);
    }

测试提交修改按钮是否存在

    /**
     * 测试提交修改按钮是否存在
     */
    @Order(7)
    @Test
    void testSubmitInput(){
        WebElement submitInput=chromeDriver.findElement(By.xpath("//*[@id=\"settings_submit_password\"]"));
        Assertions.assertNotNull(submitInput);
    }

测试个人简介标题是否存在

    /**
     * 测试个人简介标题是否存在
     */
    @Order(8)
    @Test
    void testProfile(){
        String text=chromeDriver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[2]/div/div/div/div[2]/div/h3[5]")).getText();
        Assertions.assertEquals("个人简介",text);
    }

测试结果:

站内信

首先定义浏览器对象和url

/**
     * 1、浏览器对象
     * 2、访问登录页面的url
     */
    public static ChromeDriver chromeDriver=createChromeDriver();

    @BeforeAll
    static void baseControl(){
        chromeDriver.get("http://49.232.185.203:58080/sign-in.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }

测试站内信按钮是否存在

     /**
     * 测试站内信按钮是否存在
     */
    @Order(1)
    @Test
    void testMailButton(){
        WebElement mailButton=chromeDriver.findElement(By.xpath("/html/body/div[1]/header[1]/div/div/div[2]/div"));
        Assertions.assertNotNull(mailButton);
    }

测试站内信内回复按钮是否存在

    /**
     * 测试回复站内信按钮是否存在
     */
    @Order(2)
    @Test
    void testReplyButton() throws InterruptedException {
        chromeDriver.findElement(By.xpath("/html/body/div[1]/header[1]/div/div/div[2]/div")).click();
        chromeDriver.findElement(By.xpath("//*[@id=\"index_div_message_list\"]/div/div/div[2]/a")).click();
        Thread.sleep(1000);
        WebElement replyButton=chromeDriver.findElement(By.xpath("//*[@id=\"btn_index_message_reply\"]"));
        Assertions.assertNotNull(replyButton);
    }

测试站内信内取消按钮是否存在

    /**
     * 测试站内信取消按钮是否存在
     */
    @Order(3)
    @Test
    void testCancellationButton(){
        WebElement cancellationButton=chromeDriver.findElement(By.xpath("//*[@id=\"index_message_reply_cancel\"]"));
        Assertions.assertNotNull(cancellationButton);
    }

测试结果:

测试套件结果:

总结:目前针对论坛系统的测试如上述博客,由于部分用例无法进行自动化测试,所以进行相应的人工测试,且测试通过

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu基础使用

快捷键&#xff1a; 命令行打开快捷方式&#xff1a;Ctrl Alt T Ctrl l 清屏 截屏&#xff1a; LinuxOS命令&#xff1a; 显示当前工作目录所有内容&#xff1a;ls &#xff08;-a -l、-lh&#xff09; -a 输入全部内容&#xff08;包括隐藏文件&#xff09; -l 竖向展示…

算法每日一题(python,2024.05.26) day.8

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 双指针&#xff0b;交换&#xff0c;使用left和right两个指针&#xff0c;right指针向右移动&#xff0c;left从数组首位开始&#xff0c;当right找到非…

【字典树(前缀树) 哈希映射 后序序列化】1948. 删除系统中的重复文件夹

本文涉及知识点 字典树&#xff08;前缀树) 哈希映射 后序序列化 LeetCode 1948. 删除系统中的重复文件夹 由于一个漏洞&#xff0c;文件系统中存在许多重复文件夹。给你一个二维数组 paths&#xff0c;其中 paths[i] 是一个表示文件系统中第 i 个文件夹的绝对路径的数组。 …

Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解还在写0.0… 文章目录 系列…

Arxiv AI 综述列表(2024.05.27~2024.05.31) VLM

公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 每周末更新&#xff0c;完整版进群获取。 Q 群在群文件&#xff0c;VX 群每周末更新。 目录 1. An Introduction to Vision-Language Modeling …

Semaphore信号量限制访问

文章目录 什么是Semaphore使用Semaphoreacquire函数release函数 什么是Semaphore Semaphore是一个计数信号量&#xff0c;用于控制同时访问特定资源的线程数量&#xff0c;以维护资源的访问控制和确保系统的线程安全。Semaphore可以被视为一个包含若干许可&#xff08;permit&a…

网络分层与各层网络协议介绍

一.OSI七层模型 1.OSI&#xff08;Open Systems Interconnection&#xff09;七层模型是由国际标准化组织&#xff08;ISO&#xff09;提出的一种网络通信协议的参考模型&#xff0c;用于标准化网络通信的过程。 OSI模型将网络通信分为七个层次&#xff0c;每个层次负责不同的…

ChatGPT产品创意,直接出概念图

直接问&#xff0c;“给我一个创意点子” AI7号 它推荐我做一个智能家居植物管理系统&#xff0c;嗯&#xff0c;很小众的样子。直接让它出一张概念图吧。 像模像样&#xff0c;一张图太单薄了&#xff0c;再来5张。 呃...做了4张&#xff0c;下面还有每张图的说明。 你觉得怎…

SpringBoot-世界杯足球赛网站-28567

Springboot世界杯足球赛网站 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对世界杯足球赛…

zabbix事件告警监控:如何实现对相同部件触发器告警及恢复的强关联

有一定Zabbix使用经验的小伙伴可能会发现&#xff0c;接收告警事件时&#xff0c;其中可能包含着大量不同的部件名&#xff0c;同一部件的事件在逻辑上具有很强关联性&#xff0c;理论上应保持一致的告警/恢复状态&#xff0c;但Zabbix默认并未对它们进行关联&#xff0c;直接后…

HarmonyOS鸿蒙学习笔记(27)resources目录说明

resources目录说明 目录结构目录说明base目录rawfile目录resfile目录资源组目录 参考资料 目录结构 在HarmonyOS的项目结构中&#xff0c;有resources目录&#xff0c;用于存放应用/服务所用到的资源文件&#xff0c;如图形、多媒体、字符串、布局文件等。关于资源文件&#x…

DAQmx Connect Terminals (VI) 信号路由作用及意义

DAQmx Connect Terminals是一个LabVIEW虚拟仪器&#xff08;VI&#xff09;&#xff0c;用于配置和连接数据采集系统中的物理终端或虚拟终端。这一功能在配置复杂的数据采集&#xff08;DAQ&#xff09;系统时非常重要&#xff0c;因为它允许用户在不改变硬件连接的情况下&…

使用Spring Boot自定义注解 + AOP实现基于IP的接口限流和黑白名单

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块

天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护&#xff0c;丰富的权限控制以及灵活的应用管理&#xff0c;帮助企业构建更严密的立体保密体系。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…

VSCODE 常用快捷键

快捷按键 注释 CTRL /CTRL KSHIFT ALT A取消注释 CTRL /CTRL KSHIFT ALT A搜索文件 Ctrl P移动到某一行 Ctrl g打开一个新窗口 Ctrl Shift N关闭窗口 Ctrl Shift W新建文件 Ctrl N文件间切换 Ctrl Tab全部文件搜索 Ctrl Shift F全屏 F11 打开文件出现中文乱码 文件右下角…

极验4点选逆向 JS逆向分析 最新版验证码

目录 声明&#xff01; 一、请求流程分析 二、加密参数w与payload 三、参数w生成位置 四、结果展示&#xff1a; 原创文章&#xff0c;请勿转载&#xff01; 本文内容仅限于安全研究&#xff0c;不公开具体源码。维护网络安全&#xff0c;人人有责。 声明&#xff01; 本文章…

268 基于matlab的模拟双滑块连杆机构运动

基于matlab的模拟双滑块连杆机构运动&#xff0c;并绘制运动动画&#xff0c;连杆轨迹可视化输出&#xff0c;并输出杆件质心轨迹、角速度、速度变化曲线。可定义杆长、滑块速度&#xff0c;滑块初始位置等参数。程序已调通&#xff0c;可直接运行。 268 双滑块连杆机构运动 连…

Dinky DorisCDC 整库同步到 Doris

doris flinkcdc语法参考 Flink Doris Connector - Apache Doris 参考&#xff1a; Doris Flink DolphinScheduler Dinky 构建开源数据平台_dinky dolphinscheduler flink-CSDN博客

【SpringMVC】_SpringMVC实现用户登录

目录 1、需求分析 2、接口定义 2.1 校验接口 请求参数 响应数据 2.2 查询登录用户接口 请求参数 响应数据 4、服务器代码 5、前端代码 5.1 登录页面login.html 5.2 首页页面index.html 6、运行测试 1、需求分析 用户输入账号与密码&#xff0c;后端校验密码是否正确&a…

使用opencv 进行车牌位置检测的源代码

效果: 这一个车牌识别系统中的预处理函数,其主要目的是对输入的车牌图片进行一系列的图像处理操作,以便后续的车牌识别算法能够更准确地识别出车牌。 整个函数的流程是:读取图像 -> 缩放 -> 灰度化 -> 去噪 -> 边缘检测 -> 形态学操作 -> 轮廓检测 ->…