鸟语林-论坛系统自动化测试
文章目录
- 一、自动化实施步骤
- 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);
}
发布帖子符合预期