开源测试框架——页面对象(Page Object)模式

开源测试框架——页面对象(Page Object)模式,第1张

开源测试框架——页面对象(Page Object)模式 页面对象模式
  • 使用面向对象的设计模式,页面对象模式将测试代码和被测试页面的页面元素及其 *** 作方法进行分离,以此降低页面元素变化对测试代码的影响。
  • 每一个测试页面都会被单独定义一个类,类中会定位所有需要参与测试的页面元素对象,并且定义 *** 作每一个页面元素对象的方法。
Page Object模式
  • 做法
    以页面为单位独立建模
    隐藏实现细节
    本质是面向接口编程

  • 优点
    减少重复 find click 样板代码
    提高测试用例的可读性
    提高测试用例的可维护性

Page Object 五大设计原则
  1. 抽象每一个页面
  2. 页面中元素不暴露,仅暴露 *** 作元素的方法
  3. 页面不应该有繁琐的继承关系
  4. 页面中不是所有元素都需要涉及到,核心业务元素做建模使用
  5. 把页面划分功能模块,在Page中实现这些功能方法
三种方法
  • 以get***封装页面对象

  • 以@FindBy封装页面对象
    @FindBy(id= “A”)
    private WebElement A;
    取交集
    @FindBys({
    @FindBy(className = “A”),
    @FindBy(id = “B”) }
    )
    public WebElement AB;
    取并集
    @FindAll({
    @FindBy(id = “A”),
    @FindBy(id = “B”)
    })
    public List aAndB;

  • 页面类继承 LoadableComponent

实例 例一:以get***封装页面对象

打开百度页面通过封装实现登录 *** 作

package com.lhz.core;

import java.time.Duration;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;

/**
 * 
 * @author Administrator
 *
 */
public class BaseTest {
	public static WebDriver driver;//null

	@BeforeClass
	public void initBrowser() {
		System.setProperty("webdriver.gecko.driver", "F:\kaiyuanceshi\geckodriver30.exe");
		System.setProperty("webdriver.firefox.bin", "C:\Program Files\Mozilla Firefox\firefox.exe");
		
		driver =new FirefoxDriver();
		driver.manage().window().maximize();
		
		driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
		
	}
	
//	@AfterClass//实现在整个测试类完成后将浏览器退出并释放后台资源
	public void quitBrowser() {
		this.driver.quit();
		
	}
	
}

package CSDNwork;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class BaiduLogin {

	private WebDriver driver;
	
	public BaiduLogin(WebDriver driver) {//构造方法
		this.driver=driver;
	}
	
	public WebDriver getDriver() {
		return this.driver;
	}
	
	public WebElement getFirstLogin() {//返回登录按钮元素,在这里就先用id来获取了,到后面其实可以将其参数化的
		return this.driver.findElement(By.id("s-top-loginbtn"));
	}
	
	public WebElement getUserName() {
		return this.driver.findElement(By.id("TANGRAM__PSP_11__userName"));
	}
	
	public WebElement getPassword() {
		return this.driver.findElement(By.id("TANGRAM__PSP_11__password"));
	}
	
	public WebElement getSecondLogin() {
		return this.driver.findElement(By.id("TANGRAM__PSP_11__submit"));
	}
	
	public void login(String name,String password) throws InterruptedException {
		this.driver.get("https://www.baidu.com/");
		this.getFirstLogin().click();
		Thread.sleep(1500);//休眠一会儿防止网速太慢加载不出登录页面来
		this.getUserName().sendKeys(name);
		this.getPassword().sendKeys(password);
		this.getSecondLogin().click();
		Thread.sleep(1000);
	}
}

package CSDNwork;

import org.testng.annotations.Test;

import com.lhz.core.BaseTest;

public class LoginTest extends BaseTest{

	@Test
	public void LoginTest() throws InterruptedException {
		BaseTest baseTest=new BaseTest();
		BaiduLogin loginPage=new BaiduLogin(baseTest.driver);
		loginPage.login("huayu8086","123456");
	}
}

效果如下:

例二:
  • 以百度搜索为例:
  • 声明一个名为SearchPage的类,并且通过定位表达式找到搜索框和搜索按钮“百度一下” ,分别定义输入的方法和单击的方法
  • 创建两个类:页面对象类,测试类
package com.lhz.core;

import java.time.Duration;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;

/**
 * 
 * @author Administrator
 *
 */
public class BaseTest {
	public static WebDriver driver;//null

	@BeforeClass
	public void initBrowser() {
		System.setProperty("webdriver.gecko.driver", "F:\kaiyuanceshi\geckodriver30.exe");
		System.setProperty("webdriver.firefox.bin", "C:\Program Files\Mozilla Firefox\firefox.exe");
		
		driver =new FirefoxDriver();
		driver.manage().window().maximize();
		//闅愬紡绛夊緟
		driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
		
	}
	
//	@AfterClass
	public void quitBrowser() {
		this.driver.quit();
		
	}
	
}

package CSDNwork;

import static org.testng.Assert.assertTrue;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.Test;

public class SearchPage {

	WebDriver driver;
	
	String url="https://www.baidu.com/";
	
	@FindBy(id="kw")
	public WebElement inputFrame;
	
	@FindBy(id="su")
	public WebElement searchButton;
	
	public SearchPage(WebDriver wd) {
		this.driver=wd;
		PageFactory.initElements(wd, this);
		
	}
	
	public void searchFrame(String context) throws InterruptedException {
		this.driver.get(url);
		this.inputFrame.sendKeys(context);
		this.searchButton.click();
		Thread.sleep(1500);
	}
	
	public WebDriver getDriver() {
		return this.driver;
	}
	
}


package CSDNwork;

import static org.testng.Assert.assertTrue;

import org.openqa.selenium.WebDriver;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.lhz.core.BaseTest;
import com.lhz.pages.AdminLoginPage2;

public class SearchPageTest extends BaseTest{
	SearchPage loginPage;
	@BeforeMethod
	public void init() {
		System.out.println("init");
		loginPage=new SearchPage(this.driver);
	}

	@Test
	public void testBaidu() throws InterruptedException {
		loginPage.searchFrame("淘宝");
		Thread.sleep(1500);
		assertTrue(loginPage.getDriver().getPageSource().contains("购物"));
	}
}



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存