页面对象模式(1)

页面对象模式介绍:

  页面对象模式是目前自动化测试领域普遍使用的设计模式之一,此模式可以大大提高测试代码的复用率,提高测试脚本的编写效率和维护效率

1.1使用PageFactory

测试网址:

https://mail.163.com/

1.1.1使用PageFactory类给测试类提供待操作的页面元素

(1)新建两个包分别存放对象类、测试类

LoginPage类的源代码

package cn.pageobject;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class LoginPage {
    //使用FindBy注解,定位到需要操作的页面元素
    @FindBy(xpath="//input[@placeholder='邮箱帐号或手机号码']")
    public WebElement username;
    @FindBy(xpath="//input[@placeholder='输入密码']")
    public WebElement password;
    @FindBy(xpath="//a[@id='dologin']")
    public WebElement loginButton;
    public LoginPage(WebDriver driver){
        PageFactory.initElements(driver, this);
    }
}

Test163mail的源代码:

package cn.test;

import org.testng.annotations.Test;

import cn.pageobject.LoginPage;

import org.testng.annotations.BeforeMethod;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;

public class Test163mail {
    WebDriver driver;
    String url ="https://mail.163.com/";
  @Test
  public void testLogin() throws InterruptedException {
      //生成一个LoginPage对象实例
      LoginPage loginpage = new LoginPage(driver);
      //进入登录框所在的frame,0代表第一个frame
      driver.switchTo().frame(0);
      //直接使用页面对象输入用户名
      loginpage.username.sendKeys("m17805983076");
      //直接使用页面对象输入密码
      loginpage.password.sendKeys("****");
      //直接使用页面对象单击登录
      loginpage.loginButton.click();
      //等待5秒
      Thread.sleep(5000);
      //断言登录后页面是否包含“未读邮件”关键字
      Assert.assertTrue(driver.getPageSource().contains("未读邮件"));
  }
  @BeforeMethod
  public void beforeMethod() {
      System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
      driver = new ChromeDriver();
      driver.manage().window().maximize();
      driver.get(url);
  }

  @AfterMethod
  public void afterMethod() {
      driver.quit();
  }

}

 1.1.2使用PageFactory类封装页面元素的操作方法

1.1.1节并没有在页面对象类中实现页面元素的操作方法,此节对此部分进行优化

LoginPage类的源代码:

package cn.pageobject;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class LoginPage {
    //使用FindBy注解,定位到需要操作的页面元素
    @FindBy(xpath="//input[@placeholder='邮箱帐号或手机号码']")
    public WebElement username;
    @FindBy(xpath="//input[@placeholder='输入密码']")
    public WebElement password;
    @FindBy(xpath="//a[@id='dologin']")
    public WebElement loginButton;
    public WebDriver driver;
    public String url = "https://mail.163.com/";
    public LoginPage(){
        System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        PageFactory.initElements(driver, this);
    }
    public void load(){
        driver.manage().window().maximize();
        driver.get("https://mail.163.com/");
    }
    public void frame(){
        driver.switchTo().frame(0);
    }

    public void quit(){
        driver.quit();
    }
    public void login(){
        username.sendKeys("m17805983076");
        password.sendKeys("*****");
        loginButton.click();
    }
    public WebDriver getDriver(){
        return driver;
    }
}

Test163mail类的源代码:

package cn.test;

import org.testng.annotations.Test;

import cn.pageobject.LoginPage;
import org.openqa.selenium.WebDriver;
import org.testng.Assert;

public class Test163mail {
    public WebDriver driver;
  @Test
  public void testLogin() throws InterruptedException {
      //生成一个LoginPage对象实例
      LoginPage loginpage = new LoginPage();
      //调用登录页面对象的load方法
      loginpage.load();
      //进入登录框所在的frame,0代表第一个frame
      loginpage.frame();
      //调用登录页面的方法
      loginpage.login();
      //等待5秒
      Thread.sleep(5000);
      //断言登录后页面是否包含“未读邮件”关键字
      Assert.assertTrue(loginpage.getDriver().getPageSource().contains("未读邮件"));
      loginpage.quit();
  }
}

代码解释:

  从上面的实例中可以看到页面元素的定位均在LoginPage类中实现了,如果页面元素发生了一定变化,测试人员只需修改LoginPage类中的定位表达式,从而降低测试代码的维护工作

posted @ 2019-03-20 16:44  心生意动  阅读(155)  评论(0编辑  收藏  举报