app自动化

简历,web自动化流程 app安装
2018.10.27学习
1. 简历注意事项:
1> 个人技能需要在项目经验里体现出用到的技能;熟练或掌握的技能是在项目实践后才能达到的;
2> 简历格式工整,条理清晰;
3> 工作技能要从工作项目中体现每年都在增加,学习知识,技能;
4> 2,3年前的项目也需要写清楚一点工作职责;
2. 项目经验中:
1> 技能的递增,随着工作时间的增加,工作中应该用到测试技能也要越来越多,不要所有的项目经验中都是千遍一律,看不到你工作中的成长;
2> 对项目有贡献的地方一定要写出来;
3> 工作职责一定要写详细,清楚,写清楚你在这个项目中明明白白的做了什么事情,不要把个人技能的东西搬过来;
4> 不要写负责了登录,注册,我的账户的自动化测试,这不是你系统的核心业务,这样写就是在告诉面试官你在打酱油;
5> 自动化至少1年半以上才算是正真的在搞自动化;
3. 关于自动化:
1> 项目经验:写清楚项目当中,做了哪些方案的自动化测试,怎么做的
2> 与jenkins的集成,集成之后需要优化和提升测试用例的通过率,需要对每次定时任务的测试 这个过程中涉及到了脚本的优化和bug的发现;
3> 在自动化测试的项目实践的过程中,注意自动化带来的整体效率和成果,不要注重于框架的编写和框架在项目上的应用,需要考虑人力和时间的效率,所以框架的选择不但要考虑项目本身,还要考虑其他人员的能力;
4. web自动化项目的流程:
1> 先做的功能测试;2个月,了解功能业务(哪些模块比较稳定,哪些模块bug比较多,目前完成了哪些模块功能,正在开发哪些模块功能,每个模块的验证点是什么),以便后面自动化用例的设计和实现,之后只是手工转自动化的过程;
2> 自动化的计划:先小范围的实现最需要自动化的一个功能模块(选择模块的原则:模块比较稳定,模块经常出bug,模块功能最核心的业务), 用例大概多少个,大概多久完成,且向领导汇报计划;
3> 选择自动化框架的原则:
a> 依据项目的实际情况,整个项目的自动化过程由自己负责,而自己又善于写代码,那就选择代码的框架;
b> 如是多个人合作,而其他人不善于代码,那就选择RF工具;
4> 从功能用例中筛选适合自动化的核心业务功能用例,设计自动化用例;
5> 和测试团队评审测试用例,和用例优化级,以及是否合理,用自动化来代替手工测试;
6> 搭建自动化框架(如安装python,安装selenium库,测试框架库pytest,邮件功能SMTPLib),实现自动化(PO模式);
7> 完成几个用例后,接入jenkins上调试脚本,不断优化;
8> 实现自动化的过程中,你可能需要项目对业务非常熟悉的人的协助;
9> 做自动化测试,就像功能测试一样,也是需要向领导和团队定期反馈进展和结果的,告诉团队你做了哪些模块哪些功能的自动化测试,用例通过率如何,有哪些bug,让他们看到成果;
10> 演示自动化脚本执行过程,给大家展示测试报告,阶段性的让大家评审自动化测试用例;
**web自动化用例的用例率一般是80%以上,若是用例为50条以下,则通过率为90%以上,用例失败的原因:测试环境,bug的存在,脚本中的等待不满足,脚本的稳定性不高**
11> 某个模块的自动化脚本完成后,可以结合版本迭代进行回归验证,在每个转测版本中进行回归,解放该模块的手工测试;
12> jenkins晚上打包编译最新版本后,执行一下自动化脚本,之后将测试执行发送测试团体和相关人员,以知会团体相关人员;若测试报告中有失败的用例,需要分析根因,且在邮件中回复出来失败的原因;
13> 优化脚本,提高执行效率,提高脚本通过率等等维护工作;
**web自动化前期是实现过程,后期是投入使用和调优维护脚本**

5. python代码和driver驱动是怎么交互的?通过http协调。
6. app环境安装
python程序和真机或模拟器(在PC电脑端)进行交互;通过adb命令进行数据传输;ADT工具解压,之后配置环境变量; appinum server 真机/模拟器交互;
1> 安装nodes.js;
2> 安装appium server:即Appium.ext程序,python程序(python客户端)通过http协议发送命令给appium server,之后appium server就去操作真机和模拟器; 需要nodes.js支撑
3> 真机开启usb调试模式即可;
4> 安装模块器:需要genymotion或是叶神??
5> 安装JDK:1.8版本以上,因为有些命令的执行需要JDK支持;
6> 安装ADT:
7> 安装appium python客户端:pip3 install Appium-Python-Client

###adb命令
2018.10.30学习
1. adb常用命令:
1> **adb devices** 显示当前运行的全部模拟器或真机;
2> adb start-server 启动ADB
3> adb kill-server 停止ADB
PS: 当adb出现问题或adb启动不起来时,先kill然后再start
4> **adb install -r [apk文件]** 安装应用程序, -l 锁定该程序; -r 重新安装该程序,保存数据;
-s 安装在SD卡内,而不是设备内部存储,如adb install --r D:\mm.apk
5> 卸载应用程序 adb uninstall [packagename],如adb uninstall com.tencent.mm,-k 不删除程序运行所产生的数据和缓存目录(如软件的数据库文件)
6> **adb pull** 设备目录 本地目录:将手机设备中的文件copy到本地计算机,如adb pull /sdcard/mm.txt D:\ ,即为将内存卡根目录的mm.txt文件copy到D盘根目录
7> **adb push** 本地目录 手机设备目录,如 adb push D:\mm.txt /sdcard
8> adb shell screencap -p 截图文件路径 : 截屏
9> adb shell dumpsys dbinfo [packagename] : 查看指定包名应用的数据库储存信息(包括存储的SQL语句)
10> adb shell dumpsys meminfo[packagename/pid] 可以查看进程当前的内存情况,如adb shell dumpsys meminfo com.tencent.mm
11> adb shell dumpsys [packagename]:查看指定包名应用的详情信息,相当于AndroidMainfest.xml中内容,如adb shell dumpsys com.tencent.mm
12> adb shell dumpsys activity top:查看当前应用的activity信息;adb bugreport:查看bug报告;
13> adb shell pm list packages:列出手机安装的所有apk包名;
a> adb shell pm list packages -s:系统应用;
b> adb sehll pm list packages -3:第三方应用;
c> adb shell pm list packages | grep qq;
14> adb shell pm clear [packagename] : 清除应用缓存信息;
15> adb shell am start -n [packagename] :通过adb启动应用程序页面;如adb shell am start -n com.tencent.mm/.ui.SplashActivity
PS: 强制停止应用有时会卡死,需要强制信息,则执行:adb shell am force-stop com.tencent.mm
16> adb shell logcat -b radio:记录无线通讯日志;
PS:一般来说,无线通讯日志非常多,在运行时没必要去记录
17> adb get-product:获取设备的ID ; adb get-serialnoL:获取设备的序列号;
18> adb shell sqlite3 : 访问数据库SQLite3 ;
19> 导出设备信息:
a> adb get-serialno > 序列号.txt;
b> adb shell cat /sys/class/net/wlan0/address > MAC地址.txt ;
c> adb shell getprop ro.product.model > 设备型号.txt
d> adb shell getprop ro.build.version.release> 系统版本.txt
e> adb shell pm list packages -s > 系统应用的所有包名.txt
f> adb shell pm list packages -3 > 第三方应用包名.txt
g> adb shell wm size > 屏幕分辨率.txt
h> adb shell wm density > 屏幕密度.txt
i> adb shell cat /proc/cpuinfo > CPU信息.txt
k> adb shell pm list permissions -f > 权限.txt
l> adb shell pm list users -f > 用户.txt
20> adb reboot 重启
21> cd system/sd/data:进入系统内指定文件夹;rm -r XXX 删除名字XXX的文件夹及其里面所有的文件; rm xxx 删除文件xxx; rmdir xxx 删除xxx的文件夹;
22> adb shell dumpsys activity | find "mFocusedActivity" 获取当前正在前台使用的app包名;(有时不太准确)
23> adb shell : 登录设备shell命令模式下
24> adb connect/disconnect 通过wifi进行远程连接手机进行调试

2. appium可以用于安卓和IOS系统:
pc端 ---> appium -----> 模拟器/真机
python代码 server

pc端 ----> ----> 模拟器/真机
3. adb(Android Debug Bridge) 是android sdk的一个工具
1> adb是用来连接安卓手机和PC端的桥梁,用户通过在pc端使用adb命令操作安卓手机;
2> adb具有安装卸载apk,拷贝推送文件,查看设备硬件信息,查看应用程序占用资源情况,让设备执行shell命令等功能;
4. adb组成:
1> 客户端client:运行在你的电脑上,可以通过shell来调用起一个客户端; 其他android工具如ADT插件, DDMS都可以创建出一个客户端;
2>服务器server:运行在你电脑后台,负责管理client和daemon进行通信;
3> 守护进程daemon:运行在模拟器或者android设备的后台;
验证adb命令是否常:在windows的命令行,输入adb -version
5. 真机准备:
1> 需要确认你的手机已通过usb线连接到电脑;
2> 通过驱动软件,驱动精灵/驱动人生等,将你的android手机驱动安装好;
3> 进入到手机,开启手机的开发者模式;
4> 退出到上一级菜单,进入到开发者选项,找到USB调试模拟器将其打开;
5> 可能会弹出一个允许调试的对话框,勾选上同意,不然abd devices命令检查不到设备;

6. app自动化时,需要获取包名和入口页面(登录app时显示的第一个页面)
7. 能够非常准确获取应用包名和入口activity:
1> aapt命令执行目录:F:\adt-bundle-windows-x86_64-20140702\sdk\build-tools\android-4.4W下有一个appt.ext
2> appt命令语法:**aapt dump badging apk应用包名**,如aapt dump badging D:\BaiduNetdiskDownload\Future-release.apk
aapt dump badging D:\worksoft_packs\huawei.w3.W3App.apk
执行结果如下:其中的name='com.xxzb.fenwoo'为应用包名;入口activity为:launchable-activity: name='com.xxzb.fenwoo.activity.addition.WelcomeActivity'

F:\adt-bundle-windows-x86_64-20140702\sdk\build-tools\android-4.4W>aapt dump badging D:\worksoft_packs\Future-release-2018.apk
package: name='com.xxzb.fenwoo' versionCode='8' versionName='1.0.8'
sdkVersion:'9'
targetSdkVersion:'22'
uses-permission:'android.permission.SYSTEM_ALERT_WINDOW'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'
uses-permission:'android.permission.ACCESS_WIFI_STATE'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.ACCESS_COARSE_LOCATION'
uses-permission:'android.permission.ACCESS_FINE_LOCATION'
uses-permission:'android.permission.CHANGE_WIFI_STATE'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.MOUNT_UNMOUNT_FILESYSTEMS'
uses-permission:'android.permission.READ_LOGS'
uses-permission:'android.permission.DISABLE_KEYGUARD'
uses-permission:'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION'
uses-permission:'android.permission.ACCESS_DOWNLOAD_MANAGER'
uses-permission:'android.permission.VIBRATE'
uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission:'android.permission.WRITE_SETTINGS'
uses-permission:'android.permission.RECEIVE_SMS'
uses-permission:'android.permission.CAMERA'
uses-permission:'android.permission.WAKE_LOCK'
uses-permission:'android.permission.GET_TASKS'
uses-permission:'getui.permission.GetuiService.com.xxzb.fenwoo'
uses-permission:'android.permission.BLUETOOTH'
uses-permission:'android.permission.BLUETOOTH_ADMIN'
uses-feature:'android.hardware.camera'
uses-feature-not-required:'android.hardware.camera.autofocus'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
application-label:'鍓嶇▼璐?
application-label-zh:'鍓嶇▼璐?
application-icon-120:'res/drawable-ldpi-v4/ic_launcher.png'
application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png'
application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png'
application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png'
application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png'
application: label='鍓嶇▼璐? icon='res/drawable-mdpi-v4/ic_launcher.png'
launchable-activity: name='com.xxzb.fenwoo.activity.addition.WelcomeActivity' label='' icon=''
uses-feature:'android.hardware.location'
uses-implied-feature:'android.hardware.location','requested a location access permission'
uses-feature:'android.hardware.location.gps'
uses-implied-feature:'android.hardware.location.gps','requested android.permission.ACCESS_FINE_LOCATION permission'
uses-feature:'android.hardware.location.network'
uses-implied-feature:'android.hardware.location.network','requested android.permission.ACCESS_COARSE_LOCATION permission'
uses-feature:'android.hardware.bluetooth'
uses-implied-feature:'android.hardware.bluetooth','requested android.permission.BLUETOOTH or android.permission.BLUETOOTH_ADMIN permission and targetSdkVersion > 4'
uses-feature:'android.hardware.wifi'
uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission'
uses-feature:'android.hardware.telephony'
uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional'
uses-feature:'android.hardware.screen.portrait'
uses-implied-feature:'android.hardware.screen.portrait','one or more activities have specified a portrait orientation'
main
other-activities
other-receivers
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'zh'
densities: '120' '160' '240' '320' '480'

8. app使用的是android系统的控制,不再上html的元素,故定位方式不同
9. web-selenium运行原理:
(调用浏览器原生API)
PC端 -----> XXXDriver.exe -----> XXX浏览器
python
(http协议)

说明:python代码通过http协议启动driver.exe,且发送请求给它,之后它会调用浏览器原生API来实现让浏览器自动化测试的目地

10. app-appium运行原理:

(Android/ios系统自带自动化框架API)
PC端 -----> Appium -----> 模拟机/真机
python
(http协议)

说明:python代码通过http协议发送请求给appium,之后appium调用Android/ios系统自带的自动化框架API来实现让app自动化测试的目地;

11. 为什么不直接使用Android/ios自带的自动化框架?
1> 自带的android框架是用java写的,要会java;
2> 框架中有些功能未实现,或是不好处理,也是在更新完善中;
3> 现在都希望使用开源,跨平台,跨语言的软件,而appium就支持这些,但appium不是直接调用系统自带的自动化框架API,而是将adb命令发送到模拟器/真机的app程序当中,app程序接收命令后开始执行操作,之后返回结果,相当于一个监听的结果;

12. 移动端自带框架:
1> ios9.3及以上:苹果的XCUITest
2> ios9.3以下:苹果的UIAutomation
3> Android4.2+:谷歌的UiAutomator
4> Android2.3+:谷歌的Instrumentation

13. appium理念:appium旨在满足移动端自动化测试的需求,有四个原则:
1> 你没有必要为了自动化而重新编译你的应用app或者以任何方式修改它;
Android/ios系统自动框架
2> 你不应该被限制在特定的语言或框架上来编写运行测试;
WebDriver API
客户端-服务器协议(称为JSON Wire Protocol)
3> 移动端自动化框架在自动化接口方面不应该重造轮子;
WebDriver : web浏览器自动化的标准,即全部继承了web自动化selenium的webdriver所有方法
附加可用于移动端自动化的API方法,即增加了一些移动端特殊的方法
4> 移动端自动化框架应该开源,不但在名义上而且在精神和实践上都要实至名归
appium开源

14. 通过查看from appium import webdriver原码,会发现继承了selenium的WebDriver所有方法
15. web自动化和app自动化的异同?
1> python代码都是通过http协议发送请求,只是web是发送给浏览器的driver,而app是发送给appium sever;
2> web和app的自动化都是页面的操作,只是一个在浏览器中操作,一个是在Android/ios系统中;
3> appium的webdriver全部继承了web自动化selenium库的webdriver方法,只是appium还增加一些app自动化特性有方法,如OPEN_NOTIFICATIONS,INSTALL_APP,IS_APP_INSTALLED,LOCK,UNLOCK,TOUCH_ACTION等;
4> web自动化框架是python的第三方库unittest,pytest,而app自动化框架是python的第三方库appium库;
5> web自动化是通过webdriver调用浏览器原生API,而app自动化是通过appium发送adb命令给app,app再使用自带的自动化框架执行操作;
6> web和app自动化的脚本可以多语言,因为都是通过http协议发送请求;

16. appium是开源,跨平台的自动化测试工具,支持本地,移动端app,点面app测试;
平台支持IOS模拟器(simulators),安卓模拟器(emulators),真机(ios,android,mac,windows);
17. appium概念:
1> 客户端/服务器框架(C/S框架),appium的核心是一个web服务器,提供了一套rest api;
2> 它接受来自客户端的连接,监听命令,接着在移动设备上执行,将执行结果放在http响应中返还给客户端
3> 自动化始终围绕一个session进行,脚本发送一个post请求,包含一个json对象,即Desired Capabilities,此时服务器开启一个自动化的session,然后返回一个session ID,session ID将会被用户发送后续的命令;
4> Desired Capabilities是一些发送给apium服务器的键值对集合,告诉appium server要启动什么类型的手机什么类型的app的自动化会话;

18. 模拟器的使用:
1> Oracle VM VirtualBox虚拟机上导入不同版本的安卓模拟设备;
2> Genymotion模拟器是运行在Oracle VM VirtualBox虚拟机上的,启动模拟器;

19. appuim desktop(appium服务器)需要nodejs作为运行环境;ADT安装包里有aapt和adb可执行文件,执行相关的命令,因为appuim执行模拟器或真机时需要一些小工具命令;

21. app的控件怎么获取呢,即怎么获取app的页面元素?
答:UiAutomator View,在ADT()F:\adt-bundle-windows-x86_64-20140702\sdk\tools)的uiautomatorviewer.bat文件,双击打开工具Lazy Ui Automator Viewer;

22. Lazy Ui Automator Viewer本质就是一个截屏工具;

###appium会话+desired_caps
2018.11.1学习
1. 安卓常用的组件/控件:
1> TextView 文本框
2> EditView 编辑框
3> Button 按钮
4> RadioButton 单选按钮
5> CheckButton 复选框
6> ToggleButton 状态开关按钮
7> Switch 开关
8> SeekBar 拖动条
9> AnalogClock DigitalClock 时钟
10> Chronometer 计时器
11> ListView 列表视图
12> GridView 网格视图
13> ProgressBar 进度条
14> RatingBar 星际评分条
15> Toast 提示信息框
16> ScrollView 滚动视图

2. 组件的属性如下:
属性值 值类型 说明
1> index int 索引,同级组件的下标,从0开始计,代表第1个组件,第2个组件..
2> instance int 界面中同一类View的所有实例的下标,从0开始计
3> class String 组件的类名,同html中的标签同意,如android.widget.TextView
4> package String 包名,即应用包名
5> Content-desc String 内容描述,大部分时无值
6> Checkable boolean 是否可选,一般只对单选或复选框有用
7> checked boolean 是否单选或复选被选中
8> clickabel boolean 是否可点击
9> enabled boolean 是否可操作,如按钮置灰不可操作状态
10> focusable boolean 是否可获取焦点
11> focused boolean 是否获取到焦点
12> Scrollable boolean 是否可滚动,一般是list
13> Long-clickabe boolean 是否可长按
14> password boolean 是否隐藏明文
15> selected boolean 是否具有背景选择属性,如按钮点击后背景色变化
16> bounds Rect 坐标,如[366,892]|[708,1192]表示控件的矩形区域左上和右下坐标点
17> text String 文本内容
18> xpath String 元素的xpath定位表达式
18> resource-id String 资源ID,不一定唯一,如果xpath定位表达式使用的是resource-id,则说明resource-id是唯一,如//android.widget.TextView[@resource-id=\"com.lemon.lemonban:id/fragment_main_public_class_title\"],否则不是唯一,如//android.widget.TextView[@text=\"全程班\"]

3. appium server怎么知道要操作哪个手机,启动哪个app应用?
答:python代码中提供相关的信息:手机版本,app包名,注意一个aapium server只能对应一个模拟器/真机

4. Desired Capabilities的参数说明:用于启动session(会话)必须的
1> 作用:
a> 本次测试是启动浏览器还是启动移动设备?
b> 是启动android还是启动ios?
c> 启动android时,app的package是什么?
d> 启动android时,app的activity是什么?
2> 常用参数:见D:\柠檬班培训\VIP培训课程\1101_appium会话+desired_caps\appium_caps
键 描述 值
a> automationName 自动化测试的引擎 Appium(默认)或者Selendroid
**platformName** 使用的手机操作系统 iOS, Android, 或者 FirefoxOS
**platformVersion** 手机操作系统的版本 例如 6.0, 7.1
**deviceName** 使用的手机或模拟器类型 在Andorid上这个参数已被忽略,但仍需添加上
Android Emulator(安卓模拟器)
app 如果您指定了appPackage 和 appActivity 参数(见下文),Android 则不需要此参数了,因为说明你已经安装了这个app应用,否则设置的值如/abs/path/to/my.apk 或 http://myapp.com/app.ipa,代表会安装app应用;该参数也与 browserName 不兼容

browserName 做自动化时使用的浏览器名字。如果是一个应用则只需填写个空的字符串 'Safari' 对应 iOS,'Chrome', 'Chromium', 或 'Browser' 则对应 Android

**noReset** 在当前session下不会重置应用的状态。默认值为 false,代表会重置应用,即清除用户使用app产生的数据,相关于第一次从app市场下载该应用 true(常用),false
**appPackage** 运行的 Android 应用的包名
**appActivity** app应用的入口activity

5. Python客户端发送设备信息给到appium server,appium server让手机自带的自动化框架启动应用
```python
from appium import webdriver

#代码提供信息:什么平台,什么版本,什么app
#将操作的信息,发送给appium server,让它去打开app
#appium server将执行命令发送给手机自带的自动化框架,让它启动app或操作app

desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "6.0"
desired_caps["deviceName"] = "Android Emulator"
desired_caps["noReset"] = True
desired_caps["appPackage"] = "com.lemon.lemonban"
desired_caps["appActivity"] = "com.lemon.lemonban.activity.WelcomeActivity"

#1.代码写好,准备发送以上信息 2. 启动appium server 3. 启动模拟机,或连接真机,能够让adb识别到
#代码 === appium server === 模拟器/真机

#连接appium server,并发送给它设备信息
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

```
6. appium server监听手机自带的自动化框架执行命令的日志信息解说:
1> 发送了一个post /wd/hub/sessioin请求,且请求体包含了设备信息的json对象;
2> 新建一个会话,依据传递的设备信息,且会得到一个sessionid,如9ff6b587-60ce-4093-8afe-a51c04d57be0
3> 获取java版本,检查是否有安装adb,会获取adb的sdk路径;
4> 通过adb命令连接android device;
5> 开始查询android 6.0的设备;
5> 返回结果,查找到了android 6.0,device id为192.168.56.101:5555,device api level为23;
6> 运行adb命令查找对应app应用,推送设备的apk到手机上安装该app应用;
7> 返回结果为没有安装app;
8> 推送unlock帮忙设备解琐;
9> 启动UiAutomator,通过adb命令将PC端的AppiumBootstrap.jar推送到手机的data/local/tmp目录,通过Bootstrap来调来UiAutomator API,Bootstrap也会开启一个监听端口,接受appium server的命令,之后Bootstrap去调用UiAutomator API,然后将执行结果反馈给appium server;
10> android bootstrap socket连接成功,且屏幕已经解琐;
11> 开始启动app应用,之后w3c会返回启动成功 POST /wd/hub/session 200;
12> **注意:一段时间未操作app(1分钟),session会话将会关闭,且app也会退出**
13> 手机回到主页面;Pressing the HOME button

7. 歪歪老师的博客:
https://www.cnblogs.com/yyoba
8. 怎么通过代码启动appium server?
答:

###uiautomator+元素定位+元素操作之swipe
2018.11.4学习
1.UiAutomator框架的主要特点:
1> 元素定位:UiAutomator Viewer扫描,分析待测试应用的UI组件的图像工具 -- UiSelector;
2> 元素操作:Accessing device state 在目标设备和app上的各种操作 -- UiDevice;
3> 元素识别:UiAutomator APIs 在多个应用程充中捕获和操作UI组件 -- UiObject;

2. 元素定位 === 类UiSelect; 元素(webelemnt)操作 ==== 类UiObject; 设备操作 === 类UiDevice; 1> UiSelector类:通过组件的各种属性与节点关系定位组件;
2> UiObject类:安卓组件对象;

3. UiSelector:是一个元素定位表达式的类,它的绝大部分方法返回结果都是自身,java创建对象的方法:a = new UiSelector()
1> a.resourceId(String id) :通过resourced-id属性定位;
2> a.text(String text) : 通过text文本属性定位,如new UiSelector().text("全程班")
3> a.textContains(String text):包含文件体定位,如 new UiSelector().textContains("全程")
4> a.textMatches(String regex):通过正则匹配定位;
5> a.textStartsWith(String text):通过文本内容开头定位;
6> a.description(String desc):通过content-des属性值定位;
7> a.descriptionContains(String desc):
8> a.descriptionMatches(String regex) :
9> a.descriptionStartsWith(String desc):
10> a.className(String className);通过class属性定位;
11> a.classNameMatches(String regex):通过正则匹配class属性定位;
12> a.childSelector(UiSelector selector):通过子元素selector定位;
13> a.clickable(boolean val) :通过是否可点击属性定位;
14> a.enabled(boolean val):通过是否可操作属性定位;
15> a.focusable(boolean val):通过是否可聚集属性定位;
16> a.focused(boolean val):能过是否聚集属性定位;
17> a.index(int index):通过索引定位;
18> a.longClickable(boolean val):通过是否可长按定位;
19> a.packageName(String name):通过包名定位;
20> a.scrollable(boolean val):通过是否可滚动定位;
**若想通过组件的二个属性来定位该组件,应该是new UiSelector().resourceId(\"com.lemon.lemonban:id/fragment_main_public_class_title\").text("全程班"),因为方法返回的就是UiSelector自身,故只要连续点**

4. UiObject 是对元素操作的类:它的公共构建方法(初始化方法)为UiObject(UiSelector selector)
UO = new UiObject(new UiSelector().text("全程班"))实例化了一个webelement对象,之后调用它的各种方法:
a> UO.exists() 元素对象是否存在;
b> UO.click() 元素点击;
c> UO.clearTextField() 清除文本内容;
d> UO.clickAndWaitForNewWindow() 点击并且等待新的窗口;
e> UO.getContentDescription() 获取content-des属性内容;
f> UO.getClassName() 获取class属性;
g> UO.getPackagename() 获取应用包名;
h> UO.getText() 获取text属性;
i> UO.isCheckable() 获取checkable属性;
j> UO.longClick() 长按;
k> UO.pinchIn() 页面缩小;
l> UO.pinchOut() 页面放大;
m> UO.setText() 设备文件内容;
n> UO.swipeDown() 向下滑;
o> UO.swipUp() 向上滑;
p> UO.swipeLeft() 向左滑;
q> UO.swipeRight() 向右滑;

5. UiDevice 是对设备操作的类,提供了一系列方法和属性来模拟在手机上的实际操作:
1> 获取设备信息:屏幕分辨率,选择状态,亮灭屏等;
2> 操作:按键(home键,音量键),坐标操作,滑动,拖拽,截图等;
3> 常用方法:
a> click()
b> drag() 拖拽
c> findObject(UiSelector selector) 查找元素,返回自身UiDevice
d> freezeRotation() 固定屏幕,不让其旋转
e> getCurrentActivityName() 获取当前活动的页面名称
f> getCurrentPackageName() 获取当前活动的包名
g> isScreenOn() 屏幕是否亮着
h> openNotfication() 打开通知栏
i> pressBack() 回退按键
j> pressHome() 主键
k> pressMenu() 菜单键
l> pressSearch() 搜索键
m> sleep() 休眠
n> swipe() 滑屏
o> takeScreenshot() 截屏
p> unfreezeRotation() 不固定屏幕
q> wait() 等待
r> wakeUp() 换醒


6. Appium - app页面元素定位方式:
1> 通过id定位:resource-id
2> 通过ClassName定位:class
3> 通过AccessibilityId定位:content-desc
4> 通过AndroidUiAutomator定位(UiSelector,UiObject,UiDevice)
5> 通过xpath定位
**使用优先级从高到低**

7. app页面元素定位实例脚本
```python
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy

#代码提供信息:什么平台,什么版本,什么app
#将操作的信息,发送给appium server,让它去打开app
#appium server将执行命令发送给手机自带的自动化框架,让它启动app或操作app

desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "6.0"
desired_caps["deviceName"] = "Android Emulator"
desired_caps["noReset"] = True
desired_caps["appPackage"] = "com.lemon.lemonban"
desired_caps["appActivity"] = "com.lemon.lemonban.activity.WelcomeActivity"

#1.代码写好,准备发送以上信息 2. 启动appium server 3. 启动模拟机,或连接真机,能够让adb识别到
#代码 === appium server === 模拟器/真机

#连接appium server,并发送给它设备信息
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

#app元素定位,不用自己写,以柠檬班app为例
#等待元素可见
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,"com.lemon.lemonban:id/navigation_tiku")))

#2. classname元素定位,会获取到多个
eles = driver.find_elements_by_class_name("android.widget.TextView")
print(eles)
#1. id元素定位 == 题库
driver.find_element_by_id("com.lemon.lemonban:id/navigation_tiku").click()
#3. AccessibilityId(content-desc)元素定位
driver.find_element_by_accessibility_id("")
#4. UiAutomator定位 == 主页 -- 全程班 ,注意元素定位表达式只能用双引号,不能用单引号,java与python不同
driver.find_element_by_android_uiautomator('new UiSelector().className(\"android.widget.TextView\").textContains(\"全程班\").resourceId(\"com.lemon.lemonban:id/category_title\")')
#5. xpath定位 == 主页 -- 全程班
driver.find_element_by_xpath('//android.widget.TextView[@text=\"全程班\"]')

```

8. appium工具的深入用法
1> 高级设置:Advanced
a> Logfile Path:日志输出到指定目录,如E:\app_auto_test\appium_sever_log.log
b> Log Level:日志级别
c> Local Timezone/Log Timestamps:勾选这二个,让日志打印时间;
d> Allow Session Override:会话覆盖,重新创建会话,一般都勾选它
e> Bootstrap Port:Bootstrap端口号
f> Selendroid Port
将以上配置保存为base,会在Presets页面查看到
2> Appium server启动后,点击Start Inspector Session,即打开元素定位功能

9. Appium---Inspector功能:
1> 可以在该界面上直接操作手机;
2> 有select Element功能

10. uiautomatorviewer工具和appium-desktop自带的Inspector区别:
1> uiautomatorviewer只能支持android,如果是android平台,推荐使用uiautomatorviewer
2> Inspector可以同时支持android和IOS
11. 元素操作:点击,输入,滑动
1> 启动入口的Activity:driver.activity()
2> 安装应用:driver.install_app('path/to/my.apk')
3> 卸载应用:driver.remove_app('com.lemon.lemonban')
4> 关闭应用:driver.close_app()
5> 应用是否已安装:driver.is_app_installed('com.lemon.lemonban')
6> 拉取(pull)文件:从设备上拉取文件,driver.pull_file(path),path为设备上的文件路径
7> 推送(push)文件:推送文件到设备,driver.push_file(path),path为设备上的文件路径
8> 琐屏:driver.lock()
9> 解屏:driver.unlock()

12. appium -- 滑动屏幕
1> 滑动接口: swipe(起始X,起始Y,结束X,结束Y)
结束X-起始X:X轴滑动的距离
结束Y-起始Y:Y轴滑动的距离
Q:手机的屏幕尺寸有很多,如何兼容?
答:依据手机屏幕大小,通过设置屏幕横/纵轴的百分比来实现滑屏,如横轴X滑动屏幕的90%即可;
```python
import time
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy

#代码提供信息:什么平台,什么版本,什么app
#将操作的信息,发送给appium server,让它去打开app
#appium server将执行命令发送给手机自带的自动化框架,让它启动app或操作app

desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "6.0"
desired_caps["deviceName"] = "Android Emulator" #该参数无实际作用意义,但是仍需配置
desired_caps["noReset"] = True
desired_caps["app"] = r"D:\柠檬班培训\VIP培训课程\1027_简历辅导+项目流程讲解+app安装\appium+模拟器\Future-release-2018.apk"
desired_caps["appPackage"] = "com.xxzb.fenwoo" #前途贷app
desired_caps["appActivity"] = "com.xxzb.fenwoo.activity.addition.WelcomeActivity"

#1.代码写好,准备发送以上信息 2. 启动appium server 3. 启动模拟机,或连接真机,能够让adb识别到
#代码 === appium server === 模拟器/真机

#连接appium server,并发送给它设备信息
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

#driver.install_app(r'D:\柠檬班培训\VIP培训课程\1027_简历辅导+项目流程讲解+app安装\appium+模拟器\Future-release-2018.apk')
time.sleep(5)

#获取屏幕大小,通过设置屏幕横/纵轴的百分比来实现滑屏
size = driver.get_window_size()
#向左滑
driver.swipe(size["width"]*0.9,size["height"]*0.5,size["width"]*0.1,size["height"]*0.5)
time.sleep(1)
#向右滑
driver.swipe(size["width"]*0.1,size["height"]*0.5,size["width"]*0.9,size["height"]*0.5)
time.sleep(1)
#向上滑
driver.swipe(size["width"]*0.5,size["height"]*0.9,size["width"]*0.5,size["height"]*0.1)
time.sleep(1)
#向下滑
driver.swipe(size["width"]*0.5,size["height"]*0.1,size["width"]*0.5,size["height"]*0.9)

```
posted @ 2019-02-13 00:26  宁静~朝夕  阅读(2724)  评论(0编辑  收藏  举报