文章出处http://blog.csdn.net/jiuzuidongpo/article/details/51790455

Appium在接收到客户端脚本的连接之后的初始化准备工作列表(细节部分详细叙述,只说重点):

下面提到的有关目录是自己的本地目录,需要注意。

1,检查app包是否存在,检查adb工具是否可用,检查java工具包版本。

2,确定设备,用命令

adb.exe devices

选择指定udid的设备

3,确定设备是否准备好,命令

adb.exe -s 16144573 wait-for-device

adb.exe -s 16144573 shell "echo 'ready'"

如果命令行输出ready,则表示准备好

4,检查设备的API版本号,命令

adb.exe -s 16144573 shell "getprop ro.build.version.sdk"

如果>=17,则可用

5,语言设置

获取设备当前使用语言(一般返回zh)

adb.exe -s 16144573 shell "getprop persist.sys.language"

生成string.json

java -jar "C:\Program Files (x86)\Appium\node_modules\appium\node_modules\appium-adb\jars\appium_apk_tools.jar" "stringsFromApk" "E:\workspace\appium-test\sample\apps\ContactManager\ContactManager.apk" "C:\Users\ADMINI~1\AppData\Local\Temp\com.example.android.contactmanager" zh

如果报错,则执行下面,生成string.json

java -jar "C:\Program Files (x86)\Appium\node_modules\appium\node_modules\appium-adb\jars\appium_apk_tools.jar" "stringsFromApk" "E:\workspace\appium-test\sample\apps\ContactManager\ContactManager.apk" "C:\Users\ADMINI~1\AppData\Local\Temp\com.example.android.contactmanager"

然后从string.json设置成默认语言

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 push "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\com.example.android.contactmanager\\strings.json" /data/local/tmp

6,检查aapt工具,并且用aapt工具分析apk包。

D:\soft\android-sdk-windows\build-tools\23.0.1\aapt.exe dump xmltree E:\workspace\appium-test\sample\apps\ContactManager\ContactManager.apk AndroidManifest.xml

获取到apk的进程名称:com.example.android.contactmanager,(如果指定的话,则没必要获取)。

和开始的activity:.ContactManager,(如果指定的话,没必要去获取)。

7,注册认证apk包

java -jar "C:\Program Files (x86)\Appium\node_modules\appium\node_modules\appium-adb\jars\verify.jar" E:\workspace\appium-test\sample\apps\ContactManager\ContactManager.apk

8,压缩apk包(Zip-aligning),并且放入手机中,这个过程有点儿复杂。

D:\soft\android-sdk-windows\build-tools\23.0.1\zipalign.exe -f 4 E:\workspace\appium-test\sample\apps\ContactManager\ContactManager.apk C:\Users\ADMINI~1\AppData\Local\Temp\116530-6572-vjd4bu\appium.tmp

获取MD5

MD5 for app is b2d2916bb5388e1dc281ec3e71ef1234

查看apk是否存在

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "ls /data/local/tmp/b2d2916bb5388e1dc281ec3e71ef1234.apk"

查看apk是否安装

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "pm list packages -3 com.example.android.contactmanager"

创建文件夹

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "mkdir -p /data/local/tmp/"

查看存在的apk

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "ls /data/local/tmp/*.apk"

删除存在的apk

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell rm "/data/local/tmp/29649242b53e9a67ba855b067422713c.apk"

放入手机中

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 push "E:\\workspace\\appium-test\\sample\\apps\\ContactManager\\ContactManager.apk" /data/local/tmp/b2d2916bb5388e1dc281ec3e71ef1234.apk

停止之前运行的

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "am force-stop com.example.android.contactmanager"

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "pm clear com.example.android.contactmanager"

卸载之前运行的

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 uninstall com.example.android.contactmanager

安装新apk包

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "pm install -r /data/local/tmp/b2d2916bb5388e1dc281ec3e71ef1234.apk"

9,绑定本机和boostrap通信的端口号

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 forward tcp:4724 tcp:4724

10,将bootstrap.jar放入手机中

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 push "C:\\Program Files (x86)\\Appium\\node_modules\\appium\\build\\android_bootstrap\\AppiumBootstrap.jar" /data/local/tmp/

11,让Unicode键盘可用

将Unicode输入法push到手机中

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 install "C:\Program Files (x86)\Appium\node_modules\appium\build\unicode_ime_apk\UnicodeIME-debug.apk"

获取手机当前的输入法,测试之后要恢复这个输入法

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "settings get secure default_input_method"

设置unicode键盘可用,并且为当前系统的默认输入法

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "ime enable io.appium.android.ime/.UnicodeIME"

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "ime set io.appium.android.ime/.UnicodeIME"

12,安装appiium的setting和unlock测试包

unlock

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 install "C:\Program Files (x86)\Appium\node_modules\appium\build\unlock_apk\unlock_apk-debug.apk"

Setting

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 install "C:\Program Files (x86)\Appium\node_modules\appium\build\settings_apk\settings_apk-debug.apk"

13,启动手机上的bootstrap。

首先停止手机上之前的boostrap:

获取当前运行的boostrap

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "ps 'uiautomator'"

获取到进程号16324,然后杀死

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell "kill 16324"

然后开始当前的boostrap

D:\soft\android-sdk-windows\platform-tools\adb.exe -s 16144573 shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap.Bootstrap -e pkg com.example.android.contactmanager -e disableAndroidWatchers false

14,然后就可以用socket和手机通信了,通信的前三步

第一步:

向手机端发送:{"cmd":"action","action":"wake","params":{}}

使手机觉醒,并且判断锁屏的情况(这个有待研究),如果锁屏,运行unlock可以解锁

D:\soft\android-sdk-windows\platform-tools\adb.exe -s NVY9AUSO5SAELRSC shell "am start -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000 -n io.appium.unlock/.Unlock"

第二步:

向手机发送:{"cmd":"action","action":"getDataDir","params":{}}

获取数据存放路径,正常返回{"value":"\/data\/local\/tmp","status":0},好像没啥用

再发送

{"cmd":"action","action":"compressedLayoutHierarchy","params":{"compressLayout":false}}

返回{"value":false,"status":0}

是某个支持项。

第三步:

启动要测试的apk

D:\soft\android-sdk-windows\platform-tools\adb.exe -s NVY9AUSO5SAELRSC shell "am start -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000 -n com.example.android.contactmanager/.ContactManager"

让app获得当前的焦点

D:\soft\android-sdk-windows\platform-tools\adb.exe -s NVY9AUSO5SAELRSC shell "dumpsys window windows"

  • 1. 建立session时常用命令:
DesiredCapabilities cap = new DesiredCapabilities();
cap.SetCapability("browserName", ""); // web 浏览器名称('Safari' ,'Chrome'等)。如果对应用进行自动化测试,这个关键字的值应为空。
cap.SetCapability("platformName", "Android");//你要测试的手机操作系统
cap.SetCapability("platformVersion", "4.4");//手机操作系统版本
cap.SetCapability("automationName", "selendroid"); //你想使用的自动化测试引擎:Appium (默认) 或 Selendroid
cap.SetCapability("deviceName", " Android Emulator"); //使用的手机类型或模拟器类型,真机时输入Android Emulator或者手机型号
cap.SetCapability("udid", udid); //连接的物理设备的唯一设备标识,Android可以不设置 cap.SetCapability("newCommandTimeout", "300"); //设置收到下一条命令的超时时间,超时appium会自动关闭session ,默认60秒
cap.SetCapability("unicodeKeyboard", "True");//支持中文输入,会自动安装Unicode 输入法。默认值为 false
cap.SetCapability("resetKeyboard", "True"); //在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态 cap.SetCapability("'app'", "D:\\AndroidAutomation\\AndroidAutoTest\\app\\zhongchou.apk"); //未安装应用时,设置app的路径 //手机已安装app,直接从手机启动app,上面路径不设置
cap.SetCapability("appPackage", "com.nbbank"); //你要启动的Android 应用对应的Activity名称|比如`MainActivity`, `.Settings`|
cap.SetCapability("appActivity", "com.nbbank.ui.ActivityShow"); //你想运行的Android应用的包名
cap.SetCapability("appWaitActivity", "com.nbbank.ui.ActivityLogo"); //你想要等待启动的Android Activity名称|比如`SplashActivity`| Uri serverUri = new Uri("http://127.0.0.1:4723/wd/hub");
driver = new AndroidDriver<IWebElement>(serverUri, cap, TimeSpan.FromSeconds(180));

更多详细查看官网:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.cn.md

  • 2. driver常用方法及注意事项

1) 常用方法:

driver.HideKeyboard();//隐藏键盘
driver.BackgroundApp(60);//60秒后把当前应用放到后台去
driver.LockDevice(3); //锁定屏幕 //在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity
driver.StartActivity("com.iwobanas.screenrecorder.pro", "com.iwobanas.screenrecorder.RecorderActivity");
driver.OpenNotifications();//打开下拉通知栏 只能在 Android 上使用
driver.IsAppInstalled("com.example.android.apis-");//检查应用是否已经安装
driver.InstallApp("path/to/my.apk");//安装应用到设备中去
driver.RemoveApp("com.example.android.apis");//从设备中删除一个应用
driver.ShakeDevice();//模拟设备摇晃
driver.CloseApp();//关闭应用
driver.LaunchApp();//根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。这不是用于启动指定的 app/activities
driver.ResetApp();//应用重置
driver.GetContexts();//列出所有的可用上下文
driver.GetContext();//列出当前上下文
driver.SetContext("name");//将上下文切换到默认上下文
driver.GetAppStrings();//获取应用的字符串
driver.KeyEvent(176);//给设备发送一个按键事件:keycode
driver.GetCurrentActivity();//获取当前 activity。只能在 Android 上使用
//driver.Pinch(25, 25);//捏屏幕 (双指往内移动来缩小屏幕)
//driver.Zoom(100, 200);//放大屏幕 (双指往外移动来放大屏幕)
driver.PullFile("Library/AddressBook/AddressBook.sqlitedb");//从设备中拉出文件
driver.PushFile("/data/local/tmp/file.txt", "some data for the file");//推送文件到设备中去 driver.FindElement(By.Name(""));
driver.FindElementById("id");
driver.FindElementByName("text");
driver.FindElementByXPath("//*[@name='62']");

2) 注意事项:
使用driver.Sendkeys(string str)向文本框输入内容前,最好先element.Click( )一下,否则某些情况下,输入的内容会请不掉,文本框提示的内容也会在 输入的文本前显示出来。sendkey方法在发送数据之前会清空一下文本框,一般不需要Clear,如前面的情况Clear后仍是存在的,click后正常

  • 3. 等待页面加载策略:

1) 显性等待:调用selenium的方法, 需要添加WebDriver.Support引用
显性等待是指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。但为什么说最不好呢?因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间

            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
element = wait.Until<IWebElement>((d) =>
{
return driver.FindElement(By.Id("userName"));
});

2) 隐性等待:设置时间不易过长,设置为500或1000即可
隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1));
  • 4. drive.KeyEvent(int )的使用: 可使用KeyEvent发送键盘数据,比如退格,Enter键等
driver.KeyEvent(3); //KEYCODE_HOME 按键Home 3
driver.KeyEvent(26); //KEYCODE_POWER 电源键 26
driver.KeyEvent(67); //KEYCODE_DEL 退格键 67
driver.KeyEvent(66); //KEYCODE_ENTER 回车键
driver.KeyEvent(122); //KEYCODE_MOVE_HOME 光标移动到开始
driver.KeyEvent(123); //KEYCODE_MOVE_END 光标移动到末尾
  • 5. 坐标操作

    为防止不同手机分辨率不同带来的影响,要避免使用固定的坐标,可以用以下方式获取元素的坐标

double Screen_X = driver.Manage().Window.Size.Width;//获取手机屏幕宽度
double Screen_Y = driver.Manage().Window.Size.Height;//获取手机屏幕高度
double startX = element.Location.X; //获取元素的起点坐标,即元素最左上角点的横坐标
double startY = element.Location.Y; //获取元素的起点坐标,即元素最左上角点的纵坐标
double elementWidth = element.Size.Width; //获取元素的宽度
double elementHight = element.Size.Height; //获取元素的宽度

在封装“滑动”、“ TouchAction”等操作时可以用以上方法来获取坐标进行操作。

示例:分装两个元素之间的滑动

        IWebElement elmentA = null;
IWebElement elmentB = null;
int startX = 0, startY = 0, endX = 0, endY = 0;
int duration=0,time=0;
/// <summary>
/// 从元素A的位置滑动到元素B的位置
/// </summary>
/// <param name="A">元素A的名称</param>
/// <param name="B">元素B的名称</param>
/// <param name="sDuration">滑动持续时间</param>
/// <param name="sTime">滑动次数</param>
public void SwipeAToB(string A, string B,string sDuration,string sTime)
{
startX = elmentA.Location.X + elmentA.Size.Width / 2; //元素A的中心横坐标
startY = elmentA.Location.Y + elmentA.Size.Height / 2; //元素A的中心纵坐标
endX = elmentB.Location.X + elmentB.Size.Width / 2; //元素B的中心横坐标
endY = elmentB.Location.Y + elmentB.Size.Height / 2; //元素B的中心纵坐标 duration = string.IsNullOrEmpty(sDuration) ? 1500 : int.Parse(sDuration); //持续时间为空时,默认设置为1500毫秒
time = string.IsNullOrEmpty(sTime) ? 1500 : int.Parse(sTime); //滑动次数为空时,默认设置为滑动1次 for (int i = 0; i < time; i++)
{
driver.Swipe(startX, startY, endX, endY, duration);
}
}

注意:element.Loaction和element.Size,每次获取时都会重新去手机里获取,为节省时间如果有获取相同值的,建议储存成变量。

  • 6. 取消重新安装unlock和setting

注销如下代码:

Appium\node_modules\appium\lib\devices\android\android.js

async.series([
this.initJavaVersion.bind(this),
this.initAdb.bind(this),
this.packageAndLaunchActivityFromManifest.bind(this),
this.initUiautomator.bind(this),
this.prepareDevice.bind(this),
this.checkApiLevel.bind(this),
this.pushStrings.bind(this),
this.processFromManifest.bind(this),
this.uninstallApp.bind(this),
this.installAppForTest.bind(this),
this.forwardPort.bind(this),
this.pushAppium.bind(this),
this.initUnicode.bind(this), // DO NOT push settings app and unlock app
//this.pushSettingsApp.bind(this),
//this.pushUnlock.bind(this), function (cb) {this.uiautomator.start(cb);}.bind(this),
this.wakeUp.bind(this),
this.unlock.bind(this),
this.getDataDir.bind(this),
this.setupCompressedLayoutHierarchy.bind(this),
this.startAppUnderTest.bind(this),
this.initAutoWebview.bind(this),
this.setActualCapabilities.bind(this)
], function (err) {

appium的初始化准备工作的更多相关文章

  1. Appium 服务器初始化参数(Capability)

    键 描述 值 automationName 自动化测试的引擎 Appium (默认)或者 Selendroid platformName 使用的手机操作系统 iOS, Android, 或者 Fire ...

  2. Appium 自动化测试(7) -- Appium 服务器初始化参数设置

    Desired Capabilities Desired capabilities 是一些发送给 Appium 服务器的键值对集合 (比如 map 或 hash),告诉服务器我们想要启动什么类型的自动 ...

  3. Appium服务器初始化参数(Capability)

    原文:https://blog.csdn.net/lilongsy/article/details/83010101 appium官方说明:https://appium.io/docs/cn/writ ...

  4. 手机自动化测试:Appium源码分析之跟踪代码分析六

    手机自动化测试:Appium源码分析之跟踪代码分析六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  5. 移动端自动化测试(一)之 Appium+Pyhton环境准备篇

    移动端自动化测试(一)之 Appium+Pyhton环境准备篇 2016-11-17 16:51 by CockRoacher, 5046 阅读, 1 评论, 收藏, 编辑 由于工作的需要进行Andr ...

  6. Appium、selenium与Robot Framework

    Robot Framework + Appium Appium-Python-Client: 与Appium Library和Appium Server的交互Appium Library通过Appii ...

  7. appium 弹窗处理

    测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...

  8. appium介绍和工作原理

    导读 Appium这个听起来既生疏也熟悉的自动化测试工具,比起原生的UiAutomator可能是异常的不起眼,可是却是有自身独当一面的能力,可以完成许多高难度作业,完成UiAutomator不可能完成 ...

  9. Appium 自动化实例代码

    自动化连接 B站 开始 如果下载node.js 的话 可以检查一下appium环境 命令行: appium-doctor 如果没有 可以安装   appium-doctor :npm install ...

随机推荐

  1. anaconda指定镜像源,解决conda下载速度慢失败问题

    conda升级默认官网地址,速度会特别慢,现在我们指定一个当前可用的镜像,步骤如下: 1.执行命令,生成.condarc文件 conda config --add channels https://m ...

  2. VM下redhat9.0不能上网

    近期本人在学习linux时,安装Red Hat Linux9后,可是上不了网,弄得查资料还得切换到虚拟机上去,特耗时间.还好没有疯掉! 首先,测试下你的linux看是否是这类问题,输入ping www ...

  3. visitor设计模式记录

    数据类型通过枚举来区分是一种简单实用的做法. 缺点是使用的时候需要通过if .switch 去判断什么类型执行什么分支操作,说是缺点其实也要看具体场景.不过如果if代码多会导致代码很长是肯定的. 复杂 ...

  4. Hive数据类型与文件存储格式

    Hive数据类型 基础数据类型: TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CH ...

  5. Java逍遥游记读书笔记<二>

    Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...

  6. WPF实用知识点

    1.一个基本的WPF程序, 需要引入的程序集WindowsBase, PresentationCore, PresentationFramework using System; using Syste ...

  7. Lumen 队列

    队列 简介 连接 Vs. 队列 驱动的必要设置 创建任务类 生成任务类 任务类结构 分发任务 延迟分发 任务链 自定义队列 & 连接 指定任务最大尝试次数 / 超时值 频率限制 错误处理 运行 ...

  8. js高级面试题

    <script> //1. var foo = { bar: function () { return this.baz; }, baz: 1 }; (function () { retu ...

  9. word页眉与页脚详解

    1.如何隔离封面等不需要插入页码的页面: 首先插入分节符下一页(一定是分节符),再在下一页(即要开始插入页码的页面)选择视图-->页眉和页脚-->设置为取消链接到前一页.设置页码格式为起始 ...

  10. 53、Gif 控件GifView 的使用,播放gif图片

    GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediaplay来显示这个问题的项目,其用法和 ImageView一样,支持gif图片.可监视GIF是否加载成 ...