Page Object实例(一) Java + Selenium 登录163邮箱

Page Object 是什么:

  Page Object(selenium wiki)是Selenium2开始提供的一种代码设计模式. 其核心思想是把web页面的元素查找及操作和页面测试分离开. 这样之后的更新和维护中如果有页面元素变动, 不需要修改测试类, 只要修改其对应的页面元素的查找代码即可. 

登录163邮箱的实例包括:

其中:

1. LoginPage.java 是主要测试页面, 包括查找元素, 操作元素实现登录

2. HomePage.java 是登录成功后会跳转到的页面, 在此用来作为登录操作方法的返回值及拿个元素验证登录成功, 更多的是可以接着对此页面进行测试

3. LoginTest.java用来执行登录页面的测试, 可以包括验证登录成功/失败或其他测试用例

4. SeleniumInit.java 用来起driver, 里面可以放起不同浏览器的方法

实例代码: 

LoginPage.java

 1 import org.openqa.selenium.By;
 2 import org.openqa.selenium.WebDriver;
 3 import org.openqa.selenium.WebElement;
 4 import java.util.List;
 5 import java.util.concurrent.TimeUnit;
 6 
 7 public class LoginPage {
 8     WebDriver driver;
 9 
10     public LoginPage(WebDriver driver) {
11         this.driver = driver;
12     }
13 
14     public HomePage login(String user, String pwd) {
15         //隐式等待页面的加载
16         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
17         WebElement accountLogin = driver.findElement(By.id("lbNormal"));
18         accountLogin.click();
19         //进入frame
20         List<WebElement> iframes = driver.findElements(By.tagName("iframe"));
21         String id = iframes.get(0).getAttribute("id");
22         if (id != null) {
23             driver.switchTo().frame(id);
24         }
25         WebElement loginEmail = driver.findElement(By.name("email"));
26         WebElement loginPassword = driver.findElement(By.name("password"));
27         WebElement loginButton = driver.findElement(By.id("dologin"));
28         loginEmail.sendKeys(user);
29         loginPassword.sendKeys(pwd);
30         loginButton.click();
31         //跳出frame
32         driver.switchTo().defaultContent();
33         //登录成功后跳转到新页面, 新页面的元素及处理和当前页面分离
34         return new HomePage(driver);
35     }
36 }

HomePage.java

 1 import org.openqa.selenium.By;
 2 import org.openqa.selenium.WebDriver;
 3 import org.openqa.selenium.WebElement;
 4 
 5 public class HomePage {
 6     WebDriver driver;
 7 
 8     public HomePage(WebDriver driver) {
 9         this.driver = driver;
10     }
11 
12     //判断登录是否成功的方法, 当前页面类似收发邮件可另加方法
13     public boolean idExists() {
14         WebElement userID = driver.findElement(By.id("spnUid"));
15         System.out.println(userID.getText());
16         return userID.isDisplayed();
17     }
18 }

LoginTest.java

 1 import org.openqa.selenium.WebDriver;
 2 import org.openqa.selenium.support.PageFactory;
 3 import org.testng.Assert;
 4 import org.testng.annotations.Test;
 5 import po.selenium.pages.HomePage;
 6 import po.selenium.pages.LoginPage;
 7 import po.selenium.utils.SeleniumInit;
 8 
 9 public class LoginTest {
10     String URL = "https://mail.163.com/";
11     @Test
12     public void TC001_LoginSuccess() {
13         String user = "邮箱账号";
14         String pwd = "邮箱密码";
15         SeleniumInit seleniumInit = new SeleniumInit();
16         WebDriver driver = seleniumInit.getFFDriver();
17         try {
18             driver.get(URL);
19             LoginPage loginPage = new LoginPage(driver);
20             PageFactory.initElements(driver, loginPage);
21             HomePage homePage = loginPage.login(user, pwd);
22             Assert.assertTrue(homePage.idExists(), "login failed");
23         } catch (Exception e) {
24             e.printStackTrace();
25         } finally {
26             driver.quit();
27         }
28     }
29 
30     @Test
31     public void TC002_LoginFailedWithWrongPwd() {
32         String user = "邮箱账号";
33         String pwd = "错误的邮箱密码";
34         SeleniumInit seleniumInit = new SeleniumInit();
35         WebDriver driver = seleniumInit.getFFDriver();
36         try {
37             driver.get(URL);
38             LoginPage loginPage = new LoginPage(driver);
39             PageFactory.initElements(driver, loginPage);
40             //同一个页面, 同一个方法可以进行不同的测试
41             HomePage homePage = loginPage.login(user, pwd);
42             Assert.assertTrue(homePage.idExists(), "login failed");
43         } catch (Exception e) {
44             e.printStackTrace();
45         } finally {
46             driver.quit();
47         }
48     }
49 }

以上就是Page Object 的页面与操作与测试分离的思想, 主要用来展示页面分离的思想, 还有类似页面元素和操作耦合在一起, URL这类信息暴露不方便统一维护等问题, 之后一一解决.

原文地址:https://www.cnblogs.com/fayez/p/11702727.html