zoukankan      html  css  js  c++  java
  • 简历及自动化相关

    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-20140702sdkuild-toolsandroid-4.4W下有一个appt.ext
    2> appt命令语法:**aapt dump badging apk应用包名**,如aapt dump badging D:BaiduNetdiskDownloadFuture-release.apk
    aapt dump badging D:worksoft_packshuawei.w3.W3App.apk
    执行结果如下:其中的name='com.xxzb.fenwoo'为应用包名;入口activity为:launchable-activity: name='com.xxzb.fenwoo.activity.addition.WelcomeActivity'

    F:adt-bundle-windows-x86_64-20140702sdkuild-toolsandroid-4.4W>aapt dump badging D:worksoft_packsFuture-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-20140702sdk ools)的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_capsappium_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_testappium_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)

    ```
  • 相关阅读:
    Tomcat设置编码格式utf8
    Tomcat控制台中文乱码解决办法
    LogBack.xml配置文件详解
    logback配置文件---logback.xml详解
    Spring Boot 2.0下配置Log4j2下的错误问题分析与解决
    logback介绍和配置详解
    logback在SpringBoot下出现no applicable action for [appender], current ElementPath is [[configuration][a
    springboot配置Log4j(将输出日志打印在控制台)
    lombok @Slf4j注解
    java之PropertyUtils
  • 原文地址:https://www.cnblogs.com/fcc-123/p/12763924.html
Copyright © 2011-2022 走看看