appium自动化的一个实例

实现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
 81       //我做ing
 82       @Test
 83         public void apiDemo03() throws Exception{
 84
 85           driver.findElementById(po.work_layout).click();
 86           driver.findElement(By.id(po.iv_title_back)).click();
 87
 88       }
 89
 90       //设置-关于我做
 91       @Test
 92         public void apiDemo04() throws Exception{
 93
 94           driver.findElementById("com.witdoing.mywork:id/setting_tv").click();
 95           driver.findElement(By.id("com.witdoing.mywork:id/about_tv")).click();
 96           Assert.assertEquals("关于我做",driver.findElementById("com.witdoing.mywork:id/tv_title_text").getText());
 97           Assert.assertEquals("版本 1.0.5", driver.findElementById("com.witdoing.mywork:id/version_tv").getText());
 98           List<WebElement> els = driver.findElementsByClassName("android.widget.TextView");
 99           assertEquals("官方微信: witdoing", els.get(4).getText());
100           driver.findElementById(po.iv_title_back).click();
101       }
102
103     //设置-昵称
104       @Test
105         public void apiDemo05() throws Exception{
106           driver.findElementById("com.witdoing.mywork:id/nick_tv").click();
107           driver.findElement(By.id("com.witdoing.mywork:id/nick_edit")).click();
108           driver.findElement(By.id("com.witdoing.mywork:id/nick_edit")).sendKeys("我的名字叫什么2");
109           driver.findElementById("com.witdoing.mywork:id/save_btn").click();
110           driver.findElementById("com.witdoing.mywork:id/dialog_confirm_btn").click();
111           driver.findElementById(po.iv_title_back).click();
112           Assert.assertEquals("我的名字叫什么",driver.findElementById("com.witdoing.mywork:id/nick_tv").getText());
113           driver.findElementById(po.iv_title_back).click();
114       }
115
116     //设置-宝库
117       @Test
118         public void apiDemo06() throws Exception{
119           driver.findElementById("com.witdoing.mywork:id/treasury_layout").click();
120           List<WebElement> els = driver.findElementsById("com.witdoing.mywork:id/title_tv");
121           Assert.assertEquals("宝库新分享了一篇文章[自动化测试问题汇总V3]。", els.get(1).getText());
122           els.get(1).click();
123
124           WebElement el = driver.findElementById("com.witdoing.mywork:id/content_img");
125           TouchAction action = new TouchAction(driver);
126           action.longPress(el).moveTo(100, 120);
127
128
129           Thread.sleep(5000);
130           driver.findElementById(po.iv_title_back).click();
131           driver.findElementById(po.iv_title_back).click();
132
133       }
134
135
136 }

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
16     @FindBy(id="com.witdoing.mywork:id/tv_title_text")
17     public WebElement wzid;
18
19 }

第三步:

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

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

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

时间: 2024-08-01 22:46:55

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

python+appium app自动化的方法实例运用

# -*- coding: utf-8 -*-import osimport sysimport timeimport unittest from appium import webdriver# from selenium import webdriverfrom HTMLTestRunner import HTMLTestRunnerfrom appium.webdriver.common.touch_action import TouchAction global driver class

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

用appium开发移动端自动化测试脚本这么长时间,还没有认证的了解下它的原理是什么,到底是如何实现的呢? 1.先看一个Appium加载的过程图解(来自:了解appium自动化的工作原理--https://blog.csdn.net/jffhy2017/article/details/69220719/) Appium的加载过程 1)调用Android adb完成基本的系统操作 2)向Android上部署bootstrap.jar 3)Bootstrap.jar Forward Android的端

appium自动化基础总结

---恢复内容开始--- 断断续续学了2周appium自动化,把经常用到基础写出来吧!方便日后便于查看. appium解决中文无法输入和,启动app自动清除数据的问题.在前置代码里面加上这3句就可以解决. desired_caps = { "unicodeKeyboard": "True", # 使用unicode输入法 "resetKeyboard": "True", # 重置输入法到初始状态 "noReset&q

只运行一个实例以及内存泄漏检测

unit 使应用程序只运行一个实例; interface uses Windows; const  // - 互斥体唯一的名字  _Mutex_Name = '{19631971-1976-1981-1989-199319941995}'; var  _Mutex_Handle: THandle; implementation initialization // - 载入时调用的代码 // - 创建互斥体对象_Mutex_Handle := CreateMutex(nil, False, LPC

C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实

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

来源:http://blog.csdn.net/jin20000/article/details/3136791 互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允 许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的.  要实现程序的互斥,通常有三中方式,下面 用 C#  语言来实现: 实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如

C++静态变量本身可否是一个实例对象

一般书上总是用int来举例,那个太简单.如果静态变量本身可否是一个实例对象呢?应该是可以,但是这样涉及到它的构造函数以及它内部的静态变量如何初始化两个问题,换而言之,这个静态变量本身应该如何初始化?这个问题和单例模式有些关系,回头查查. 以下是一个不成熟的例子,但是能编译运行通过. #include "stdafx.h" #include <iostream> using namespace std; class AAA { public: static int sss;

使程序只运行一个实例

//APP 里面 //1.// 此程序只能运行一次,用互斥量来判断程序是否已运行 1 HANDLE m_hMutex=CreateMutex(nullptr,TRUE, m_pszAppName); 2 if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; } //2. 1 HWND hWnd = FindWindow(nullptr, m_pszAppName/*_T("MyDlg")*/); //第一个参数: 窗口的类名

ArcGIS API for JavaScript开发环境搭建及第一个实例demo

原文:ArcGIS API for JavaScript开发环境搭建及第一个实例demo ESRI公司截止到目前已经发布了最新的ArcGIS Server for JavaScript API v3.9,它提供了更为丰富而又强大的功能.     一.安装前准备 1.ArcGIS Server for JavaScript API各版本下载地址:http://support.esrichina-bj.cn/2011/0223/960.html,我们选择下载最新的"ArcGIS API for Ja