Appium移动端自动化测试-PageObject模式
1:PageObject Mode代码结构
2:代码的实现
2.1:封装Server部分代码
用来启动Appium 分配端口参考 :https://blog.****.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.****.****plus
appActivity=net.****.****plus.activity.SplashActivity
APPPath=
3.2:Element.properties
#================LoginPage==============
#打开界面 有提示升级
isUpdate=name>稍后再说
#点击我的
MyBtn=name>我的