1. 程式人生 > >Appium移動端自動化測試-PageObject模式

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