• 简历及自动化相关


    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)

    ```
  • 相关阅读:
    some tips
    ORA00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
    Chapter 01Overview of Oracle 9i Database Perfomrmance Tuning
    Chapter 02Diagnostic and Tuning Tools
    变量与常用符号
    Chapter 18Tuning the Operating System
    标准输入输出
    Trace files
    DBADeveloped Tools
    Chapter 03Database Configuration and IO Issues
  • 原文地址:https://www.cnblogs.com/fcc-123/p/12763924.html
Copyright © 2020-2023  润新知