实现appium的自动化,三步走,具体如下:

第一步:启动appium的服务端:

可以通过命令行的方式启动:cmd,然后输入appium,如下图

也可以打开桌面程序appium,点击右上角的运行按钮,如下图:

第二步,写自动化脚步,我这里用eclipse写的,使用appium的java客户端,如下图:

报错是因为我没有加载相应的包,加载一下就可以了,如下图红圈里面的这些包。(记得把Junit4或者是Testng也加载一下)

我先来说一下我的这个代码,我采用了MVC框架的思想,分为业务层(M),视图层(V),数据层(c)。

其中calculator.java文件,放的就是业务层的代码,在这里,我只关心业务层面,除非业务发生变化,否则我都无需修改写好的脚本。

po_android.java文件,我放的是页面元素,页面元素可以通过E:\ADT\sdk\tools下的uiautomatorviewer.bat程序获取。

还有一个数据层,当你需要进行数据的参数化时,就需要用到了,比如用10个不同的用户和密码进行不断的登录和退出。我这里没有创建数据层,如果需要,建一个data.java即可。

还有就是app目录,把需要执行的apk包放到这里即可。

显附上我的代码:

calculator.java

  1. package com;
  2. /*问题汇总
  3. * 1.触摸和多点触摸
  4. * 2.等待元素出现时间
  5. * 3.多端口多手机进行自动测试
  6. * 4.参数化
  7. * 5.异常情况不退出程序,继续执行到完
  8. *
  9. * */
  10. import java.io.File;
  11. import java.net.URL;
  12. import java.util.List;
  13.  
  14. import org.junit.AfterClass;
  15. import org.junit.Assert;
  16. import org.junit.BeforeClass;
  17. import org.junit.Test;
  18. import org.openqa.selenium.By;
  19. import org.openqa.selenium.WebElement;
  20. import org.openqa.selenium.remote.DesiredCapabilities;
  21.  
  22. import io.appium.java_client.AppiumDriver;
  23. import io.appium.java_client.TouchAction;
  24. import io.appium.java_client.android.AndroidDriver;
  25. import page_object.android.po_android;
  26.  
  27. import static org.junit.Assert.*;
  28.  
  29. public class calculator {
  30. private static AppiumDriver<WebElement> driver;
  31. private po_android po = new po_android();
  32. @BeforeClass
  33. public static void setUp() throws Exception {
  34. File classpathRoot = new File(System.getProperty("user.dir"));
  35. File appDir = new File(classpathRoot, "/app");
  36. File app = new File(appDir, "mywork.apk");
  37. DesiredCapabilities capabilities = new DesiredCapabilities();
  38. capabilities.setCapability("deviceName","Android Emulator");
  39. capabilities.setCapability("platformVersion", "5.0");
  40. capabilities.setCapability("app", app.getAbsolutePath());
  41. // capabilities.setCapability("appPackage", "org.solovyev.android.calculator");
  42. // capabilities.setCapability("appActivity", ".CalculatorActivity");
  43. capabilities.setCapability("appPackage", "com.witdoing.mywork");
  44. capabilities.setCapability("appActivity", ".view.welcome.WelcomeActivity");
  45. capabilities.setCapability("unicodeKeyboard", "True");
  46. capabilities.setCapability("resetKeyboard", "True");
  47.  
  48. driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
  49. Thread.sleep(5000);
  50. }
  51.  
  52. @AfterClass
  53. public static void tearDown() throws Exception {
  54. driver.quit();
  55. }
  56.  
  57. //登录
  58. @Test
  59. public void apiDemo01() throws Exception{
  60. Thread.sleep(5000);
  61. driver.findElementById(po.logid).clear();
  62. driver.findElementById(po.logid).sendKeys("15850506429");
  63.  
  64. driver.findElementById(po.passwd).clear();
  65. driver.findElementById(po.passwd).sendKeys("654321");
  66.  
  67. driver.findElementById(po.login).click();
  68.  
  69. }
  70.  
  71. //订单
  72. @Test
  73. public void apiDemo02() throws Exception{
  74.  
  75. driver.findElement(By.id(po.order_layout)).click();
  76. driver.findElementById(po.iv_title_back).click();
  77.  
  78. }
  79.  
  80. //我做ing
  81. @Test
  82. public void apiDemo03() throws Exception{
  83.  
  84. driver.findElementById(po.work_layout).click();
  85. driver.findElement(By.id(po.iv_title_back)).click();
  86.  
  87. }
  88.  
  89. //设置-关于我做
  90. @Test
  91. public void apiDemo04() throws Exception{
  92.  
  93. driver.findElementById("com.witdoing.mywork:id/setting_tv").click();
  94. driver.findElement(By.id("com.witdoing.mywork:id/about_tv")).click();
  95. Assert.assertEquals("关于我做",driver.findElementById("com.witdoing.mywork:id/tv_title_text").getText());
  96. Assert.assertEquals("版本 1.0.5", driver.findElementById("com.witdoing.mywork:id/version_tv").getText());
  97. List<WebElement> els = driver.findElementsByClassName("android.widget.TextView");
  98. assertEquals("官方微信: witdoing", els.get(4).getText());
  99. driver.findElementById(po.iv_title_back).click();
  100. }
  101.  
  102. //设置-昵称
  103. @Test
  104. public void apiDemo05() throws Exception{
  105. driver.findElementById("com.witdoing.mywork:id/nick_tv").click();
  106. driver.findElement(By.id("com.witdoing.mywork:id/nick_edit")).click();
  107. driver.findElement(By.id("com.witdoing.mywork:id/nick_edit")).sendKeys("我的名字叫什么2");
  108. driver.findElementById("com.witdoing.mywork:id/save_btn").click();
  109. driver.findElementById("com.witdoing.mywork:id/dialog_confirm_btn").click();
  110. driver.findElementById(po.iv_title_back).click();
  111. Assert.assertEquals("我的名字叫什么",driver.findElementById("com.witdoing.mywork:id/nick_tv").getText());
  112. driver.findElementById(po.iv_title_back).click();
  113. }
  114.  
  115. //设置-宝库
  116. @Test
  117. public void apiDemo06() throws Exception{
  118. driver.findElementById("com.witdoing.mywork:id/treasury_layout").click();
  119. List<WebElement> els = driver.findElementsById("com.witdoing.mywork:id/title_tv");
  120. Assert.assertEquals("宝库新分享了一篇文章[自动化测试问题汇总V3]。", els.get(1).getText());
  121. els.get(1).click();
  122.  
  123. WebElement el = driver.findElementById("com.witdoing.mywork:id/content_img");
  124. TouchAction action = new TouchAction(driver);
  125. action.longPress(el).moveTo(100, 120);
  126.  
  127. Thread.sleep(5000);
  128. driver.findElementById(po.iv_title_back).click();
  129. driver.findElementById(po.iv_title_back).click();
  130.  
  131. }
  132.  
  133. }

po_android.java

  1. package page_object.android;
  2.  
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.support.FindBy;
  5.  
  6. public class po_android {
  7.  
  8. public String logid = "com.witdoing.mywork:id/user_edit" ;
  9. public String passwd = "com.witdoing.mywork:id/pwd_edit" ;
  10. public String login = "com.witdoing.mywork:id/login_btn" ;
  11. public String order_layout = "com.witdoing.mywork:id/order_layout" ;
  12. public String iv_title_back = "com.witdoing.mywork:id/iv_title_back" ;
  13. public String work_layout = "com.witdoing.mywork:id/work_layout" ;
  14.  
  15. @FindBy(id="com.witdoing.mywork:id/tv_title_text")
  16. public WebElement wzid;
  17.  
  18. }

第三步:

手机插入电脑,先安装一下手机驱动(如果自行安装失败的话,可以通过驱动人生进行安装)。

然后打开命令行cmd,输入adb查看手机设备是否已经被识别到。

如果识别到了,这时执行eclipse中的运行按钮,就可以看到手机开始进行自动化测试了。

appium自动化的一个实例的更多相关文章

  1. python自动化工具之pywinauto(一个实例)结合pyuserinput

    以下是pywinauto使用指南.这个窗口句柄可以在Spy++中查看 (Microsoft Spy++(查看窗口句柄) 10.00.30319 官方最新绿色版) python自动化工具之pywinau ...

  2. appium自动化测试之UIautomatorviewer元素定位

    appium自动化测试之UIautomatorviewer元素定位 标签(空格分隔): uiautomatorviewer元素定位 前面的章节,已经总结了怎么搭建环境,怎样成功启动一个APP了,这里具 ...

  3. Appium自动化—浅谈iOS自动化测试环境搭建

    在日常的测试工作中,我们会发现有些测试工作重复率极高,测试人员需要花费大量的时间进行这些重复性的测试,浪费了大量的人力与时间.若能够将常用的测试场景进行自动化,那必定能节省许多的人力与时间.作为一个初 ...

  4. appium自动化的工作原理(1)

    用appium开发移动端自动化测试脚本这么长时间,还没有认证的了解下它的原理是什么,到底是如何实现的呢? 1.先看一个Appium加载的过程图解(来自:了解appium自动化的工作原理--https: ...

  5. Appium自动化 - 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘

    问题背景 做appium自动化的时候,使用了UiAutomator1驱动,然后设置了UnicodeKeyboard 执行自动化脚本之后,玩手机的时候发现平时用的输入法键盘没法调出来了 'automat ...

  6. Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面介绍过根据id,clas ...

  7. C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper

    前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...

  8. 转 C# 只允许运行一个实例

    来源:http://blog.csdn.net/jin20000/article/details/3136791 互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都 ...

  9. C# 只启动一个实例完全解决方案

    工作上经常会遇到"程序只能启动一个实例"这样的需求. 我想,这样的需求应该很普遍,所以没打算去动脑筋,去找谷歌问下就得了,用下来发现,不是这里不爽就是那里不行. 先说下我详细的几点 ...

随机推荐

  1. 第三十五章 POSIX共享内存

    POSIX共享内存函数介绍 shm_open 功能: 用来创建或打开一个共享内存对象 原型: int shm_open(const char *name, int oflag, mode_t mode ...

  2. 使用“反向传播”迭代法求解y=√10

    X=√10,求X,也就是求Y=10 =X2 , X是多少. *重要的思想是,如何转化为可迭代求解的算法问题. *解数学问题,第一时间画图,求导,“直线化”. Y = X2 假如已知Y = 10 ,要求 ...

  3. [考试反思]1017csp-s模拟测试77(lrd day1) :反抗

    说在前面:强烈谴责AK神Mr_zkt没有丝毫素质RP-- 然而我也想没素质一次,但是我没机会AK一套除了B组题以外的题... 太菜了,没权力.人家AK了人家就是牛逼你没话说 达哥的题必须好好写反思. ...

  4. CSPS模拟 74

    T1 贪心,如果用set考虑一下multi. T2 难道是我的疑问都太过sb? 从来没人愿意认真思考一下我的问题. 更好,思考量这东西本该我自己来补. 设$dp[i][j]$为i个点的森林,j个点在特 ...

  5. Git基础使用

    前言 Git是版本控制系统,由Linux开源社区开发.与其他的版本系统相比,Git更加快速,便捷.主要是Git存储的是快照,而非差异性比较.并且绝大数操作都是访问本地文件和资源,没有网络时也可以直接提 ...

  6. 大数据之路week01--day02_2 集合方面的总结

    (初稿 太晚了,明天再进行补充) 1.对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. (2)案例: 用数组存储5个学生对象,并遍历数组 ...

  7. 8.3 NOIP 模拟12题解

    话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...

  8. 列转行pivot函数在SQL Sever里面和Oracle里面的用法区别

    首先pivot是一个列转行的函数,反向用是unpivot(行转列). 在SQL sever中可以这么写 SELECT * FROM [TABLE] /*数据源*/ AS A PIVOT ( MAX/* ...

  9. 在 ASP.NET Core 项目中使用 MediatR 实现中介者模式

    一.前言  最近有在看 DDD 的相关资料以及微软的 eShopOnContainers 这个项目中基于 DDD 的架构设计,在 Ordering 这个示例服务中,可以看到各层之间的代码调用与我们之前 ...

  10. javascript jquery 修改指定标签中的内容

    javascript jquery 修改指定标签中的内容 $("#test1").text("Hello world!"); document.getEleme ...