java的分层的page_【转】Selenium-PageObject分层设计思想

1:通常的分成设计模式

元素层+操作层+业务层

1.1:元素层

获取定位元素

1.2:操作层

对元素进行操作

1.3:业务层

传入参数 进行业务操作

2:PageObject登录的Demo演示

2.1:代码目录结构

32074671_202005091547560628737015.jpg

2.2:代码实现

2.2.1:Base部分代码

SelectDriver.java

package PageObject.Base;

/**

* Setup1:Base内的封装

* */

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

/**

* PageObject mode的

*

* 第一步:封装暖气的driver对象

*

* 作用:根据用户输入 选择不同的浏览器

* */

public class SelectDriver {

//这里只默认firefox 和 chrome两种浏览器

public WebDriver driverName(String browersName){

if(browersName.equalsIgnoreCase("firefox")){

return new FirefoxDriver();

}else{

return new ChromeDriver();

}

}

}

DriverBase.java

package PageObject.Base;

/**

* Setup1:Base内的封装

* */

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

/**

* PageObject第二部: 封装driver

*

* 作用:产生driver对象

* */

public class DriverBase {

private WebDriver driver;

/**

* 构造方法 创建对象时实例化driver

* */

public DriverBase(String browersName){

SelectDriver selectDriver = new SelectDriver();

//将SelectDriver中的driver对象赋值给"private WebDriver driver"中的driver 这样driver对象就有值了!!

this.driver = selectDriver.driverName(browersName);

}

/**

* 封装Element方法

* */

public WebElement element(By by){

return driver.findElement(by);

}

/**

* 封装get方法

* */

public void getUrl(String url){

driver.get(url);

}

}

BasePage.java

package PageObject.Base;

/**

* Setup1:Base内的封装

* */

import org.openqa.selenium.By;

import org.openqa.selenium.WebElement;

/**

* PageObject第三步:BasePage的封装

*

* */

public class BasePage {

private DriverBase driver;

/**

* 构造方法

* */

public BasePage(DriverBase driver){

this.driver = driver;

}

/**

* 封装Element

* */

public WebElement element(By by){

return driver.element(by);

}

/**

* 封装click操作

* */

public void click(WebElement element){

//判断element是否为空 null和非null的处理方式

if(element != null){

element.click();

}else{

System.out.println("你要点击的元素不存在");

}

}

/**

* 封装SendKeys操作

* */

public void sendKeys(WebElement element,String context){

//判断element是否为空 null和非null的处理方式

if(element != null){

element.clear();

element.sendKeys(context);

}else{

System.out.println("你要输入的元素不存在 输入内容失败");

}

}

}

2.2.2:Utils

ReadProperties.java

package PageObject.Utils;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.util.Properties;

public class ReadProperties {

private String filePath = "LoginElement.properties";

private Properties properties;

/**

* 构造方法 创建对象时自动返回pro对象  在new该对象的时候会自动加载readProperties()方法

* */

public ReadProperties(String filePath){

this.filePath = filePath;

//在new该对象的时候会自动加载readProperties()方法

this.properties = readProperties();

}

/**

* 返回已经加载properties文件的pro对象

* */

public Properties readProperties(){

//创建对象

Properties pro = new Properties();

//读取properties文件到缓存

try {

BufferedInputStream in = new BufferedInputStream(new FileInputStream(filePath));

//加载缓存到pro对象 prop.load(in)这么写 不能读取properties配置文件中的中文

pro.load(new InputStreamReader(in, "utf-8"));

} catch (Exception e) {

e.printStackTrace();

}

//返回pro对象

return pro;

}

/**

* 使用全局的properties对象获取key对应的value值

* @return

* */

public String getValue(String key){

return properties.getProperty(key);

}

}

2.2.3:元素层

ByMethon.java

package PageObject.page;

import org.openqa.selenium.By;

import PageObject.Utils.ReadProperties;

public class ByMethon {

/**

* 封装by 静态方法 直接调用

* @throws IOException

* */

public static By bystr(String PropertiesKey){

String PropertiesPath = "LoginElement.properties";

//创建ReadProperties对象

ReadProperties properties = new ReadProperties(PropertiesPath);

String value = properties.getValue(PropertiesKey);

//对value进行拆分

String LocateMethon = value.split(">")[0];

String LocateEle = value.split(">")[1];

//System.out.println(LocateMethon+"========="+LocateEle);

if(LocateMethon.equalsIgnoreCase("id")){

return By.id(LocateEle);

}else if(LocateMethon.equalsIgnoreCase("name")){

return By.name(LocateEle);

}else if(LocateMethon.equalsIgnoreCase("tagNmae")){

return By.tagName(LocateEle);

}else if(LocateMethon.equalsIgnoreCase("linkText")){

return By.linkText(LocateEle);

}else if(LocateMethon.equalsIgnoreCase("xpath")){

return By.xpath(LocateEle);

}else if(LocateMethon.equalsIgnoreCase("cssSelector")){

return By.cssSelector(LocateEle);

}else{

return By.partialLinkText(LocateEle);

}

}

}

loginPage.java

package PageObject.page;

import org.openqa.selenium.WebElement;

import PageObject.Base.BasePage;

import PageObject.Base.DriverBase;

public class loginPage extends BasePage{

/**

* 构造方法

* */

public loginPage(DriverBase driver) {

super(driver);

}

/**

* 获取登录按钮的element

* super类BasePage有封装一个element方法 此处element可以直接使用

* */

public WebElement findLoginButtion(){

//return super.element(ByMethon.bystr("userCountBox"));

return element(ByMethon.bystr("userCountBox"));

}

/**

* 获取"账号登录"的位置的element

* */

public WebElement checkCountLogin(){

return element(ByMethon.bystr("countLogin"));

}

/**

* 获取登录框的element

* */

public WebElement loginBox(){

return element(ByMethon.bystr("loginUser"));

}

/**

* 获取密码框的element

* */

public WebElement passwordElement(){

return element(ByMethon.bystr("loginPassword"));

}

/**

* 获取登录按钮的element

* */

public WebElement loginButtion(){

return element(ByMethon.bystr("loginButtion"));

}

}

2.2.4:操作层

loginPageHandle.java

package PageObject.handle;

/**

* 操作层

* */

import PageObject.Base.DriverBase;

import PageObject.page.loginPage;

/**

* 封装登录页面的操作 操作loginPage下的方法

* */

public class loginPageHandle {

private DriverBase driver;

private loginPage loginpage;

/**

* 构造方法

* */

public loginPageHandle(DriverBase driver){

this.driver = driver;

//loginpage放在这里的目的是使用driver,保证driver的一致性

loginpage = new loginPage(driver);

}

/**

* 封装寻找登录框按钮的操作

* */

public void findLoginButtion(){

loginpage.click(loginpage.findLoginButtion());

}

/**

* 封装点击账号登录的方法

* */

public void countLogin(){

loginpage.click(loginpage.checkCountLogin());;

}

/**

* 封装登录框的操作

* */

public void userLogin(String username){

loginpage.sendKeys(loginpage.loginBox(), username);

}

/**

* 封装密码输入

* */

public void passwordLogin(String password){

loginpage.sendKeys(loginpage.passwordElement(), password);

}

/**

* 封装点击登录的操作

* */

public void loginAction(){

loginpage.click(loginpage.loginButtion());

}

}

2.2.5:业务层

loginBuss.java

package PageObject.busession;

/**

* 业务层

* */

import PageObject.Base.DriverBase;

import PageObject.handle.loginPageHandle;

public class loginBuss {

private loginPageHandle loginPgeHandle;

/**

* 构造方法 实例化loginPageHandle

* */

public loginBuss(DriverBase driver){

loginPgeHandle = new loginPageHandle(driver);

}

/**

* 执行操作业务

* */

public void bussLogin(String username,String password){

loginPgeHandle.findLoginButtion();

loginPgeHandle.countLogin();

loginPgeHandle.userLogin(username);

loginPgeHandle.passwordLogin(password);

loginPgeHandle.loginAction();

}

}

2.2.6:执行用例

CaseBase.java

package PageObject.Case;

import PageObject.Base.DriverBase;

/**

* 生成driver对象 所有的case都集成这个类

* */

public class CaseBase {

/**

* 初始化driver

* */

public DriverBase initDriver(String browers){

DriverBase driver = new DriverBase(browers);

return driver;

}

}

loginCase.java

package PageObject.Case;

import org.junit.Test;

import PageObject.Base.DriverBase;

import PageObject.Utils.ReadProperties;

import PageObject.busession.loginBuss;

/**

* 测试登录操作

* */

public class loginCase extends CaseBase{

private DriverBase driver;

private loginBuss loginBuss;

/**

* 构造方法初始化loginBuss

* */

public loginCase(){

this.driver = initDriver("firefox");

loginBuss = new loginBuss(driver);

}

@Test

public void LoginTest() throws Exception{

//读取配置文件

ReadProperties readProperties = new ReadProperties("LoginElement.properties");

//这个driver来自于DriverBase  DriverBase类下封装了gerUrl方法

String URL = readProperties.getValue("URL");

driver.getUrl(URL);

Thread.sleep(3000);

//获取username 和 password

String username = readProperties.getValue("LoginInfo").split(">")[0];

String password = readProperties.getValue("LoginInfo").split(">")[1];

loginBuss.bussLogin(username, password);

}

}

2.2.7:配置文件

LoginElement.properties

#URL

URL=https://www.csdn.net/

#用户名和密码

LoginInfo=你的账户>你的密码

#页面获取登录框的位置

userCountBox=xpath>.//*[@id='csdn-toolbar']/div/div/ul/li[5]/a[1]

#获取"账号登录"的位置

countLogin=xpath>html/body/div[3]/div/div/div[2]/div/h3/a

#输入账号的位置

loginUser=id>username

#输入密码框的位置

loginPassword=xpath>.//*[@id='password']

#登录按钮的位置

loginButtion=xpath>.//*[@id='fm1']/input[8]

————————————————

版权声明:本文为CSDN博主「AnndyTuo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/hujyhfwfh2/article/details/81055948

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值