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 ...
随机推荐
- 搭建java环境和java学习
https://blog.csdn.net/fishe_r/article/details/18863447 其中的 java配置文件用: { "shell_cmd": " ...
- java的nio例子
package main; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.Inet ...
- 使用 CXF 做 webservice 简单例子(转载)
使用 CXF 做 webservice 简单例子 Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这 ...
- Java中的几种对象(POJO,PO,DTO,DAO,BO)
j2ee中,经常提到几种对象(object),理解他们的含义有助于我们更好的理解面向对象的设计思维. POJO(plain old java object):普通的java对象,有别于特殊的j ...
- python学习 day1 (3月1日)
01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 飞机 内存:临时存储数据. 8g,16g, 高铁 1,成本高. 2,断电即消失. 硬盘:长期存储大量的数据. 1T 512G等等 ...
- 819. Most Common Word
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- 计算误差函数的积分--erf(x)
注意exp(-x^2-y^2) 可以拆成exp(-x^2) * exp(-y^2) 对 dx积分时,另外一个可以当常数提出到积分号外,另外 -b到b的积分看做常数提取到积分号外
- fork、vfork、clone
三个都是用来创建新进程的函数 fork 概念 1)fork函数调用一次会返回两次,给父进程返回子进程的进程ID,给子进程返回0(这么设计的原因:父进程可以有很多子进程,没有一个函数可以让父进程知道所有 ...
- 引用限定符(c++11)
1.概念 1)下面这种情况将对一个右值调用成员函数.对右值赋值 string s1 = "abc", s2 = "def"; auto n = (s1 + s2 ...
- 安装完ubuntu后需要安装的软件
ubuntu安装完sudo apt-get install vim g++ openssh-server libgl1-mesa-dev vmtools