当前位置: 首页 > news >正文

鸟语林-论坛系统自动化测试

文章目录

  • 一、自动化实施步骤
    • 1.1编写Web测试用例
    • 1.2 编写自动化代码
      • 1.2.1 LoginPageTest
        • 1) 能否正确打开登录页面
        • 2) 点击去注册能否跳转注册页面
        • 3) 模拟用户登录,输入多组登录测试用例
      • 1.2.2 RegisterPageTest
        • 1) 能否成功打开注册页面
        • 2) 注册测试用例
        • 3) 点击去登录按钮 测试注册成功的用例
      • 1.2.3 IndexPageTest
        • 1) 首页不同帖子简要内容能否正常显示
        • 2) 其他板块下不同帖子简要内容能否正常显示
        • 3) 搜索功能
        • 4) 进入帖子详情页
      • 1.2.4 MyPostPageTest
        • 1) 登录状态下个人帖子列表能否正常显示
      • 1.2.5 DoPostPageTest
        • 1) 登录状态下发布帖子

一、自动化实施步骤

对论坛Web系统开展自动化测试,以不同页面为维度来编写测试用例,根据测试用例,结合Selenium来设计自动化代码。同时采用junit进行单元测试,避免不同测试方法之间造成干扰,影响测试结果。

论坛系统在线访问链接:http://82.156.186.83:8080/index.html

1.1编写Web测试用例

在这里插入图片描述

1.2 编写自动化代码

在pom.xml文件中导入所需的依赖

<dependencies>
        <!--WebDriverManager是⼀个开源Java库,-->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.8.0</version>
            <scope>test</scope>
        </dependency>

        <!--selenium-java-->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>
    	 <!--单元测试-->
    	<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.10.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

提取一些所有页面测试都需要初始化的属性到父类ObjTest中

public abstract class ObjTest {
    public EdgeOptions options;
    public WebDriver driver;

    public void init() {
        //使用驱动管理器-自动初始化对应版本的浏览器驱动
        WebDriverManager.edgedriver().setup();
        //配置一下选项-允许访问所有链接
        options = new EdgeOptions();
        options.addArguments("--remote-allow-origins=*");
    }

}

1.2.1 LoginPageTest

1) 能否正确打开登录页面

判断能否正确打开登录页面,以登录页面特有的元素是否成功获取到作为判断打开登录页面的标志

public Boolean openLoginPage() {
        //1.打开浏览器页面
        driver.get(loginPageUrl);
        //2.定位到登录页面 - 某些只有登录页面特有的元素
        // 如果能找到这些元素那么就判定成功打开登录页面
        WebElement element = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2"));
        return element != null && "用户登录".equals(element.getText());
    }

 	@Test
    void openLoginPage() {
        System.out.println("能否成功打开登录页面" + loginTest.openLoginPage());
        loginTest.close();
    }

在这里插入图片描述

2) 点击去注册能否跳转注册页面

判断点击"去注册"按钮能否正确打开登录页面,以注册页面特有的元素是否存在到作为判断标志

 /***
     * 1.打开登录页面
     * 2.选中"去注册"按钮
     * 3.成功跳转注册页面
     * 4.选中注册页面特有的元素来判断是否成功跳转到注册页面
     * @return
     */
    public Boolean clickRegisterButon() {
        driver.get(loginPageUrl);
        WebElement element = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a"));
        if (element == null) return false;
        element.click();
        WebElement registerHeader = driver.findElement(By.cssSelector("#signUpForm > div > h2"));
        if (registerHeader == null) return false;
        return "用户注册".equals(registerHeader.getText());
    }

@Test
void clickRegisterButon() {
    System.out.println("点击去注册按钮能否成功跳转注册页面:"
            + loginTest.clickRegisterButon());
    loginTest.close();
}

在这里插入图片描述

3) 模拟用户登录,输入多组登录测试用例

成功打开登录页面以后,在登录页面,模拟用户登录,输入用户名和密码,模拟输入设计好的测试,以登录成功跳转到首页为标志例判断能否登录成功。

/**
     * 1.打开登录页面
     * 2.找到用户名和密码输入框
     * 3.sendKeys 输入登录测试用例
     * 4.找到登录按钮并点击
     * 5.判断结果是否与测试用例一致
     *
     * @param password
     * @param username
     * @return
     */
    public Boolean login(String username, String password) throws InterruptedException {
        driver.get(loginPageUrl);
        WebElement inputName = driver.findElement(By.cssSelector("#username"));
        WebElement inputPasw = driver.findElement(By.cssSelector("#password"));
        if (inputName == null || inputPasw == null) return false;
        //输入数据之前清空一下输入框中的数据,避免之前输入框中原有的数据对测试造成干扰
        inputName.clear();
        inputPasw.clear();
        inputName.sendKeys(username);
        inputPasw.sendKeys(password);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);

        WebElement element = null;
        try {
            element = driver.findElement(By.cssSelector("#nav_board_index > a > span"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (element == null) return false;
        return "首页".equals(element.getText());
    }

 	@Test
    void login() throws InterruptedException {
        System.out.println("能否成功登录{testUser,h123,true}:" +
                loginTest.login("testUser", "h123"));
        loginTest.driver.navigate().back();
        System.out.println("能否成功登录{测试用户,h123,true}:" +
                loginTest.login("测试用户", "h123"));
        loginTest.driver.navigate().back();
        System.out.println("能否成功登录{测试,h123,false}:" +
                loginTest.login("测试", "h123"));
        loginTest.driver.navigate().back();
        System.out.println("能否成功登录{testUser,123,false}:" +
                loginTest.login("测试", "h123"));
        loginTest.close();
    }

在这里插入图片描述

测试结果与预期一致

1.2.2 RegisterPageTest

1) 能否成功打开注册页面
/**
     * 1.打开注册页面
     * 2.查找注册页面特有元素
     *
     * @return
     */
    public boolean openRegisterPage() {
        driver.get(registerPageUrl);
        WebElement registerHeader = driver.findElement(By.cssSelector("#signUpForm > div > h2"));
        if (registerHeader == null) return false;
        return "用户注册".equals(registerHeader.getText());
    }
   @Test
    void openRegisterPage() {
        System.out.println("能否成功打开注册页面:" + registerPageTest.openRegisterPage());
    }

在这里插入图片描述

2) 注册测试用例
 /**
     * 1.打开注册页面
     * 2.找到四个输入框
     * 3.输入测试用例
     * ***  1) 对输入框先调用一下clear方法,防止之前的参数造成测试不准确
     * 4,点击注册按钮能否成功跳转到登录
     *
     * @param user
     * @return
     */
    public boolean register(User user) {
        driver.get(registerPageUrl);
        WebElement inputUserName = driver.findElement(By.cssSelector("#username"));
        WebElement inputNickName = driver.findElement(By.cssSelector("#nickname"));
        WebElement inputPas = driver.findElement(By.cssSelector("#password"));
        WebElement inputReptedPas = driver.findElement(By.cssSelector("#passwordRepeat"));
        if (inputUserName == null || inputNickName == null
                || inputPas == null || inputReptedPas == null) {
            return false;
        }
        inputUserName.clear();
        inputNickName.clear();
        inputPas.clear();
        inputReptedPas.clear();

        inputUserName.sendKeys(user.getUsername());
        inputNickName.sendKeys(user.getNickname());
        inputPas.sendKeys(user.getPassword());
        inputReptedPas.sendKeys(user.getRepeatedPas());

        WebElement registerButton = driver.findElement(By.cssSelector("#submit"));
        registerButton.click();
        driver.manage().timeouts().implicitlyWait(Duration.ofMillis(2000));
        WebElement loginHeader = null;
        try {
            loginHeader = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2"));
        } catch (Exception e) {
            return false;
        }
        if (loginHeader == null) {
            return false;
        }
        return "用户登录".equals(loginHeader.getText());
    }

User

public class User {
    private String username = "";
    private String password = "";
    private String nickname = "";
    private String repeatedPas = "";

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getRepeatedPas() {
        return repeatedPas;
    }

    public void setRepeatedPas(String repeatedPas) {
        this.repeatedPas = repeatedPas;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                ", repeatedPas='" + repeatedPas + '\'' +
                '}';
    }
}
 @Test
    void register() throws InterruptedException {
        User u1Success = new User();
        u1Success.setUsername("testRegister11");
        u1Success.setNickname("煜");
        u1Success.setPassword("123456h");
        u1Success.setRepeatedPas("123456h");
        System.out.println(u1Success.toString()
                + registerPageTest.register(u1Success));


        User u2 = new User();
        System.out.println(u2.toString()
                + registerPageTest.register(u2));

        User u3 = new User();
        u3.setNickname("昵称");
        u3.setPassword("123");
        u3.setRepeatedPas("123");
        System.out.println(u3.toString()
                + registerPageTest.register(u3));

        User u4 = new User();
        u4.setUsername("testRegister");
        u4.setNickname("煜");
        u4.setPassword("123456h");
        u4.setRepeatedPas("123");
        System.out.println(u4.toString()
                + registerPageTest.register(u4));

        registerPageTest.close();
    }

在这里插入图片描述

3) 点击去登录按钮 测试注册成功的用例
 /**
     * 1.打开注册页面
     * 2.点击去登陆按钮
     * 3.找到输入框,清空之后在输入
     * 4.点击登录按钮,能否成功跳转到首页
     *
     * @param user
     * @return
     */
    public boolean clickLoginButton(User user) {
        driver.get(registerPageUrl);

        WebElement toLoginButton = driver.findElement(By.cssSelector("body > div > div > div > a"));
        if (toLoginButton == null) return false;
        toLoginButton.click();
        WebElement inputName = driver.findElement(By.cssSelector("#username"));
        WebElement inputPasw = driver.findElement(By.cssSelector("#password"));
        if (inputName == null || inputPasw == null) return false;
        inputName.clear();
        inputPasw.clear();
        inputName.sendKeys(user.getUsername());
        inputPasw.sendKeys(user.getPassword());
        driver.findElement(By.cssSelector("#submit")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofMillis(2000));
        WebElement element = null;
        try {
            element = driver.findElement(By.cssSelector("#nav_board_index > a > span"));
        } catch (Exception e) {
        }
        if (element == null) return false;
        return "首页".equals(element.getText());
    }

 @Test
    void clickLoginButton() {
        User user = new User();
        user.setUsername("testRegister11");
        user.setPassword("123456h");
        System.out.println("点击去登录:"+registerPageTest.clickLoginButton(user));
        registerPageTest.close();
    }

在这里插入图片描述

1.2.3 IndexPageTest

1) 首页不同帖子简要内容能否正常显示
 /**
     * 1.登录状态下访问首页
     * 2.查找 不同帖子是否存在=== elements 多个class为row的div标签是否存在多个
     *
     * @param user
     * @return
     */
    public boolean displayDiffPosts(User user) throws InterruptedException {
        Boolean login = login(user.getUsername(), user.getPassword());
        if (!login) return false;

        List<WebElement> elements = driver.findElements(By.cssSelector("#artical-items-body > div"));
        Thread.sleep(2000);
        return elements.size() >= 1;
    }
 @Test
    void displayDiffPosts() throws InterruptedException {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("h123");
        System.out.println("登录状态下首页不同帖子能否正常显示:" +
                indexPageTest.displayDiffPosts(user));
    }
2) 其他板块下不同帖子简要内容能否正常显示
 /**
     * 1.登录状态下点击不同板块
     * 2.查看该板块下的 不同帖子能否正常显示
     *
     * @param user
     * @return
     * @throws InterruptedException
     */
    public boolean clickDiffBoard(User user) throws InterruptedException {
        Boolean login = login(user.getUsername(), user.getPassword());
        if (!login) return false;
        //隐式等待5秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

        WebElement boardTitle = driver.findElement(By.cssSelector("#topBoardList > li:nth-child(2) > a > span"));
        if (boardTitle == null) return false;
        boardTitle.click();
        WebElement element = driver.findElement(By.cssSelector("#article_list_board_title"));
        System.out.println(element.getText());

        return element != null && element.getText().length() > 0;
    }
@Test
    void clickDiffBoard() throws InterruptedException {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("h123");
        System.out.println("登录状态下不同板块不同帖子能否正常显示:" +
                indexPageTest.clickDiffBoard(user));
    }
3) 搜索功能
 /**
     * 1.登录
     * 2.找到输入框
     * 3.输入关键词
     * 4.搜索下拉框 能否找到多个结果元素
     *
     * @param user
     * @return
     * @throws InterruptedException
     */
    public boolean search(User user) throws InterruptedException {
        Boolean login = login(user.getUsername(), user.getPassword());
        if (!login) return false;
        //隐式等待5秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

        WebElement inputSearch = driver.findElement(By.cssSelector("#input-search"));
        if (inputSearch == null) return false;
        inputSearch.sendKeys("java");
        List<WebElement> sarchElements = driver.findElements(By.cssSelector("#search-down>a"));
        return sarchElements.size() > 1;
    }
 @Test
    void seachr() throws InterruptedException {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("h123");
        System.out.println("登录状态下搜索功能能否正常使用:" +
                indexPageTest.search(user));
    }
4) 进入帖子详情页
 /**
     * 1.登录之后点击帖子正文
     * 2.跳转到详情页
     * 3.以详情页正文内容 能否查找到 并且正文长度大于0
     *
     * @param user
     * @return
     * @throws InterruptedException
     */
    public boolean intoDetailsPage(User user) throws InterruptedException {
        Boolean login = login(user.getUsername(), user.getPassword());
        if (!login) return false;
        //隐式等待5秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        WebElement postContent = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.content"));
        postContent.click();

        WebElement detailContent = driver.findElement(By.cssSelector("#details_article_content > p"));
        return detailContent != null && detailContent.getText().length() > 0;
    }
  @Test
    void intoDetailsPage() throws InterruptedException {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("h123");
        System.out.println("登录状态下点击帖子正文进入帖子详情页:" +
                indexPageTest.intoDetailsPage(user));
    }

在这里插入图片描述

1.2.4 MyPostPageTest

1) 登录状态下个人帖子列表能否正常显示
package forum;

import forum.model.User;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import java.time.Duration;

public class MyPostPageTest extends ObjTest {
    private final String loginPageUrl = "http://82.156.186.83:8080/sign-in.html";

    public MyPostPageTest() {
        init();
    }

    private Boolean login(String username, String password) throws InterruptedException {
        driver.get(loginPageUrl);
        WebElement inputName = driver.findElement(By.cssSelector("#username"));
        WebElement inputPasw = driver.findElement(By.cssSelector("#password"));
        if (inputName == null || inputPasw == null) return false;
        inputName.clear();
        inputPasw.clear();
        inputName.sendKeys(username);
        inputPasw.sendKeys(password);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);

        WebElement element = null;
        try {
            element = driver.findElement(By.cssSelector("#nav_board_index > a > span"));
        } catch (Exception e) {
        }
        if (element == null) return false;
        return "首页".equals(element.getText());
    }

    /**
     * 1.登录状态下进入个人帖子页面
     * 2.检查个人帖子页面元素是否正常显示
     *
     * @param user
     * @return
     * @throws InterruptedException
     */
    public boolean displayMyPostPage(User user) throws InterruptedException {
        Boolean login = login(user.getUsername(), user.getPassword());
        if (!login) return false;

        driver.findElement(By.cssSelector("#index_nav_avatar")).click();
        WebElement element = driver.findElement(By.cssSelector("#index_user_profile"));
        if (element == null) return false;
        element.click();
        //隐式等待5秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        WebElement registerTime = driver.findElement(By.cssSelector("#profile_createTime"));
        if (registerTime == null) return false;
        return registerTime.getText().length() > 0;
    }
}

 @Test
    void displayMyPostPage() throws InterruptedException {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("h123");
        myPostPageTest.displayMyPostPage(user);
    }

在这里插入图片描述

1.2.5 DoPostPageTest

1) 登录状态下发布帖子
public boolean doPost(User user, Article article) throws InterruptedException {
        login(user.getUsername(), user.getPassword());
        //隐式等待5秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > div")).click();
        WebElement inputTitle = driver.findElement(By.cssSelector("#article_post_title"));
        inputTitle.sendKeys(article.getTitle());
        Thread.sleep(3000);

        WebElement inputContent = driver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span"));
        Actions action = new Actions(driver);
        action.doubleClick(inputContent)
                .sendKeys(Keys.DELETE)
                .perform();
        action.sendKeys(article.getContent()).perform();
        Thread.sleep(5000);
        driver.findElement(By.cssSelector("#article_post_submit")).click();
        return true;
    }
 @Test
    void doPost() throws InterruptedException {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("h123");
        Article article = new Article();
        article.setTitle("ceshititle");
        article.setContent("secshiContent");
        doPostPageTest.doPost(user,article);
    }

发布帖子符合预期

相关文章:

  • 【网络安全 | 漏洞挖掘】账户接管+PII+原漏洞绕过
  • 【语音科学计算器】当前汇率
  • Python简单使用MinerU
  • 学习Linux准备2
  • 深入理解设计模式之解释器模式
  • 如何设计app测试用例
  • Docker下的Elastic search
  • 使用 LS-DYNA 光滑粒子流体动力学 (SPH) 进行搅拌摩擦焊接
  • 【CXX】3 其它Rust与C++互操作工具详解
  • 网页请求腾讯云环境的云函数
  • 【算法】直接插入排序、折半插入排序、希尔排序
  • 【JAVA】封装多线程实现
  • 【WebGL】fbo双pass案例
  • 《AI与NLP:开启元宇宙社交互动新纪元》
  • ue5地面上出现preview字样
  • 服务可用性评价指标
  • 第二届粤港澳大湾区数字经济与人工智能国际学术会议(DEAI 2025)
  • C++ MFC添加RichEditControl控件后,程序启动失败
  • 从零搭建微服务项目Pro(第1-1章——Quartz实现定时任务模块)
  • C++:std::thread、条件变量与信号量
  • 国防部:奉劝有关国家不要引狼入室,甘当棋子
  • 两部门发布外汇领域行刑反向衔接案例,织密金融安全“防护网”
  • 明天起,沪苏湖高铁、杭温高铁推出13款新型票制产品
  • 探索人类的心灵这件事,永远也不会过时
  • 潘功胜:坚定支持汇金公司在必要时实施对股票市场指数基金的增持
  • 巴基斯坦外交部:印度侵略行径侵犯巴主权