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 ...
随机推荐
- eclipse构建maven的web项目(转载)
eclipse构建maven的web项目 分类: java opensource2013-12-25 16:22 43人阅读 评论(0) 收藏 举报 maven框架webappwebeclipse 使 ...
- 使用UIkit的uk-form-icon后input框无法输入的问题
相关版本UIkit2.27.5 uikit.min.css默认使用uk-form-icon的属性pointer-events: none:因此表框无法点击. <style type=text/c ...
- mybatis学习四 mybatis的三种查询方式
<select id="selAll" resultType="com.caopeng.pojo.Flower"> select * from fl ...
- python入门之字典
1.字典的基本特征: key-value结构 key唯一,必须为不可变数据类型 value可以不唯一 无序 查找速度快 2.创建一个字典: info={“gaohui”:"IT", ...
- 过河卒(NOIP2002)
题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...
- UGUI图集
Editor->Project Settings 下面有sprite packer的模式.Disabled表示不启用它,Enabled For Builds 表示只有打包的时候才会启用它,Alw ...
- 进入快速通道的委托(深入理解c#)
1.方法组:所有的名称相同的重载方法合在一起就成为一个方法组. 2.协变性和逆变性: 协变性指的是——泛型类型参数可以从一个派生类隐式转化为基类. 逆变性指的是——泛型类型参数可以从一个基类隐式转化为 ...
- 2018.11.14 uoj#34. 多项式乘法(ntt)
传送门 今天学习nttnttntt. 其实递归方法和fftfftfft是完全相同的. 只不过fftfftfft的单位根用的是复数中的东西,而nttnttntt用的是数论里面有相同性质的原根. 代码: ...
- JAVA折腾微信公众平台(Token验证)[转]
JAVA折腾微信公众平台(Token验证) BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写 ...
- 牛客训练四:Applese 的回文串(思维)
题目链接:传送门 思路:插入不同的字符与删除不同的字符相同,所以每次判断到不同位置时将这个字符删除然后判断是否为回文串即可, 如果一开始就是回文串,那么答案也是yes. #include<ios ...