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.Base;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;

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

import cn.App.ObjectMode.APPobiectMode.Servers.StartAppium;
import cn.App.ObjectMode.APPobiectMode.Utlis.ReadProperties;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

/**
 * DriverBase基类 封装基础操作方法
 * */

public class DriverBase {
	
	private AndroidDriver driver;
	
	private ReadProperties properties = new ReadProperties("configs//init.properties");
	
	/**
	 * 构造方法 初始化driver
	 * */
	public DriverBase(){
		
		String DeviceName = properties.getValue("DeviceName");
		String appPackage = properties.getValue("appPackage");
		String appActivity = properties.getValue("appActivity");
		String APPPath = properties.getValue("APPPath");
		
		Map<String, Integer> map = new StartAppium().startAppium();
		
		Set<Entry<String, Integer>> entrySet = map.entrySet();
		
		for (Entry<String, Integer> entry : entrySet) {
			
			String UUID = entry.getKey();
			int AppiumPort = entry.getValue();
			
			initDriver init = new initDriver(DeviceName, UUID, appPackage, appActivity, AppiumPort);
			
			this.driver = init.androidDriver(APPPath);
			
		}

	}
	/**
	 * 调试方法 
	 * */
	public static void main(String[] args) {
		
		new DriverBase();
	}
	
	/**
	 * 封装findElement方法
	 * */
	public AndroidElement element(By by){
		//隐式等待
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		
		AndroidElement element = (AndroidElement)driver.findElement(by);
		
		return element ;
	}
	
	/**
	 * 封装退出driver方法
	 * */
	public void closed(){
		
		driver.quit();
	}
	
	/**
	 * 获取APP的宽和高 (获取APP的最大点坐标)
	 * */
	public Map<String, Integer> getXY(){
		
		Map<String, Integer> map = new HashMap<>();
		
		int X = driver.manage().window().getSize().getWidth();
		int Y = driver.manage().window().getSize().getHeight();
		
		map.put("X", X);
		map.put("Y", X);
		
		return map;
	}
	
	/**
	 * drivr的滑动 全屏滑动
	 * */
	public void driverSwipe(int startx, int starty, int endx, int endy){
		
		driver.swipe(startx, starty, endx, endy, 500);
	}
	
	/**
	 * 返回长按的action对象
	 * */
	public TouchAction LongPressAction(){
		
		return new TouchAction(driver);
	}
	
	/**
	 * 封装tap 对坐标进行点击
	 * */
	public void driverTap(int fingers, int x, int y, int duration){
		
		driver.tap(fingers, x, y, duration);;
	}
	
	/**
	 * 对元素进行点击
	 * */
	public void driverTap(int fingers, AndroidElement element, int duration){
		
		driver.tap(fingers, element, duration);
	}
}

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>我的

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值