- 使用面向对象的设计模式,页面对象模式将测试代码和被测试页面的页面元素及其 *** 作方法进行分离,以此降低页面元素变化对测试代码的影响。
- 每一个测试页面都会被单独定义一个类,类中会定位所有需要参与测试的页面元素对象,并且定义 *** 作每一个页面元素对象的方法。
-
做法
以页面为单位独立建模
隐藏实现细节
本质是面向接口编程 -
优点
减少重复 find click 样板代码
提高测试用例的可读性
提高测试用例的可维护性
- 抽象每一个页面
- 页面中元素不暴露,仅暴露 *** 作元素的方法
- 页面不应该有繁琐的继承关系
- 页面中不是所有元素都需要涉及到,核心业务元素做建模使用
- 把页面划分功能模块,在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
打开百度页面通过封装实现登录 *** 作
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("购物"));
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)