Appium移动端自动化测试-PageObject模式

1:PageObject Mode代码结构

2:代码的实现

2.1:封装Server部分代码 

用来启动Appium 分配端口参考 :https://blog.csdn.net/hujyhfwfh2/article/details/83003680

2.2:封装Utils方法(包含By方法和读取配置文件方法)

ReadProperties方法

package cn.App.ObjectMode.APPobiectMode.Utlis;
 
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Properties;
 
public class ReadProperties {		
		private String filePath;
		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对象  这样写可以读取中文
				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);
		}
}

ByMethon

package cn.App.ObjectMode.APPobiectMode.Utlis;

import org.openqa.selenium.By;

/**
 * 封装By方法
 * */

public class ByMethon {

	private static ReadProperties properties = new ReadProperties("configs//Element.properties");
	
	/**
	 * 静态by方法
	 * */
	public static By by(String Key){
		
		String value = properties.getValue(Key);
		
		String LocateMethon = value.split(">")[0];
		String LocateEle = value.split(">")[1];
		
		if(LocateMethon.equalsIgnoreCase("id")){
			
			return By.id(LocateEle);
			
		}else if(LocateMethon.contentEquals("name")){
			
			return By.name(LocateEle);
			
		}else if(LocateMethon.equalsIgnoreCase("className")){
			
			return By.className(LocateEle);
			
		}else{
			
			return By.xpath(LocateEle);
		}
		
	}
	
}

2.3:Base层代码 初始化driver启动APP

initDriver

package cn.App.ObjectMode.APPobiectMode.Utlis;

import org.openqa.selenium.By;

/**
 * 封装By方法
 * */

public class ByMethon {

	private static ReadProperties properties = new ReadProperties("configs//Element.properties");
	
	/**
	 * 静态by方法
	 * */
	public static By by(String Key){
		
		String value = properties.getValue(Key);
		
		String LocateMethon = value.split(">")[0];
		String LocateEle = value.split(">")[1];
		
		if(LocateMethon.equalsIgnoreCase("id")){
			
			return By.id(LocateEle);
			
		}else if(LocateMethon.contentEquals("name")){
			
			return By.name(LocateEle);
			
		}else if(LocateMethon.equalsIgnoreCase("className")){
			
			return By.className(LocateEle);
			
		}else{
			
			return By.xpath(LocateEle);
		}
		
	}
	
}

DriverBase

package cn.App.ObjectMode.APPobiectMode.Utlis;

import org.openqa.selenium.By;

/**
 * 封装By方法
 * */

public class ByMethon {

	private static ReadProperties properties = new ReadProperties("configs//Element.properties");
	
	/**
	 * 静态by方法
	 * */
	public static By by(String Key){
		
		String value = properties.getValue(Key);
		
		String LocateMethon = value.split(">")[0];
		String LocateEle = value.split(">")[1];
		
		if(LocateMethon.equalsIgnoreCase("id")){
			
			return By.id(LocateEle);
			
		}else if(LocateMethon.contentEquals("name")){
			
			return By.name(LocateEle);
			
		}else if(LocateMethon.equalsIgnoreCase("className")){
			
			return By.className(LocateEle);
			
		}else{
			
			return By.xpath(LocateEle);
		}
		
	}
	
}

2.4:Page层代码

BasePage

package cn.App.ObjectMode.APPobiectMode.Page;

import org.openqa.selenium.By;

import cn.App.ObjectMode.APPobiectMode.Base.DriverBase;
import io.appium.java_client.android.AndroidElement;

/**
 * Page页面的基类
 * */

public class BasePage {
	
	private DriverBase driver;
	
	/**
	 * 构造方法
	 * */
	public BasePage(DriverBase driver){
		
		this.driver = driver;
	}
	
	/**
	 * element方法
	 * */
	public AndroidElement element(By by){
		
		return driver.element(by);
	}
	
	/**
	 * 封装点击的操作 
	 * */
	public void click(AndroidElement element){
		
		element.click();
	}
	
	/**
	 * 封装点击的操作
	 * */
	public void clear(AndroidElement element){
		
		element.clear();
	}
	
	/**
	 * 封装点击的操作
	 * */
	public void sendKeys(AndroidElement element, String context){
		
		element.sendKeys(context);
	}

}

loginPage

package cn.App.ObjectMode.APPobiectMode.Page;

/**
 * loginPage页面元素层
 * */

import cn.App.ObjectMode.APPobiectMode.Base.DriverBase;
import cn.App.ObjectMode.APPobiectMode.Utlis.ByMethon;
import io.appium.java_client.android.AndroidElement;

public class loginPage extends BasePage {
	
	private AndroidElement isUpdateEle;
	private AndroidElement MyBtnEle;

	public loginPage(DriverBase driver) {
		super(driver);
	
	}
	
	/**
	 * 返回是否更新Buttion的element
	 * */
	public AndroidElement isUpdateEle(){
		
		try{
			
			isUpdateEle = element(ByMethon.by("isUpdate"));
			
		}catch(Exception e){
			
			e.printStackTrace();
			System.err.println("isUpdateEle元素不存在");
		}
		
		return isUpdateEle;
	}
	
	/**
	 * 返回是否更新Buttion的element
	 * */
	public AndroidElement MyBtnEle(){
		
		try{
			
			MyBtnEle = element(ByMethon.by("MyBtn"));
			
		}catch(Exception e){
			
			e.printStackTrace();
			System.err.println("MyBtnEle元素不存在");
		}
		
		return MyBtnEle;
	}
}

2.5:Handle层代码

loginHandle

package cn.App.ObjectMode.APPobiectMode.Handle;

import cn.App.ObjectMode.APPobiectMode.Base.DriverBase;
import cn.App.ObjectMode.APPobiectMode.Page.loginPage;

/**
 * 登录页面的操作层 对各个按钮进行逻辑操作
 * */

public class loginHandle {
	
	private DriverBase driver;
	private loginPage loginPage;

	/**
	 * 构造方法 初始化loginPage对象
	 * */
	public loginHandle(DriverBase driver){
		
		this.driver = driver;
		
		loginPage = new loginPage(driver);
	}
	
	/**
	 * 点击"稍后再说"忽略更新版本
	 * */
	public void isUpdate(){
		
		if(loginPage.isUpdateEle() != null){
			
			loginPage.click(loginPage.isUpdateEle());
			
		}else{
			
			System.err.println("loginHandle层isUpdateEle元素为空");
		}	
	}
	
	/**
	 * 点击"我的"忽略更新版本
	 * */
	public void MyBtnClick(){
		
		if(loginPage.MyBtnEle() != null){
			
			loginPage.click(loginPage.MyBtnEle());
			
		}else{
			
			System.err.println("loginHandle层MyBtnEle元素为空");
		}	
	}
	
	
}

2.6:Buss层代码

loginBuss

package cn.App.ObjectMode.APPobiectMode.Buss;


/**
 * 登录界面的业务层
 * */

import cn.App.ObjectMode.APPobiectMode.Base.DriverBase;
import cn.App.ObjectMode.APPobiectMode.Handle.loginHandle;

public class loginBuss {
	
	private loginHandle loginHandle;
	
	/**
	 * 构造方法 实例化loginHandle对象
	 * */
	public loginBuss(DriverBase driver){
		
		loginHandle = new loginHandle(driver);
	}
	
	public void login(){
		
		loginHandle.isUpdate();
		
		loginHandle.MyBtnClick();
	}

}

2.7:Case层执行testCase

CaseBase

package cn.App.ObjectMode.APPobiectMode.Case;

import cn.App.ObjectMode.APPobiectMode.Base.DriverBase;

public class CaseBase {
	
	/**
	 * 初始化driver
	 * */
	public DriverBase initDriver(){
		
		DriverBase driver = new DriverBase();
		
		return driver;
	}

}

loginTestCase

package cn.App.ObjectMode.APPobiectMode.Case;

import org.testng.annotations.Test;

import cn.App.ObjectMode.APPobiectMode.Base.DriverBase;
import cn.App.ObjectMode.APPobiectMode.Buss.loginBuss;

public class loginTestCase extends CaseBase{
	
	private DriverBase driver;
	private loginBuss loginBuss;
	
	public loginTestCase(){
		//初始化driver 使driver对象保持一致性
		this.driver = initDriver();
		
		loginBuss = new loginBuss(driver);
	}
	
	@Test
	public void loginCase(){
		
		loginBuss.login();
	}

}

3:配置文件

3.1:init.properties

DeviceName=anything
appPackage=net.csdn.csdnplus
appActivity=net.csdn.csdnplus.activity.SplashActivity
APPPath=

3.2:Element.properties

#================LoginPage==============
#打开界面 有提示升级
isUpdate=name>稍后再说
#点击我的
MyBtn=name>我的

猜你喜欢

转载自blog.csdn.net/hujyhfwfh2/article/details/83240529