首页 > 技术文章 > 页面对象模式(3)

z-zzz 2019-03-22 09:19 原文

3.1多个PageObject的自动化实例

自动化测试实现的3个测试用例如下

(1)在163邮箱使用正确的账号错误的密码进行登录,登录失败判断是否出现账号或密码错误关键字

(2)在163邮箱使用正确的账号密码进行登录,登录成功判断是否出现首页里的未读邮件关键字

(3)在163邮箱登录成功后,单击写信,给自己写封邮件并发送,邮件发送成功后页面出现发送成功关键字

测试代码:

ObjectLoginPage类:

package cn.pageobject;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.LoadableComponent;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;

public class ObjectLoginPage extends LoadableComponent<ObjectLoginPage>{
    //使用Find注解定位需要操作的页面元素
    @FindBy(xpath="//input[@placeholder='邮箱帐号或手机号码']")
    public WebElement userName;
    @FindBy(xpath="//input[@placeholder='输入密码']")
    public WebElement password;
    @FindBy(xpath="//a[@id='dologin']")
    public WebElement loginButton;
    private String url = "https://mail.163.com/";
    private String title = "网易免费邮";
    public WebDriver driver;
    //函数参数赋值给类成员变量,初始化PageFactory
    public ObjectLoginPage(WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }
    //增加需要覆盖的方法load
    @Override
    protected void load(){
        this.driver.get(url);
        this.driver.manage().window().maximize();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //增加需要覆盖的方法close
    public void close(){
        driver.close();
    }
    //登录操作的封装方法,函数方法返回一个Homepage对象
    public HomePage login(){
        //调用load方法访问163邮箱
        //load();
        WebDriverWait wait = new WebDriverWait(driver, 10);
        //页面判断是否显示了用户名输入框
        this.driver.switchTo().frame(0);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@placeholder='邮箱帐号或手机号码']")));
        //清楚用户名输入框中的字符,保证用户名输入框为空
        userName.clear();
        //输入邮箱号
        userName.sendKeys("m17805983076");
        //输入密码
        password.sendKeys("*****");
        //单击登录按钮
        loginButton.click();
        //登录后返回一个Homepage对象
        return new HomePage(driver);
    }
    public String getPageSource(){
        return driver.getPageSource();
    }
    //登录失败的封装方法 返回一个ObjectLoginPage页面对象s
    public ObjectLoginPage LoginExpectingFailure() throws InterruptedException{
        //load();
        WebDriverWait wait = new WebDriverWait(driver, 10);
        //页面判断是否显示了用户名输入框
        this.driver.switchTo().frame(0);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@placeholder='邮箱帐号或手机号码']")));
        userName.clear();
        userName.sendKeys("m17805983076");
        password.sendKeys("123456");
        loginButton.click();
        //登录失败后,当前测试网址不会跳转,停留在当前登录页面
        return new ObjectLoginPage(driver);
    }
    //增加了需要覆盖的isLoaded
    @Override
    protected void isLoaded() throws Error{
        //断言判断访问后的页面是否包含网易免费邮这几个关键字
        //判断是否加载了正确的页面
        Assert.assertTrue(driver.getTitle().contains(title));
    }
}

HomePage类:

package cn.pageobject;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;

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

public class HomePage {
    public WebDriver driver;
    //通过FinadBy注解定位页面元素,注意使用文字定位时最好直接从页面的源码里复制,例如写信中间就有空格,如果没注意就定位不到了
    @FindBy(xpath="//span[text()='写 信']")
    public WebElement writemaillink;
    @FindBy(xpath="//span[text()='发送']")
    public WebElement sendmailbutton;
    //定义构造函数,函数参数复制给成员变量driver,初始化PageFactory
    public HomePage(WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }
    //写信的封装方法
    public void writeMail() throws InterruptedException{
        //单击写信
        writemaillink.click();
        //等待5秒,让页面完成写信跳转
        Thread.sleep(5000);
        setAndctrlVClipboardData("m17805983076@163.com");
        pressTabKey();
        setAndctrlVClipboardData("给自己的主题邮件");
        pressTabKey();
        setAndctrlVClipboardData("给自己的邮件内容");
        sendmailbutton.click();
    }
    public static void setAndctrlVClipboardData(String string) {
        //模拟ctrl+v操作
        StringSelection stringSelection = new StringSelection(string);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e1) {
            e1.printStackTrace();
        }
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);    
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //按tab键的封装方法
    public static void pressTabKey(){
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e1) {
            e1.printStackTrace();
        }
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);
    }
    //获取页面源码的封装方法
    public String getPageSource(){
        return driver.getPageSource();
    }
    //增加了需要覆盖的close方法
    public void close(){
        this.driver.close();
    }
}

ObjectTest163mail测试类:

package cn.test;

import org.testng.annotations.Test;

import cn.pageobject.HomePage;
import cn.pageobject.ObjectLoginPage;

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 ObjectTest163mail {
    public WebDriver driver;
  //测试登录失败的测试用例
  @Test
  public void testLoginFail() throws InterruptedException {
      ObjectLoginPage objectloginpage = new ObjectLoginPage(driver);
      objectloginpage.get();
      //调用登录失败的测试用例
      objectloginpage.LoginExpectingFailure();
      Thread.sleep(5000);
      //正常情况下断言可以通过,但有时登录会报超时所以断言可能出现expected [true] but found [false]这个结果
      Assert.assertTrue(objectloginpage.getPageSource().contains("帐号或密码错误"));
      objectloginpage.close();
  }
  //测试登录成功的测试用例
  @Test
  public void testLoginSuccess() throws InterruptedException {
      ObjectLoginPage objectloginpage = new ObjectLoginPage(driver);
      objectloginpage.get();
      //调用登录失败的测试用例
      HomePage homePage = objectloginpage.login();
      Thread.sleep(5000);
      Assert.assertTrue(homePage.getPageSource().contains("未读邮件"));
      homePage.close();
  }
  //测试发送邮件的成功的测试用例
  @Test
  public void testwriteMail() throws InterruptedException {
      ObjectLoginPage objectloginpage = new ObjectLoginPage(driver);
      objectloginpage.get();
      //调用登录失败的测试用例
      HomePage homePage = objectloginpage.login();
      Thread.sleep(5000);
      homePage.writeMail();
      Thread.sleep(5000);
      Assert.assertTrue(homePage.getPageSource().contains("发送成功"));
      homePage.close();
  } 
  @BeforeMethod
  public void beforeMethod() {
      System.setProperty("webdriver.chrome.driver",  "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
      driver = new ChromeDriver();
  }

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

}

 

推荐阅读