Selenium WebUI自動化測試--PO中傳遞driver

  UI自動測試時,咱們常會選擇PO設置模式,在PO設計模式中,咱們須要考慮如何將頁面元素和頁面提供的功能優雅的封裝,今天簡單的講下兩種頁面封裝方法,僅供參考。web

  • 第一種 Page中傳遞driver  

  在這以前,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 }

 

  • 第二種 Page中繼承driver

  先建立一個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或是用於斷言的數據

      【理解】這裏你們在多試幾個用例後,必定會體驗到他的好處。

相關文章
相關標籤/搜索