appium精简教程
环境配置
package appium; import io.appium.java_client.android.*; import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit; import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
//import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.JavascriptExecutor;
import org.testng.Assert;
//import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.util.*; public class appium {
private AndroidDriver dr;
private String reportPath = "C:\\inetpub\\wwwroot\\Content\\Images\\";
private int sleepBase = 1000;
public String port;
public String udid;
public String pver; @BeforeTest //must be j2se-1.5
@Parameters({ "port", "udid" , "pver"})
public void beforeSuite(String port, String udid, String pver) {
//public void beforeSuite() {
this.port = port;
this.udid = udid;
this.pver = pver; //this.port = "4723";
//this.udid = "0123456789ABCDEF";
//this.pver = "4.4";
}
@Test
public void TC_001() throws InterruptedException, MalformedURLException
{
try
{
LaunchApp(); //Step1: go to view
ClickByIndex("android.widget.ImageView", 6, "回单验证"); //Step2: fill the form ; To do: put the input text into XML
java.util.List<WebElement> arrEditText= dr.findElementsByClassName("android.widget.EditText");
arrEditText.get(0).sendKeys("3243243255");
arrEditText.get(1).sendKeys("1112312345123451234512345456");
arrEditText.get(2).sendKeys("221234512345123456"); InputkeyboardNum(arrEditText.get(3)); arrEditText.get(4).sendKeys("441234123451234556");
arrEditText.get(5).sendKeys("551234123451234556");
PrintScreen(reportPath+udid+"_填写表单.jpg"); //Step3: click search
ClickByID("com.boc.bocsoft.phone:id/btn_receipt_ok", "点击查询"); //Step4: check the string
PrintScreen(reportPath+udid+"_回单验证查询.jpg");
String text = dr.findElementById("com.boc.bocsoft.phone:id/tv_receipt_result_one_show_no").getText();
Assert.assertEquals(text, "没有符合查询条件的交易回单");
}
catch(Exception e)
{
e.printStackTrace();
}
} @Test
public void TC_002() throws InterruptedException, MalformedURLException
{
Login(); //Step1: go to view
ClickByIndex("android.widget.ImageView", 3, "转账汇款"); //Step2: fill the form
ClickByID("com.boc.bocsoft.phone:id/text_function_menu_child", "对公单笔汇款");
ClickByID("com.boc.bocsoft.phone:id/payee_picker", "选择收款人");
ClickByIndex("android.widget.TextView",2, "签约收款人");
ClickByIndex("android.widget.TextView",8, "选择签约收款人"); InputkeyboardNum(dr.findElementById("com.boc.bocsoft.phone:id/item_content")); //ClickByID("com.boc.bocsoft.phone:id/pick_indicator", "输入用途");
//dr.findElementById("com.boc.bocsoft.phone:id/usage_content").sendKeys("输入中文用途");
//dr.sendKeyEvent(4);
//ClickByID("com.boc.bocsoft.phone:id/confirm", "确定"); for(int i =0; i< 3;i++)
{
swipeScreen(716.0, 988.0, 530.0, 504.0, 0.5, 4, dr);
dr.swipe(716, 988, 530, 504, 1);
} ClickByID("com.boc.bocsoft.phone:id/submit", "提交");
String expect = dr.findElementById("com.boc.bocsoft.phone:id/result_info").getText();
System.out.println(expect); ClickByID("com.boc.bocsoft.phone:id/main_iv_bank", "主页");
ClickByIndex("android.widget.ImageView", 3, "转账汇款");
ClickByIndex("android.widget.TextView", 9, "网银操作记录查询");
ClickByID("com.boc.bocsoft.phone:id/operation_record_trade_query", "查询网银操作记录");
List<WebElement> arrActual = dr.findElementsById("com.boc.bocsoft.phone:id/review_amount");
String actual = arrActual.get(arrActual.size()-1).getText();
System.out.println(actual);
Assert.assertTrue(expect.contains(actual), "expect: " + expect + " ; actual: " + actual);
} //basic operation
private void ClickByID(String id, String log) throws InterruptedException, MalformedURLException
{
Thread.sleep(2000);
System.out.println("Click " + log);
dr.findElementById(id).click();
Thread.sleep(sleepBase * 5);
PrintScreen(reportPath+udid+ "_" + log + ".jpg");
}
private void ClickByIndex(String className, int index, String log) throws InterruptedException, MalformedURLException
{
Thread.sleep(2000);
java.util.List<WebElement> arr= dr.findElementsByClassName(className);
arr.get(index).click();
System.out.println("Click " + log);
Thread.sleep(sleepBase * 5);
PrintScreen(reportPath+udid+ "_" + log + ".jpg");
}
private void SendKeysByID(String id, String keys) throws InterruptedException, MalformedURLException
{
System.out.println("Send " + keys);
dr.findElementById(id).sendKeys(keys);
Thread.sleep(1000);
} private void Tappoint(int x, int y) throws InterruptedException, MalformedURLException
{
System.out.println("Tappoint: " + x + " , " + y);
dr.tap(1, x, y, 100);
Thread.sleep(1000); }
private void PrintScreen(String fileName) throws InterruptedException, MalformedURLException
{
System.out.println(fileName); File file= null;
try
{
file= dr.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file, new File(fileName));
}
catch (IOException e)
{
e.printStackTrace();
}
} //
public static void swipeScreen(Double startX, Double startY, Double endX,
Double endY, Double duration, int repeat, AndroidDriver driver) {
JavascriptExecutor js = (JavascriptExecutor) driver;
java.util.HashMap<String, Double> swipeObj = new java.util.HashMap<String, Double>();
swipeObj.put("startX", startX);
swipeObj.put("startY", startY);
swipeObj.put("endX", endX);
swipeObj.put("endY", endY);
for (int i = 0; i < repeat; i++) {
try {
js.executeScript("mobile: flick", swipeObj);
} catch (Exception ex) {
System.out.println("滑动屏幕失败");
}
}
}
public static void scroll(String direction, AndroidDriver driver) {
JavascriptExecutor js = (JavascriptExecutor) driver;
java.util.HashMap<String, String> scrollObject = new java.util.HashMap<String, String>();
scrollObject.put("direction", direction);
js.executeScript("mobile: scroll", scrollObject);
} //app operation
private void LaunchApp() throws InterruptedException, MalformedURLException
{
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName", udid);
capabilities.setCapability("udid", udid);
capabilities.setCapability("platformVersion", pver);
capabilities.setCapability("platformName", "Android");
//aapt.exe dump badging apkPath
capabilities.setCapability("appPackage", "com.boc.bocsoft.phone");
capabilities.setCapability("appActivity", "com.boc.bocsoft.phone.activity.business.splash.MEBSplashActivity");
capabilities.setCapability("unicodeKeyboard", "True"); //for input Chinese
capabilities.setCapability("resetKeyboard", "True"); dr = new AndroidDriver(new URL("http://127.0.0.1:" + port + "/wd/hub"),capabilities);
Thread.sleep(sleepBase * 10);
PrintScreen(reportPath+udid+"_Launch.jpg");
}
private void ExitAppium()
{
if(dr != null)
{
dr.closeApp();
}
}
private void Login() throws InterruptedException, MalformedURLException
{
try
{
LaunchApp();
ClickByID("com.boc.bocsoft.phone:id/main_title_right_btn", "登录");
SendKeysByID("com.boc.bocsoft.phone:id/et_login_user_name", "jqhd001");
//SendKeysByID("com.boc.bocsoft.phone:id/sipbox_login_password", "0123456789abc");
//SendKeysByID("com.boc.bocsoft.phone:id/sipbox_login_verifys", "456789"); dr.findElementById("com.boc.bocsoft.phone:id/sipbox_login_password").click();
Thread.sleep(3000);
for(int i=0;i<5;i++)
{
Tappoint(60,1360);
Tappoint(160,1360);
}
dr.sendKeyEvent(4); dr.findElementById("com.boc.bocsoft.phone:id/sipbox_login_verifys").click();
Thread.sleep(1000);
for(int i=0;i<6;i++)
{
Tappoint(178,1360);
}
dr.sendKeyEvent(4); PrintScreen(reportPath+udid+"_登录.jpg");
ClickByID("com.boc.bocsoft.phone:id/tv_login_submits", "点击登录"); //wait for login: appium will automatic shutdown if no new cmd in 60s
System.out.println("Wait 100s for login");
WebElement loginSign = null;
for(int i=0;i<5;i++)
{
Thread.sleep(20000);
Tappoint(0,0); try{
loginSign = dr.findElementById("com.boc.bocsoft.phone:id/btn_dialog_error_enter");}
catch(Exception e){} if(loginSign != null)
{
System.out.println("Login done ! " + loginSign);
ClickByID("com.boc.bocsoft.phone:id/btn_dialog_error_enter", "修改密码提示");
return;
}
}
}
catch(Exception e){}
//to do: we may have to retry 3 times because login always failed by bad network
}
private void InputkeyboardNum(WebElement ele) throws InterruptedException, MalformedURLException
{
System.out.println("software keyboard: input 123");
ele.click();
Thread.sleep(2000);
//int x = dr.manage().window().getSize().width;
//int y = dr.manage().window().getSize().height;
Tappoint(137, 1330);
Tappoint(414, 1330);
Tappoint(670, 1330);
Tappoint(940, 1670);
System.out.println("Input done");
} @AfterTest
public void afterTest()
{
ExitAppium();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite1">
<parameter name = "port" value = "4723"/>
<parameter name = "udid" value = "0123456789ABCDEF"/>
<parameter name = "pver" value = "4.4"/>
<test name="Test">
<classes>
<class name="appium.appium"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
appium精简教程的更多相关文章
- 转帖-[教程] Win7精简教程(简易中度)2016年8月-0day
[教程] Win7精简教程(简易中度)2016年8月 0day 发表于 2016-8-19 16:08:41 https://www.itsk.com/thread-370260-1-1.html ...
- appium简明教程
appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...
- 转载乙醇大师的appium简明教程
appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统) 乙醇 2014-06-28 21:01 阅读:16406 评论:21 appium简明教程(10)——控件定 ...
- Appium自动化测试教程-自学网-adb命令
adb命令: adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试应用. T ...
- appium入门级教程(3)—— 安装 Android SDK
前言 搭建Android平台不是必须的,如果你不想使用 Android 模拟器运行测试的话可以跳过,不过,建议安装:原生 Android 好折腾!关键是它自带的一些工具是做 appium 测试必须要用 ...
- appium入门级教程(2)—— 安装Appium-Server
前言 ==================== web自动化测试的路线是这样的:编程语言基础--->测试框架--->webdriver API--->开发自动化测试项目. 移动自动化 ...
- appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统)
上一节乙醇带大家了解了appium的定位策略.实际上appium的控件定位方式是完全遵守webdriver的mobile扩展协议的. 这一节将分享一下如何使用resource id来定位android ...
- appium简明教程(4)——appium client的安装
appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好懂的用例. appium client是配合原生的webdriver来使用的,因此二 ...
- appium简明教程(1)——appium和它的哲学世界
什么是appium? 本文已经迁移到测试教程网,后续更新会在测试教程网更新. 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use ...
随机推荐
- Nodejs+Mongo+WebAPI
Nodejs+Mongo+WebAPI集成 1.[ 目录]: |- models/bear.js |- node_modules/ |- express |- mongoose |- body-par ...
- Django之auth模块用户认证模块
一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...
- TP5在lnmp环境中不能重写的问题
说到坑,这个问题困扰了我一两天时间,本地可以,线上环境检查了好久. 基本检查的地方有几个了,首先就是nginx下面的重写配置,这个大家在网上都能搜到,至于定义的变量和配置路径,修改一下即可. 还有就是 ...
- 2018.11.18 bzoj2194: 快速傅立叶之二(fft)
传送门 模板题. 将bbb序列反过来然后上fftfftfft搞定. 代码: #include<bits/stdc++.h> #define ri register int using na ...
- Oracle常用命令-用户、表空间、赋权限、导入导出
1.1 删除表空间 drop tablespace QBKJ including contents and datafiles; 1.2 删除用户 drop user admin cascad ...
- PHP时间范围:本周、本月、下月等简写
在阅读TP5.1源码,发现其在时间范围上的写法很特别,个人第一次见,做一次记录 $timeRule = [ 'today' => ['today', 'tomorrow'], 'yesterda ...
- java常用设计模式七:装饰模式
一.概念 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为. 基本角色: 抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的 ...
- Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)
Javascript.Jquery获取浏览器和屏幕各种高度宽度 另外参见 http://www.cnblogs.com/top5/archive/2009/05/07/1452135.html ...
- 第19章:MongoDB-聚合操作--聚合管道--$limit+$skip
①$limit “$limit”:负责数据的取出个数: “$skip”:数据的跨过个数. ②范例:使用“$limit”设置取出的个数
- 关于CSS的优先级,CSS优先级计算,多个class引用
原则一: 继承不如指定 原则二: #id > .class > 标签选择符 原则三:越具体越强大 原则四:标签#id >#id ; 标签.class > .class CSS优 ...