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 ...
随机推荐
- autohotkey快捷键
;已经基本修复了输入带shift的时候跟输入法中英文切换之间的冲突 SetStoreCapslockMode, off SetKeyDelay, ^CapsLock:: #UseHook ;用这个和下 ...
- connect: Address is invalid on local machine or port is not valid on remote
idea 运行正常打成jar包运行提示“connect: Address is invalid on local machine or port is not valid on remote” , 解 ...
- maven打包之后为什么class文件中没有注释了?
<!--生成doc jar包--> <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...
- mybatis学习三 数据库连接池技术
1.在内存中开辟一块空间,存放多个数据库连接对象.就是Connection的多个实例2. 连接池技术有很多,c3p0,dbcp,druid,以及JDBC Tomcat Pool, JDBC Tomca ...
- 【轻松前端之旅】元素,标记,属性,<html>标签
HTML文档是由HTML元素定义的. HTML元素(element)指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 有些元素会使用简写记法,如<img src=' ...
- css过渡动画
具体代码:1.水平翻转-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);transfo ...
- 【转】手动释放linux os buff/cache
手动释放linux内存cache和脚本定时释放 标签: linuxcache脚本bufferwindows磁盘 2011-12-04 08:44 12799人阅读 评论(2) 收藏 举报 分类: l ...
- floor函数
C++中 可以用floor函数来截断小数部分 floor(x)返回一个不大于x的整数,有点像取整函数
- 2018.11.08 UVA11021 Tribles(概率dp)
传送门 概率dpdpdp简单题. 设f[i]f[i]f[i]表示第iii天的答案. 然后枚举ppp数组从fi−1f_{i-1}fi−1转移过来就行了. 显然有fi=∑j=0npj∗(fi−1)jf_ ...
- gj12-2 协程和异步io
12.3 epoll+回调+事件循环方式url import socket from urllib.parse import urlparse # 使用非阻塞io完成http请求 def get_ur ...