这个类主要是根据自己的需要或项目需要封装常用的操作方法,没有特别的要求和难度。前面还有一个appium 的api层封装的是appium框架提供的各种方法,目的是增加稳定性处理一些异常等,这个后面再贴代码
后续所有页面的操作类方法直接new这个类,每个页面也只会新建一个Action类,即初始化一片页面元素,单例模式。具体代码如下:
package com.datas.api;
import com.appium.api.ElementMethodObject;
import com.appium.api.Log;
import com.appium.api.SwipeMethodObject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.text.MessageFormat;
import java.util.List;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidKeyCode;
import static com.appium.api.ThreadSleepMethod.threadSleep;
/**
* Created by kingwit on 2017/9/11 0011.
* 提供动作类操作,点击设置值等,并完成元素初始化
* 继承 InitTestPage类
*/
public class ActionTest extends InitTestPage{
public static AndroidDriver driver;
private String pageName;
private ElementMethodObject emb=new ElementMethodObject();
private SwipeMethodObject sm =new SwipeMethodObject(driver);
public ActionTest(){}
public ActionTest(AndroidDriver driver){
this.driver=driver;
}
public ActionTest(AndroidDriver driver,String pageName){
super(driver,pageName);
this.driver=driver;
this.pageName=pageName;
}
/**
* 给某个element 输入字符,这个专用于回复评论类
* 参数:buttonName,value
*/
public void setCommentValue(String buttonName,String value){
WebElement element =emb.waitForElementPresent(driver,getBy(buttonName),10);
element.sendKeys(value);
threadSleep(2000);
}
/**
* 给某个element 输入字符,这个不适合用于回复评论类
* 参数:buttonName,value
*/
public void setValue(String buttonName,String value){
WebElement element =emb.waitForElementPresent(driver,getBy(buttonName),10);
int size = element.getText().length();
driver.pressKeyCode(123);
for(int i = 0; i < size; i++){
Log.info("搜索框有内容,删除原来数据...");
driver.pressKeyCode(AndroidKeyCode.BACKSPACE);
}
// if(isElementExist("earse_search")){
// Log.info("编辑有内容,删除原来数据...");
// click("earse_search");
// }
element.sendKeys(value);
threadSleep(2000);
}
/**
* 获取id的text内容
* 参数:buttonName
*/
public String getValue(String buttonName){
WebElement element =emb.waitForElementPresent(driver,getBy(buttonName),10);
return element.getText();
}
/**
* 获取id的text内容
* 参数:by对象
*/
public String getValue(By by){
return emb.waitForElementPresent(driver,by,10).getText();
}
/**
* 点击element
* 参数:buttonName
*/
public void click(String buttonName){
emb.waitForElementPresent(driver,getBy(buttonName),10).click();
}
/**
* 直接点击元素
* 参数:element
*/
public void click(WebElement element){
element.click();
}
//自定义点击方法用于,专门用于灵活点击不固定的xpath
public void click(By byPathName){
emb.waitForElementPresent(driver,byPathName,10).click();
// TouchAction tap=new TouchAction(driver);
// tap.tap(emb.waitForElementPresent(driver,byPathName)).release().perform();
}
/**
* 点击屏幕(基于element)
* 参数:buttonName
*/
public void tap(String buttonName){
TouchAction tap=new TouchAction(driver);
tap.tap(emb.waitForElementPresent(driver,getBy(buttonName),10)).release().perform();
}
/**
* 点击屏幕(基于坐标)
* 参数:buttonName
*/
public void tapXY(int x, int y){
TouchAction ta=new TouchAction(driver);
ta.tap(x, y).perform();
}
/**
* 获取屏幕的尺寸
* 参数:driver对象
* return 屏幕宽和高
**/
public int[] getAppScreenWH(){
int[] appWidthAndHeight;
appWidthAndHeight = sm.getAppScreen(driver);
return appWidthAndHeight;
}
/**
* 获取元素列表
* 参数:buttonName
*/
public List<WebElement> getElementList(String buttonName){
return (List<WebElement>)driver.findElements(getBy(buttonName));
}
/**
* 获取元素对象
* 参数:buttonName
*/
public WebElement getElement(String buttonName){
return emb.waitForElementPresent(driver,getBy(buttonName),1);
}
/**
* 滑动屏幕,这里滑动速度固定未2.5s,滑动次数 1次
* 参数:direction 滑动方向
*/
public void swipeScreen(String direction){
switch (direction) {
case "up":
Log.info("开始向上滑动...");
sm.slideUP(driver,2500,1);
break;
case "down":
Log.info("开始向下滑动...");
sm.slideDown(driver,2500,1);
break;
case "right":
Log.info("开始向右滑动...");
sm.slideRight(driver,2500,1);
break;
case "left":
Log.info("开始向左滑动...");
sm.slideLeft(driver,2500,1);
break;
default:break;
}
}
/**
* 滑动某个元素,左右滑动
* 参数:buttonName
*/
public void swipElement(String buttonName,String direction){
WebElement element =emb.waitForElementPresent(driver,getBy(buttonName),10);
sm.slidingElement(element,direction,1500,1);
}
/**
* 判断某个元素是否存在
* 参数:buttonName
*/
public boolean isElementExist(String buttonName){
boolean exist = false;
if(emb.isElementPresent(driver,getBy(buttonName))){
exist = true;
Log.info("需要找的元素存在,返回True...");
}
return exist; //存在则返回true
}
/**
* 在元素上长按
* 参数:buttonName
*/
public void loogPress(String buttonName){
try{
WebElement element = emb.waitForElementPresent(driver,getBy(buttonName),10);
TouchAction ta = new TouchAction(driver);
ta.longPress(element).release().perform();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取当前activity 声明为静态函数,其他类可调用
* 参数:无
*/
public String getCurrentActivity(){
return driver.currentActivity();
}
/**
* 物理安静返回上一页
* 参数:无
*/
public void goBack(){
driver.pressKeyCode(AndroidKeyCode.BACK);
}
//用于动态参数定位xpath路径,使用占位符获取参数
//返回实际操作xpath路径字符串
public String stringFormate(String xpath,int index){
return MessageFormat.format(xpath,index);
}
//用于动态参数定位xpath路径,使用占位符获取参数
//返回实际操作xpath路径字符串
public String stringFormate(String xpath,String str){
return MessageFormat.format(xpath,str);
}
//用于动态参数定位xpath路径,使用占位符获取参数
//返回实际操作xpath路径字符串
public String stringFormate(String xpath,int index,String string){
return MessageFormat.format(xpath,index,string);
}
}