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(); } }