美文网首页
page Object设计思想

page Object设计思想

作者: testerPM | 来源:发表于2020-02-06 19:02 被阅读0次
image.png

----------------------接下来开始采用po思想设计case-----------------------

设计原则:
1 每个类名包含page
2 每个页面分别作为一个page
3 每个页面的的元素作为各自page的成员变量
4 每个page中的元素的操作行为定义成一个方法------为了方便后面查看日志
总结:每个page保存的就是元素的定位信息和元素的行为

---------------------------接下来优化LoginCasesbak------------------------------------

(1)将登录页面和首页分别设计成1个page

1)LoginPage


package com.lemon.pageobject;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

/**
 * 把页面上的定位元素看成页面的成员变量
 * 每个元素封装成一个方法
 * @author TF
 *
 */
public class LoginPage {
    
    public WebDriver driver;
    //有参构造传入driver
    public LoginPage(WebDriver  driver) {
        this.driver=driver;
    }
    
    //成员变量1:手机号码输入框定位器
    private By mobilephone=By.name("phone");
    //成员变量2:密码输入框定位器
    private By password=By.name("password");
    //成员变量3:登录按钮定位器
    private By login=By.xpath("//button[text()='登录']");
    //成员变量4:提示信息--{此账号没有授权,请联系管理员!;帐号或密码错误!}--这是后端写的提醒,返回给前端
    private By msg=By.className("layui-layer-content");
    //成员变量5:input框错误提示信息{"请输入手机号";"请输入密码";"请输入正确的手机号"}
    private By tips=By.className("form-error-info");
    
    
    
    public void  inputMobilephone(String  data) {
        driver.findElement(mobilephone).sendKeys(data);

        
    }
    
    public void inputPassword(String  pwd) {
        driver.findElement(password).sendKeys(pwd);
        }
    
     public void clickLoginButton() {
         driver.findElement(login).click();
     }
     
     
     /**
      * 获取提醒信息文本值
     * @return
     */
    public String getMsgText() {
         WebDriverWait wait=new WebDriverWait(driver,5);
      return  wait.until(ExpectedConditions.visibilityOfElementLocated(msg)).getText();
     
     
     }
     
     
     /**
      * 获取input框校验提醒信息
     * @return
     */
    public String getTipsText() {
         
         WebDriverWait wait = new WebDriverWait(driver, 5);
        WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(tips));
        return until.getText();
        
        
     }
        /**
     * 获取手机号的属性值
     * 
     * @return
     */
    public String getPhoneAttribute() {
        WebDriverWait wait = new WebDriverWait(driver, 5);
        return wait.until(ExpectedConditions.visibilityOfElementLocated(mobilephone)).getAttribute("value");
        
    }
    
    
    
    
    
     
}



2)IndexPage

package com.lemon.pageobject;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class IndexPage {
    public WebDriver driver;
    // 首页--我的账户元素定位器
    private By myAccount = By.xpath("//a[contains(text(),'我的帐户')]");
    // 首页 --退出元素定位器
    private By quit = By.partialLinkText("退出");
    // 首页--登录元素定位器

    private By login = By.partialLinkText("登录");

    public IndexPage(WebDriver driver) {
        this.driver = driver;

    }
    

    /**
     * 待我的账户元素可见
     * @return
     */
    public boolean WaitmyAccountVisible() {
        
        WebDriverWait wait = new WebDriverWait(driver, 5);
        WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(myAccount));
        // until.isDisplayed();判断myAccount元素是否显示出来,返回的是boolean类型的值
        return until.isDisplayed();

    }

    /**
     * 点击退出
     */
    public void clickQuit() {
        
        WebDriverWait wait = new WebDriverWait(driver, 5);
        wait.until(ExpectedConditions.elementToBeClickable(quit)).click();

    }

    /**
     * 点击登录
     * 
     */
    public void clickLogin() {
        
        WebDriverWait wait = new WebDriverWait(driver, 5);
        wait.until(ExpectedConditions.elementToBeClickable(login)).click();

    }

    
    
    
}




(2) 设计登录模块的case---LoginCases

package com.lemon.testcases;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.lemon.pageobject.IndexPage;
import com.lemon.pageobject.LoginPage;

public class Logincases {
    public static WebDriver driver;

    @BeforeMethod
    public void setUp() {
        // 前置
        // 打开浏览器
        openBrowser("chrome");
        driver.get("http://120.78.128.25:8765/Index/login.html");
    }

    /**
     * 反向case数据提供源01
     * 
     * @return
     */
    @DataProvider
    public Object[][] loginDatas01() {

        Object[][] datas = { { "13333333331", "lemon123456", "此账号没有经过授权,请联系管理员!" },
                { "13323234545", "lemon12345", "帐号或密码错误!" }, { "13323234545", "lemon1234567", "帐号或密码错误!" },
                { "13323234545", "LEMON123456", "帐号或密码错误!" }, { "13323234545", "lemon  123456", "帐号或密码错误!" }

        };

        return datas;
    }

    /**
     * 反向case数据提供源02
     * 
     * @return
     */
    @DataProvider
    public Object[][] loginDatas02() {

        Object[][] datas = { { "", "lemon123456", "请输入手机号" }, { "13323234545", "", "请输入密码" },
                { "1332323454", "lemon123456", "请输入正确的手机号" }, { "133232345456", "lemon123456", "请输入正确的手机号" },
                { "133232$454%", "lemon123456", "请输入正确的手机号" }

        };

        return datas;
    }

    /**
     * 正向用例 成功登录
     */
    @Test(priority = 1, enabled = false)
    public void Login_success() throws InterruptedException {
        
        // 1实例化LoginPage
        LoginPage  loginPage=new LoginPage(driver);//调用有参够造
        // 2输入手机号
        loginPage.inputMobilephone("13323234545");
        // 3输入密码
        loginPage.inputPassword("lemon123456");
        // 4点击登录
        loginPage.clickLoginButton();
    
        //5 实例化IndexPage
        IndexPage indexPage=new IndexPage(driver);  
        //6断言--indexPage.WaitmyAccountVisible()返回的是True->即我的账户 元素可见说明断言成功
        Assert.assertTrue(indexPage.WaitmyAccountVisible());

    }

    /**
     * 反向用例1 未注册 密码错误(区分大小写,密码长度与正确的密码长度少一位和多一位)
     */
    @Test(priority = 2, dataProvider = "loginDatas01")
    public void login_failure01(String mobilephone, String pwd, String msg) {
        // 1实例化LoginPage
        LoginPage  loginPage=new LoginPage(driver);//调用有参够造
        // 2输入手机号
        loginPage.inputMobilephone(mobilephone);
        // 3输入密码
        loginPage.inputPassword(pwd);
        // 4点击登录
        loginPage.clickLoginButton();
        // 5 断言 loginPage.getMsgText() 对象点方法  获取提示信息文本值
        String actualValue = loginPage.getMsgText();
        String expectedValue =msg;// 获取元素的文本的值
        Assert.assertEquals(actualValue, expectedValue);

    }

    /**
     * 反向用例02 密码为空 账号为空 账号错误(10位,12位,数字和特殊字符组合)
     * 
     * @param mobilephone
     * @param pwd
     * @param msg
     */
    @Test(priority = 3, dataProvider = "loginDatas02")
    public void login_failure02(String mobilephone, String pwd, String msg) {
        // 1实例化LoginPage
        LoginPage  loginPage=new LoginPage(driver);//调用有参够造
        // 2输入手机号
        loginPage.inputMobilephone(mobilephone);
        // 3输入密码
        loginPage.inputPassword(pwd);
        // 4点击登录
        loginPage.clickLoginButton();
       //5 断言
        String actualValue = loginPage.getTipsText();
        String expectedValue = msg;// 获取元素的文本的值
        Assert.assertEquals(actualValue, expectedValue);

    }

    /**
     * 记住手机号
     * 记住手机号,这里默认是勾选的,所有脚本里面不用再找到
     * 记住手机号的元素进行.click()
     * @param mobilephone
     * @param pwd
     * @param msg
     */
    @Test
    public void login_remeber() {
        
        // 1实例化LoginPage
        LoginPage  loginPage=new LoginPage(driver);//调用有参够造
        // 2输入手机号
        loginPage.inputMobilephone("13323234545");
        // 3输入密码
        loginPage.inputPassword("lemon123456");
        // 4点击登录
        loginPage.clickLoginButton();
        // 5 实例化indexPage
         IndexPage indexPage=new IndexPage(driver); 
        //6 点击 退出
         indexPage.clickQuit();
        // 7 点击登录
        indexPage.clickLogin();
        // 8 断言:获取手机号---注意这里的手机号是<input value="手机号">
        String actualValue =loginPage.getPhoneAttribute();
        String expectedValue = "13323234545";// 获取元素的文本的值
        Assert.assertEquals(actualValue, expectedValue);
        

    }

    @AfterMethod
    public void teardown() {
        // 退出浏览器
        driver.quit();
    }

    public static void openBrowser(String browser) {
        if (browser.equals("chrome")) {
            // 1.设置chromedriver驱动文件的路径
            System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
            // 2.打开浏览器
            driver = new ChromeDriver();
            // 4.退出浏览器即关闭浏览器
            // quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
            // driver.quit();
        }
    }

}


注意:
Web自动化即UI自动化-->UI自动化最怕的就是稳定性,如果稳定性差,就没做的必要,所以要保证框架的稳定性,UI自动化有个通过性的指标,每次跑脚本的时候,case因为框架的bug导致脚本执行失败,那这个自动化脚本设计就是不通过的,没有做的必要了

相关文章

网友评论

      本文标题:page Object设计思想

      本文链接:https://www.haomeiwen.com/subject/rmbuxhtx.html