Appium移動端自動化測試-PageObject模式
阿新 • • 發佈:2018-11-25
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>我的