一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装)

二、启动Appium(Appium环境安装可自行百度)

三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk

安装步骤:(基于Android SDK已经配置好了环境变量,可自行百度)
1、Win + R
2、CMD
3、adb devices   --检查操作,列出存在的设置名称
4、adb  install  F:\Appium\CalcTest.apk     --正式安装App

测试apk下载地址:https://files.cnblogs.com/files/yyym/CalcTest.apk


如下图:192.168.229.101:5555就是我刚开启的Genymotion虚拟机

四、安装成功之后回到Genymotiong可以看到已经安装成功了

打开该应用,可以看到实际是个简单的计算器

五、打开Eclipse创建Maven项目并使用uiautomatorviewer工具(Android SDK工具包自带的)进行基本元素定位操作,元素定位方式前面我们已经详细讲解过了。
1、打开Android SDK可找到路径:android-sdks\tools如下(获取App包名可反编译:aapt dump badging apk路径)

2、打开uiautomatorviewr.bat


3、编写基本代码如下仅供参考:

package appium_demo;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.android.AndroidDriver;
/** * @author 李小卫 E-mail:yyymlxw@163.com @date 创建时间2018年2月11日上午10:10:02 */
public class calc_demo { public static void main(String[] args) throws MalformedURLException {
AndroidDriver driver;
DesiredCapabilities des = new DesiredCapabilities();
// des.setCapability("automationName", "Appium");//Selendroid //自动化的模式选择
// des.setCapability("app", "C:\\software\\CalcTest.apk");//配置待测试的apk的路径
// des.setCapability("browserName", "chrome"); //h5
des.setCapability("platformName", "Android");//平台名称
des.setCapability("platformVersion", "4.4");//手机操作系统版本
des.setCapability("udid", "192.168.229.101:5555");//连接的物理设备的唯一设备标识
des.setCapability("deviceName", "S4");//使用的手机类型或模拟器类型 UDID des.setCapability("appPackage", "com.sky.jisuanji");//App安装后的包名,注意与原来的CalcTest.apk不一样
des.setCapability("appActivity", ".JisuanjizixieActivity");//app测试人员常常要获取activity,进行相关测试,后续会讲到 des.setCapability("unicodeKeyboard", "True");//支持中文输入
des.setCapability("resetKeyboard", "True");//支持中文输入
des.setCapability("newCommandTimeout", "10");//没有新命令时的超时时间设置
des.setCapability("nosign", "True");//跳过检查和对应用进行 debug 签名的步骤 driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), des);//虚拟机默认地址
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//设置超时等待时间,默认250ms
driver.findElement(By.id("com.android.calculator2:id/digit1")).click();//定位'1'
driver.findElement(By.id("com.android.calculator2:id/plus")).click();//定位'+'
driver.findElement(By.id("com.android.calculator2:id/digit6")).click();//定位'6'
driver.findElement(By.id("com.android.calculator2:id/equal")).click();//定位'='
} }   

六、使用TestNG编写正式测试用例并开始执行测试了

package appium_operate;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import io.appium.java_client.android.AndroidDriver;
/** * @author 李小卫 E-mail:yyymlxw@163.com @date 创建时间2018年2月11日上午10:30:02 */
public class CalcTest {
AndroidDriver driver;
@BeforeTest
public void setUp() throws MalformedURLException{
DesiredCapabilities des = new DesiredCapabilities();
// des.setCapability("app", "c:\\");
des.setCapability("platformName", "Android");
des.setCapability("platformVersion", "4.4");
des.setCapability("udid", "192.168.43.101:5555");
des.setCapability("deviceName", "s4");
des.setCapability("appPackage", "com.android.calculator2");//com.android.contacts
des.setCapability("appActivity", ".Calculator");//.activities.PeopleActivity
des.setCapability("unicodeKeyboard", "True");
des.setCapability("resetKeyboard", "True");
des.setCapability("newCommandTimeout", "15");
des.setCapability("nosign", "True");
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test(enabled = false)
public void add() {
driver.findElement(By.xpath("//android.widget.Button[@text='5']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='+']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='8']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();
String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");
Assert.assertEquals(value, "13");
} @Test(enabled = false)
public void sub() {
driver.findElement(By.xpath("//android.widget.Button[@text='1']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='0']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='-']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='8']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();
String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");
Assert.assertEquals(value, "2");
} @Test(enabled = false)
public void mul() {
driver.findElement(By.xpath("//android.widget.Button[@text='5']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='×']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='8']")).click();
driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();
String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");
Assert.assertEquals(value, "40");
} @DataProvider(name="testdata")
public Object[][] getData(){
return new Object[][]{{"20","80","100","+"},{"90","3","270","×"},{"6","2","3","÷"}};
} @Test(dataProvider = "testdata")
public void calcTestcase(String num1,String num2,String result,String calcType){
for(char num:num1.toCharArray()){
driver.findElement(By.xpath("//android.widget.Button[@text='"+String.valueOf(num)+"']")).click();
}
driver.findElement(By.xpath("//android.widget.Button[@text='"+calcType+"']")).click();
for(char num:num2.toCharArray()){
driver.findElement(By.xpath("//android.widget.Button[@text='"+String.valueOf(num)+"']")).click();
}
driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();
String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");
Assert.assertEquals(value, result);
}
}

  

Java + Selenium + Appium手机自动化测试的更多相关文章

  1. 手机自动化测试:搭建appium手机自动化测试开发环境

    手机自动化测试:搭建appium手机自动化测试开发环境   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  2. TIB自动化测试快讯 - Appium手机自动化测试学习资料精选

    TIB自动化测试快讯 - Appium手机自动化测试学习资料精选   Appium+Android+Javahttp://automationqa.com/forum.php?mod=viewthre ...

  3. java+Selenium+TestNg搭建自动化测试架构(1)实现代码和数据的分离

    1.主要介绍介绍Java+Selenium+POM的自动化测试框架的搭建,第一个首先实现代码和账号URL等信息的分离.第二点支持跨浏览器,通过读取配置文件的方式实现. 1)将账号URL等信息添加在pr ...

  4. 基于Java+Selenium的WebUI自动化测试框架(六)---浏览器初始化

    本篇我们来讨论,如何写一个浏览器初始化的类.在写之前,先思考一下,我们需要一个什么样的初始化? 先来看看使用原生的Java + selenium是怎么做的.(以firefox为例) System.se ...

  5. java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)

    1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例 ...

  6. 一个完整的Appium手机自动化测试实例

    实现过程: 1.使用环境 appium .安卓SDK .python 本文重点是自动化实例,环境搭建过程省略. 2.找到被测APP的包名和Activity Name 手机连接上电脑后,在DOS环境先使 ...

  7. 基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器

    对于自动化测试,尤其是UI的自动化测试.是很多做黑盒功能测试的同学,入门自动化测试一个最为直观的或者说最容易理解的途径之一. 对于手工测试和自动化测试的优劣,网上有很多论述,在这里不作展开讨论.但是, ...

  8. 基于Java+Selenium的WebUI自动化测试框架(十四)-----使用TestNG的Sample

    到目前为止,我们所写的东西,都是集中在如何使用Selenium和Java来定位和读取元素.那么,到底如何具体开展测试,如何实现参数化,如何实现判定呢?下面,我们来看看Java应用程序的测试框架吧. 当 ...

  9. Java&Selenium&TestNG&ZTestReport 自动化测试并生成HTML自动化测试报告

    一.摘要 本篇博文将介绍如何借助ZTestReport和HTML模版,生成HTML测试报告的ZTestReport 源码Clone地址为 https://github.com/zhangfei1984 ...

随机推荐

  1. UVA 10746 Crime Wave - The Sequel

    最小费用最大流 源点->警察->bank->汇点 剩下的模板就可以 #include <map> #include <set> #include <li ...

  2. 有关cookie的内容

    包括: Cookie概述(Cookie的存放,有效期和作用域) Cookie操作(保存Cookie,读取Cookie,Cookie的生命周期) Cookie工作原理(Cookie与会话跟踪,Cooki ...

  3. 将打开的网页以html格式下载到本地

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. (1) SpringBoot创建发布

    一.安装jdk8 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二.配置环境 ...

  5. java序列化的机制与原理

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...

  6. Uva 11077 Find the Permutation

    可以发现最优的方案就是一个循环节内互换. 所以一个有n个元素,c个循环节的置换的交换次数(最少)是n-c. 然后就可以递推了,把i插入到前i-1个元素构成的置换中,要么新成立一个循环,要么加入到之前的 ...

  7. bzoj 3462: DZY Loves Math II

    3462: DZY Loves Math II Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 103[Submit][Sta ...

  8. 十. 图形界面(GUI)设计4.面板

    面板有两种,一种是普通面板(JPanel),另一种是滚动面板(JScrollPane). JPanel 面板是一种通用容器,JPanel的作用是实现界面的层次结构,在它上面放入一些组件,也可以在上面绘 ...

  9. extjs combo中给Store插入一条数据

    { xtype: 'combo', columnWidth: .55, name: 'AQLLevel', store: Ext.create('Scripts.Code.Common.store.I ...

  10. 2.IsoDep类

    IsoDep 类概述: Provides access to ISO-DEP (ISO 14443-4) properties and I/O operations on a Tag. Acquire ...