UI自動測試時,咱們常會選擇PO設置模式,在PO設計模式中,咱們須要考慮如何將頁面元素和頁面提供的功能優雅的封裝,今天簡單的講下兩種頁面封裝方法,僅供參考。web
在這以前,UI自動化測試中,一直使用傳遞方式進行driver,也是一種比較簡潔的方法,代碼以下:chrome
1 /** 2 * @Author: zap 3 * @Date: 2020/3/27 23:58 4 * @Description: 5 */ 6 public class P0_LoginPage { 7 WebDriver driver; 8 public P0_LoginPage(WebDriver driver) { 9 this.driver = driver; 10 PageFactory.initElements(driver, this); 11 } 12 13 //username TextBox 14 @FindBy(xpath = "//*[@id='username']") 15 WebElement usernameTextBox; 16 17 /** 18 * @function Input username 19 * @param username 20 */ 21 public void setUsernameTextBox(String username) { 22 usernameTextBox.clear(); 23 usernameTextBox.sendKeys(username); 24 } 25 26 //password TextBox 27 @FindBy(xpath = "//*[@id='password']") 28 WebElement passwordTextBox; 29 30 /** 31 * @function Input password 32 * @param password 33 */ 34 public void setPasswordTextBox(String password) { 35 passwordTextBox.clear(); 36 passwordTextBox.sendKeys(password); 37 } 38 39 //login button 40 @FindBy(xpath = "//button[@class = 'ant-btn ant-btn-lg']") 41 WebElement loginButton; 42 43 /** 44 * @function click LoginButton 45 */ 46 public void clickLoginButton() { 47 loginButton.click(); 48 } 49 50 public HomePage toUserLogin(String user, String pwd){ 51 setUsernameTextBox(user); 52 setPasswordTextBox(pwd); 53 clickLoginButton(); 54 return new HomePage(); 55 } 56 }
先建立一個BasePage類,代碼以下:設計模式
/** * @Author: zap * @Date: 2020/3/27 22:10 * @Description: */ public class BasePage { public static WebDriver driver; public void closeBrowser(){ driver.close(); } }
而後在新頁面中 去繼承BasePage,經過父類中定義的driver,在每一個頁面中來使用,繼承以下:測試
/** * @Author: zap * @Date: 2020/3/27 22:12 * @Description: */ public class LoginPage extends BasePage{ /** * @function: 用戶登錄 * @return: 返回值須要考慮登錄成功和登錄失敗 返回的頁面的不一樣 */ public HomePage toUserLogin(String user, String pwd){ String baseURL = "http://***********/#/"; //URL地址只作參考 System.setProperty("webdriver.chrome.driver", "E:\\Study\\Test\\SeleniumUIDependentFiles\\WebDriver\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.manage().window().maximize(); driver.get(baseURL); //1.輸入用戶名 WebElement userTextBox = driver.findElement(By.xpath("//*[@id='username']")); userTextBox.clear(); userTextBox.sendKeys(user); // Thread.sleep(500); //2.輸入用戶密碼 WebElement pwdTextBox = driver.findElement(By.xpath("//*[@id='password']")); pwdTextBox.clear(); pwdTextBox.sendKeys(pwd); //3.點擊登錄按鈕 WebElement submitButton = driver.findElement(By.xpath("//button[@class='ant-btn ant-btn-lg']")); submitButton.click(); //4.根據結果判斷返回哪一個頁面 這裏不深刻考慮 return new HomePage(); } }
在使用PO設計模式時,必定要理解清楚,只有把頁面封裝好了,在後期的執行和維護時纔不會頭大;這裏介紹幾點理解:this
對於PO類中的方法:spa
1.將UI頁面中所能提供的功能進行封裝設計
【理解】:先去了解頁面中可以提供的功能,而後進行封裝,好比登錄頁面,通常包含用戶登錄,找回密碼操做,咱們能夠將登錄、找回密碼分別做爲方法封裝在LoginPage頁面中,使用時直接調用,代碼以下(繼承driver方式):code
/** * @Author: zap * @Date: 2020/3/27 22:11 * @Description: */ public class TestCase_UserLogin { LoginPage loginPage; @BeforeMethod(alwaysRun=true) public void beforeClass(){ loginPage = new LoginPage(); } @Test(alwaysRun=true) public void userLogin(){ loginPage.toUserLogin("test1", "test1"); } @AfterMethod public void afterClass(){ loginPage.closeBrowser(); } }
2.一樣的行爲 不一樣的結果,能夠建模在不一樣的方法blog
【理解】在使用相同的操做,因爲輸入的參數不一致,可能會獲得不一樣的結果和頁面跳轉;好比代碼以下:繼承
/** * @Author: zap * @Date: 2020/3/28 0:19 * @Description: */ public class P1_LoginPage { /** * @function 進入登錄頁面 * @return */ public LoginPage toLoginPageFail (){ /* 失敗登錄操做 */ return new LoginPage(); } /** * @function 進入主頁面 * @return */ public HomePage toLoginPageSuccess(){ /* 成功登錄操做 */ return new HomePage(); } }
3..方法應該返回其餘的PageObject或是用於斷言的數據
【理解】這裏你們在多試幾個用例後,必定會體驗到他的好處。