• Selenium WebUI自动化测试--PO中传递driver


      UI自动测试时,我们常会选择PO设置模式,在PO设计模式中,我们需要考虑如何将页面元素和页面提供的功能优雅的封装,今天简单的讲下两种页面封装方法,仅供参考。

    • 第一种 Page中传递driver  

      在这之前,UI自动化测试中,一直使用传递方式进行driver,也是一种比较简洁的方法,代码如下:

      

     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设计模式时,一定要理解清楚,只有把页面封装好了,在后期的执行和维护时才不会头大;这里介绍几点理解:

      对于PO类中的方法:

        1.将UI页面中所能提供的功能进行封装

          【理解】:先去了解页面中能够提供的功能,然后进行封装,比如登陆页面,一般包含用户登陆,找回密码操作,我们可以将登陆、找回密码分别作为方法封装在LoginPage页面中,使用时直接调用,代码如下(继承driver方式):

    /**
     * @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.同样的行为 不同的结果,可以建模在不同的方法

          【理解】在使用相同的操作,由于输入的参数不一致,可能会得到不同的结果和页面跳转;比如代码如下:

    /**
     * @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或是用于断言的数据

          【理解】这里大家在多试几个用例后,一定会体验到他的好处。

  • 相关阅读:
    WINFORM中的COMBOX模糊查询
    C#的XML序列化及反序列化
    C#调用webservice简单实例
    ORACLE简单触发器
    关于搭建webservice以及无法通过URL访问的简易解决办法
    URL类型入参串调用接口
    起点
    dom的操作
    固定定位
    字体、文本属性和背景图定位
  • 原文地址:https://www.cnblogs.com/zhap/p/12585334.html
Copyright © 2020-2023  润新知