环境配置

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精简教程的更多相关文章

  1. 转帖-[教程] Win7精简教程(简易中度)2016年8月-0day

    [教程] Win7精简教程(简易中度)2016年8月 0day 发表于 2016-8-19 16:08:41  https://www.itsk.com/thread-370260-1-1.html ...

  2. appium简明教程

    appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...

  3. 转载乙醇大师的appium简明教程

    appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统) 乙醇 2014-06-28 21:01 阅读:16406 评论:21 appium简明教程(10)——控件定 ...

  4. Appium自动化测试教程-自学网-adb命令

    adb命令: adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试应用. T ...

  5. appium入门级教程(3)—— 安装 Android SDK

    前言 搭建Android平台不是必须的,如果你不想使用 Android 模拟器运行测试的话可以跳过,不过,建议安装:原生 Android 好折腾!关键是它自带的一些工具是做 appium 测试必须要用 ...

  6. appium入门级教程(2)—— 安装Appium-Server

    前言 ==================== web自动化测试的路线是这样的:编程语言基础--->测试框架--->webdriver API--->开发自动化测试项目. 移动自动化 ...

  7. appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统)

    上一节乙醇带大家了解了appium的定位策略.实际上appium的控件定位方式是完全遵守webdriver的mobile扩展协议的. 这一节将分享一下如何使用resource id来定位android ...

  8. appium简明教程(4)——appium client的安装

    appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好懂的用例. appium client是配合原生的webdriver来使用的,因此二 ...

  9. appium简明教程(1)——appium和它的哲学世界

    什么是appium? 本文已经迁移到测试教程网,后续更新会在测试教程网更新. 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use ...

随机推荐

  1. 算法题思路总结和leecode继续历程

    2018-05-03 刷了牛客网的题目:总结思路(总的思路跟数学一样就是化简和转化) 具体启发点: 1.对数据进行预处理排序的思想:比如8皇后问题 2.对一个数组元素进行比较的操作,如果复杂,可以试试 ...

  2. Sophus链接错误

    错误指示如下: CMakeFiles/run_vo.dir/run_vo.cpp.o: In function `main': run_vo.cpp:(.text.startup+0x1086): u ...

  3. Microsoft translater

    professional  tranlater tool : https://translator.microsoft.com/neural/

  4. SLI的相关学习

    今天帮人安装前年的机皇-微星GT80S的操作系统,安装好后用鲁大师测试下跑分,发现双显卡和单显卡鲁大师的跑分竟然一样,就像副显卡根本没有工作,听主人所这台机器能跑到36万以上. 然后就苦逼的尝试,把B ...

  5. 关于进行pdf的每页广告去除、转换word等方案。

    pdf转word经常使用的是 软件下载安装破解完成以后进行编辑pdf,可以导出word,效果比一般的word自带的转换效果要好. 在进行pdf的每页去除页脚或者页眉的广告时候,使用pdf的替换功能.这 ...

  6. 40、IOS自动打包-Python脚本

    第一种:基于编译的打包 编译工程--找到.app文件--新建Payload文件夹--拷贝.app到Payload文件夹--压缩成zip--更改后缀名为ipa--完成! 第二种(有问题,暂时不需要看) ...

  7. mysql 批量杀进程

    select concat('KILL ',id,';') from information_schema.processlist where user='root';

  8. 关于上级机构的冲突性测试bug修复

    描述: 1.上级机构可以为空. 2.机构添加时,选择了上级机构,在未提交前,另一用户将该机构删除,然后前一用户再提交表单,提示会保存成功,本操作应该保存失败. 思路:在上级机构不为空时,保存前进行查询 ...

  9. 第28章:MongoDB-索引--过期索引(TTL)

    ①过期索引(TTL) TTL索引是让文档的某个日期时间满足条件的时候自动删除文档,这是一种特殊的索引,这种索引不是为了提高查询速度的,TTL索引类似于缓存,缓存时间到了就过期了,就要被删除了 ②范例: ...

  10. HDU 5656 CA Loves GCD (容斥)

    题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ...