文章目錄
- 一、自動化實施步驟
- 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());}
@Testvoid 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());}
@Testvoid 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());}
@Testvoid 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;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", nickname='" + nickname + '\'' +", repeatedPas='" + repeatedPas + '\'' +'}';}
}
@Testvoid 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());}
@Testvoid 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;}
@Testvoid 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;}
@Testvoid 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;}
@Testvoid 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;}
@Testvoid 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;}
}
@Testvoid 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;}
@Testvoid 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);}
發布帖子符合預期