【转】Appium 服务器端从启动到case完成的活动分析
原文地址:http://blog.csdn.net/zhubaitian/article/details/39474151
此文的目的主要是通过分析Appium Server打印出来的log,加深对Appium Server所扮演角色的理解。
这整一个过程是由一个Test Case开始执行到结束,测试的对象是SDK自带的NotePad.apk。 Test Case很简单:打开Notepad程序,然后点击安卓的Menu Options按钮调出“Add Note”菜单按钮,然后点击该按钮,然后完成测试。
- package majcit.com.AppiumDemo;
 - import io.appium.java_client.AppiumDriver;
 - import java.io.File;
 - import java.net.URL;
 - import java.util.List;
 - import org.junit.Test;
 - import org.junit.After;
 - import org.junit.Before;
 - import org.openqa.selenium.By;
 - import org.openqa.selenium.WebElement;
 - import org.openqa.selenium.remote.CapabilityType;
 - import org.openqa.selenium.remote.DesiredCapabilities;
 - import org.openqa.selenium.remote.RemoteWebDriver;
 - import org.openqa.selenium.*;
 - import static org.hamcrest.Matchers.*;
 - import static org.hamcrest.MatcherAssert.assertThat;
 - /**
 - * Unit test for simple App.
 - */
 - public class NoetPadTest {
 - /**
 - * Create the test case
 - *
 - * @param testName name of the test case
 - */
 - private AppiumDriver driver;
 - @Before
 - public void setUp() throws Exception {
 - // set up appium
 - File classpathRoot = new File(System.getProperty("user.dir"));
 - File appDir = new File(classpathRoot, "apps");
 - File app = new File(appDir, "NotePad.apk");
 - DesiredCapabilities capabilities = new DesiredCapabilities();
 - capabilities.setCapability("deviceName","iPad Simulator");
 - //capabilities.setCapability("platformVersion", "4.2");
 - capabilities.setCapability("platformName", "Android");
 - capabilities.setCapability("app", app.getAbsolutePath());
 - //capabilities.setCapability("appPackage", "com.example.android.notepad");
 - //capabilities.setCapability("appActivity", "com.example.android.notepad.NotesList");
 - //capabilities.setCapability("appActivity", ".NotesList");
 - driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
 - }
 - @After
 - public void tearDown() throws Exception {
 - driver.quit();
 - }
 - @Test
 - public void addContact() throws InterruptedException{
 - driver.sendKeyEvent(82);
 - try {
 - Thread.sleep(3000);
 - }catch(Exception e) {
 - System.out.println(e.getMessage());
 - }
 - WebElement el = driver.findElement(By.name("Add note"));
 - el.click();
 - try {
 - Thread.sleep(60000);
 - }catch(Exception e) {
 - System.out.println(e.getMessage());
 - }
 - }
 - }
 
下面我们就通过分析Log把Appium Server所做的事情分步骤描述一下。
1. 启动REST http服务器,默认监听本地4723端口,用于接收客户端(Test Case+Selenium/Appium Driver)发过来的JSON格式的命令指示。
2. 根据客户端提供的capabilities指示建立一个Android Sesision用于跟客户端保持后续通信
3. 通过”adb devices“命令检查安卓手机是否已经准备好
4.使用工具“aapt dump badging NotePad.apk"来获得Notepad的packageName和launchable activityName,注意示例代码中是没有指定这个两个capabilities的
5. 安卓手机shell调用命令获得机器的API Level是否已经超过16:"adb.exe -s HT21atd05099 shell getprop ro.build.version.sdk"
6. 通过adb执行相应的shell命令检查目标应用是否已经存在:“pm list packages -3 com.example.android.notepad"
7. 目标机器上清理目标应用运行环境:该停止就停止该清空数据就清空数据
8. 建立Appium Server到目标机器上的端口转发
9. 把AppiumBootStrap.apk push到目标设备:这是目标机器上通过uiautomator工具(框架)运行的服务端,用于接受处理client端发送过来的命令
10. 把settings_apk-debuug.apk和unlock_apk-debug.apk push到目标设别:TBD
11. 保证uiautomator没有已经在跑
12. 通过adb把目标机器上的AppiumBootStrap跑起来:"uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap.Rootstrap".
13.通过adb在目标机器上 Launch notepad应用
14. 通知PC端目标应用已经在目标机器启动成功
15. 处理客户端发过来的”按下系统菜单“的命令:bootstrap把接受到的命令入队列,执行完成后通知客户端执行结果
16.定位”Add Note“菜单按钮:Bootstrap通过的UIAutomator的UISelector类根据Text获得菜单按钮的ID并返回给客户端
17. BootStrap执行”点击 Add Note菜单"命令
18. 测试完成,目标机器模拟点击Home按钮把目标应用放在后台
19. 关闭logcat
20. 关闭Uiautomator进程
【转】Appium 服务器端从启动到case完成的活动分析的更多相关文章
- Appium服务器端从启动到case完成的活动分析
		
此文的目的主要是通过分析Appium Server打印出来的log,加深对Appium Server所扮演角色的理解. 这整一个过程是由一个Test Case开始执行到结束,测试的对象是SDK自带的N ...
 - Python+Appium学习之启动手机APP或者浏览器
		
一.启动浏览器:pycharm中python脚本如下: from appium import webdriver desired_caps ={ 'platformName':'Android', ' ...
 - Appium  命令行启动配置
		
Appium 安装过后,会有图形界面,同样也支持命令行参数的启动和配置 Windws: 在windows 安装配置Appium有三种方式: Node install -g appium .exe文件安 ...
 - Appium 的安装启动
		
Appium 的安装方式根据官网提供的是使用nodejs 安装,但是官方给出了三种方法 参考网址: appium下载地址: https://bitbucket.org/appium/appium.ap ...
 - Appium之连续启动多个应用(APP)
		
我们知道Appium应用启动时自带的caps可以先行启动某个应用(基于appPackage和appActivity),那么如何用其连续启动多个应用呢? 这里就需要用到start_activity()方 ...
 - Appium + python自动化 - 启动app
		
各种百度将Appium + python的环境搭建好后,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动app呢?首先要获取包名,然后获取launche ...
 - Appium命令行启动,提示找不到命令,本地没有appium.cmd文件
		
安装appium时,直接从github上下载的appium-desktop-windows版本,安装后,从打开桌面端Server,能启动服务,appium-doctor也能正常运行. 但奇怪的地方来了 ...
 - python appium server代码启动和关闭遇到的坑
		
第一次使用博客,小白级,互相交流,有说的不对的地方欢迎来喷!!! 自动化的目的就是减少人工成本,如果每次跑自动化用例时都要手动起appium客户端,太费事了~~故,将appium server的调起和 ...
 - Appium——解决每次启动时都安装setting和unlock app方法
		
找到appium安装目录 C:\Program Files (x86)\Appium\node_modules\appium\lib\devices\android 修改代码,注释掉弹出setting ...
 
随机推荐
- MySQLHA系列MHA(一)
			
MHA,这是Master High Availability Manager and Tools for MySQL,一个日本MySQL专家们使用Perl语言编写的一个脚本管理工具.该工具仅适用于My ...
 - Linux下一个Nginx安装步骤
			
一个.下载pcre 官网下载:http://www.pcre.org/ # wget http://sourceforge.net/projects/pcre/files/pcre/8.35/pcre ...
 - 【C语言探索之旅】 第二部分第六课:创建你自己的变量类型
			
内容简介 1.课程大纲 2.第二部分第六课: 创建你自己的变量类型 3.第二部分第七课预告: 文件读写 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...
 - UVA11396-Claw Decomposition(二分图判定)
			
题目链接 题意:能否将一张无向连通图分解成多个爪型.每一条边仅仅能属于一个爪型,每一个点的度数为3. 思路:当图分解成类干个爪型时,每条边仅仅属于一个爪子,所以每条边的两个点一定要处于2个不同的鸡爪中 ...
 - 第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息
			
原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条 ...
 - NET功能集
			
NET功能集 目录 1. ObsoleteAttribute2. 设置默认值属性: DefaultValueAttribute3. DebuggerBrowsableAttribute4. ??运算符 ...
 - ios新开发语言swift 新手教程
			
http://gashero.iteye.com/blog/2075324 视频教程:http://edu.51cto.com/lesson/id-26464.html
 - HDU 3032 Nim or not Nim? (需求的游戏SG功能)
			
意甲冠军:经典Nim游戏转换,给你n礧pi,每个堆栈有pi石头, Alice和Bob轮流石头,意一堆中拿走随意个石子,也能够将某一堆石子分成两个小堆 (每堆石子个数必须不能为0).先拿完者获胜 思路: ...
 - Partitioner分区过程分析
			
Partition中国人意味着分区,意义的碎片,这个阶段也是整个MapReduce该过程的第三阶段.在Map返回任务,是使key分到通过一定的分区算法.分到固定的区域中.给不同的Reduce做处理,达 ...
 - 朝花夕拾-4-shell
			
引言 shell,我们常常会用到,以其强大的功能,会帮助我们解决非常多棘手的问题.近期遇到一个问题,要跑非常多case,假设串行的执行,须要非常久.能不能让他们并行起来,但又不能全部case都并行执行 ...