package com.cmall.spring;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.testng.Assert;
import com.android.ddmlib.AndroidDebugBridge;
import com.android.ddmlib.IDevice;
import com.cmall.play.pages.ActivityList;
import com.cmall.utils.LogUtil;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidKeyCode;
/**
* driver操作工具类
* @author cm
*
*/
public class DriverHelper {
private LogUtil log = new LogUtil(DriverHelper.class);
private AndroidDriver<MobileElement> driver;
public DriverHelper() {
}
public DriverHelper(AndroidDriver<MobileElement> mdriver) {
this.driver = mdriver;
}
public void setDriver(AndroidDriver<MobileElement> mdriver) {
this.driver = mdriver;
}
/**
*
* @Description 动态等待activity出现
* @Data 2017年5月3日
* @return true or false
*/
public boolean waitActivity(String activityName) {
log.info("[Activity] Waiting activity ==> " + "(" + activityName + ")");
try {
for (int i = 0; i < 20; i++) {
Thread.sleep(500);
if (activityName.contains(driver.currentActivity())) {
log.info("[Activity] Found activity ==> " + "(" + activityName + ")");
return true;
}
}
log.error("[ActivityNotFound]:" + "(" + activityName + ")" + "\n" + "CurrentActivity is:"
+ "(" + driver.currentActivity() + ")");
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
*
* @param mobileElement
* @return
*/
public boolean waitElement(MobileElement mobileElement) {
for (int j = 0; j < 3; j++) {
log.info("[Element] Waiting element ==> " + "(" + splitElement(mobileElement) + ")");
if (mobileElement.isDisplayed()) {
log.info("[Element]" + "(" + splitElement(mobileElement) + ")" + " Found");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
}
log.error("[Element] ElementNotFound ==> " + "(" + splitElement(mobileElement) + ")");
return false;
}
/**
*
* @param activityName
* @param mobileElement
*
*/
public boolean waitElement(String activityName, MobileElement mobileElement) {
if (waitActivity(activityName)) {
if (waitElement(mobileElement)) {
return true;
}
}
return false;
}
/**
* 点击
* @param element
*/
public void clickonElement(MobileElement mobileElement) {
log.info("[Element] click on element ==> " + "(" + splitElement(mobileElement) + ")");
mobileElement.click();
}
/**
* 输入
*
* @param element
* @param text
*/
public void sendKeys(MobileElement mobileElement, CharSequence... text) {
log.info("[Element] input text ==> " + "(" + splitElement(mobileElement) + ")");
mobileElement.sendKeys(text);
}
/**
* 点击系统按键
*
* @param androidkeycode
*/
public void pressKeyCode(int androidkeycode) {
log.info("Press AndroidKeyCode ==> " + androidkeycode);
driver.pressKeyCode(androidkeycode);
}
public String getCurrentActivity() {
String current = driver.currentActivity();
log.info("Current Activity:"+current);
return current;
}
/***
* 切换WEB页面查找元素WEBVIEW、 NATIVE_APP
*/
public void context_to_webview() {
Set<String> ContextHandles = driver.getContextHandles();
log.info("All ContextHandles :" + ContextHandles);
for (String contextName : ContextHandles) {
if (contextName.contains("WEBVIEW") || contextName.contains("webview")) {
driver.context(contextName);
log.info("[Webview] context_to_webview success :" + contextName);
break;
}
}
}
public void context_to_native() {
driver.context("NATIVE_APP");
}
/***
* 检查网络
*
* @return 是否正常
*/
public boolean checkNet() {
String text = driver.getConnection().toString();
if (text.contains("Data: true"))
return true;
else
return false;
}
/***
* 根据UIautomator底层方法得到对应desc的view
*
* @param desc名
* @return View
*/
public MobileElement findElementByDesc(String name) {
return driver.findElementByAndroidUIAutomator("new UiSelector().descriptionContains(\"" + name + "\")");
}
public List<MobileElement> findElementsById(String id) {
return driver.findElementsById(id);
}
public MobileElement findElementById(String id) {
return driver.findElementById(id);
}
public MobileElement findElementByName(String name) {
return driver.findElementByName(name);
}
/***
* 根据UIautomator底层方法得到对应text的view
*
* @param text名
* @return View
*/
public MobileElement findElementByText(String name) {
return driver.findElementByAndroidUIAutomator("new UiSelector().textContains(\"" + name + "\")");
}
/**
* 截图,将图片放在test-output\\screenshots中
*
* @param screenShotName
*/
public void takeScreenShot(String screenShotName) {
String path = "test-output\\screenshots\\";
File screenShot = driver.getScreenshotAs(OutputType.FILE);
try {
File destFile = new File(path + screenShotName);
FileUtils.copyFile(screenShot, destFile);
} catch (IOException e) {
e.printStackTrace();
}
log.info("截图成功:" + screenShotName);
}
/***
* 特殊左滑
*
* @param 传入从上到下宽度的百分比(1-99之间)
*/
public void slideLeft(int i) {
Assert.assertFalse(i <= 0 || i >= 100, "左滑宽度传入错误");
int x = driver.manage().window().getSize().width;
int y = driver.manage().window().getSize().height;
driver.swipe(x / 4 * 3, y / 10 * i, x / 4 * 2, y / 10 * i, 0);
}
/**
* 向上滑动1/3屏幕高度
*/
public void swipeUp() {
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
driver.swipe(width / 2, height * 2 / 3, width / 2, height * 1 / 3, 1000);
pause(1000);
}
/**
* 滑动到指定元素高度并点击,需要在webview下执行
*
* @param element
*/
public void scrollAndClick(MobileElement element) {
int elementPosition = element.getLocation().getY();
String js = String.format("window.scroll(0, %s)", elementPosition);
((JavascriptExecutor) driver).executeScript(js);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
element.click();
}
/**
* 滑动到指定元素高度,需要在webview下执行
*
* @param element
*/
public void scrollToElement(MobileElement mobileElement) {
int elementPosition = mobileElement.getLocation().getY();
String js = String.format("window.scroll(0, %s)", elementPosition);
driver.executeScript(js);
}
/**
* 回到主页,适用:Play
*/
public void backToHomeActivity() {
try {
if (ActivityList.HOME_ACTIVITY.equals(driver.currentActivity())) {
return;
}
log.info("\n" + "Run:backToHomeActivity");
for (int i = 0; i < 6; i++) {
if (ActivityList.HOME_ACTIVITY.equals(driver.currentActivity())) {
return;
}
Thread.sleep(2500);
pressKeyCode(AndroidKeyCode.BACK);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 返回指定页面
*/
public void backToActivity(String ActivityName) {
try {
if (ActivityName.contains(driver.currentActivity())) {
return;
}
for (int i = 0; i < 6; i++) {
if (ActivityName.contains(driver.currentActivity())) {
return;
}
Thread.sleep(2500);
pressKeyCode(AndroidKeyCode.BACK);
}
} catch (Interru
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java+Appium的Android自动化.zip
共166个文件
log:65个
java:60个
xml:15个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 199 浏览量
2024-03-23
23:56:06
上传
评论
收藏 74.82MB ZIP 举报
温馨提示
基于Java+Appium的Android自动化
资源推荐
资源详情
资源评论
收起资源包目录
基于Java+Appium的Android自动化.zip (166个子文件)
play-debug.apk 36.67MB
play.apk 35.93MB
meiyin.apk 5.43MB
.classpath 1KB
reportng.css 5KB
.gitignore 9B
overview.html 2KB
suites.html 2KB
suite3_test1_results.html 1KB
suite2_test1_results.html 1KB
output.html 1KB
suite1_test1_results.html 1KB
suite1_test2_results.html 639B
index.html 556B
DriverHelper.java 12KB
DriverHelper.java 12KB
MeituPage.java 11KB
HttpUtil.java 10KB
ModelPage.java 9KB
HttpClientUtil.java 6KB
ImageUtil.java 5KB
HttpUtils.java 5KB
TestPage.java 5KB
DDMlibUtil.java 4KB
LoginPage.java 4KB
AppiumServer.java 4KB
AppiumServer.java 4KB
AppiumServer2.java 4KB
DriverFactory.java 4KB
TestDouble.java 4KB
MultideviceManage.java 3KB
MyAppiumListener.java 3KB
TestMain.java 3KB
ProcessUtil.java 3KB
TestJava.java 2KB
MultideviceManage2.java 2KB
CookieUtil.java 2KB
ThreadDailyRollingAppender.java 2KB
MeituSuite.java 2KB
ModelTestCase01.java 2KB
TestNGListener.java 2KB
ModelTestCase02.java 2KB
PersonModifyPage.java 2KB
PersonPage.java 2KB
ModelTest.java 2KB
ExcelReader.java 2KB
PropertyUtil.java 2KB
TestDemo.java 2KB
ActionOne.java 2KB
DriverFactory.java 2KB
ThreadLoggerFactory.java 2KB
ParamBean.java 2KB
ReponseUtil.java 1KB
TestngRun.java 1KB
CommandUtil.java 1KB
TestCase_model.java 1KB
TestException.java 1KB
TestNGDemo.java 1KB
IActivities.java 1KB
BaseCase.java 1KB
ActivityList.java 1KB
ResponseBean.java 1006B
TestCase_login.java 982B
TestCase_logout.java 841B
Main.java 838B
ActivityList_MeiYin.java 821B
Test_login.java 788B
LogUtil.java 763B
Constant.java 731B
TestCaseFactory.java 688B
ThreadLogTest.java 617B
IDFactory.java 438B
ITestCase.java 345B
IBaseCase.java 174B
goto3DModelFromHome_error.jpg 492KB
reportng.js 579B
main1501498186603.log 951KB
main1501581177463.log 880KB
main1501554906843.log 628KB
main1501585391125.log 565KB
main1501499468211.log 515KB
main1501555735374.log 483KB
main1501556048793.log 412KB
main1501556207558.log 410KB
main1501570227575.log 385KB
main1501496853921.log 375KB
main1501570798388.log 364KB
main1501580356253.log 343KB
main1501581724782.log 316KB
main1501581634901.log 307KB
main1501581832938.log 257KB
main1501570880159.log 246KB
main1501582413020.log 183KB
main1501582317076.log 183KB
main1501584110944.log 180KB
main1501495449460.log 180KB
main1501584244235.log 179KB
main1501570312987.log 162KB
Thread-01500004467533.log 94KB
1500003200479.log 93KB
共 166 条
- 1
- 2
资源评论
Kwan的解忧杂货铺
- 粉丝: 2w+
- 资源: 3699
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- FlaUInspect 网上最新版 flauinspect v1.3.0
- 1_Parameter Manual NC variable and interface signals.pdf
- 目标检测-垃圾桶满溢检测数据集-3000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-垃圾桶满溢检测数据集-1000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- (网络收集)2024年新课标Ⅰ卷数学卷带答案带解析带分值文字版.docx
- HCIP-Datacom-Advanced Routing & Switching Technology V1.0 培训材料
- SpringBoot+Vue尚庭公寓项目前端代码
- C51C51单片机实现的 抽奖机 设计与编程指南
- ikbc C87 机械键盘固件升级
- 词频统计PTA案例分析.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功