appium

1:使用appium自动化手机app时机型的选择

  建议使用机型:pix(谷歌原生的手机),三星,索尼,小米,魅族  这些手机系统定制化没有那么深,

           可以appium进行自动化,遇到的问题比较少,遇到问题尝试升级系统解决,那么不需要更换手机

  不建议使用机型:oppo,vivo,华为(部分华为,有些机型有问题)  

           这些机型系统深度定制,和安卓原生系统差距比较大,大概率会碰到问题

2:appium 

  开源,跨平台,多语言支持的移动应用自动化的工具,

  开源(主要依赖selenium提供的webdriver技术,跨平台-能测试ios和安卓)

  通俗来说就是手机自动化的工具 ,资源整合平台,利用手机自带的测试框架来完成自动化

  appium类似包功能(利用手机系统自带的测试框架来完成自动化测试),类似老板,安排员工进行测试

  selenium分支发展来的,

3:移动端应用来划分:测试app类型:

  1:原生app(安卓/ios) 原生app,这个应用的所有控件都是由平台自身的代码所构成的

  2:混合(Hybrid)app(H5):腾讯课堂,混合应用,大多是原生应用的壳里套了一个网页

    美团店铺商家内容展示的服务器上的数据,数据通过网页形式展现在手机上的,套的网页。和微信)

  3:移动web --app(手机网页)  app(就是一个应用)  网页网站也是一个应用

4:原生应用和混合应用的区别(比较直观的方法)

  1:原生app 有字长按无法选中,  混合应用:长按文字内容可以被选中

  2:原生app只是从开发架构和开发技术上考虑的

5:被测应用运行的平台,测试手机app,app在哪里运行,被测app运行的平台可以是ios或者安卓

  appnium不具备手机自动化的能力,靠手机操作系统自身测试框架,

  调用手机操作系统自身测试框架需要一个驱动如:安卓ui Automotor1,/ui Automotor2(基于1改造后的)(驱动)

  Automotor2安卓本身并不自带,想用这个驱动话需要安装,但不需要自己去网上下载安装,通过执行脚本自动安装

  桌面端的自动化,很大的内容,开发技术很多,appium自动化也只是其中一种技术。Windows(win10系统)

  WinAppDriver(能够自动化windows原生的控件) 现在前端工具很多用到js编码编写的,不可以windows自动化

  appium是js开发的,无法自动化WinAppDriver类型的控件,windows平台开发技术很复杂,元素定位很混乱,没有一个统一的技术

  ios(苹果系统):XCUITest(驱动) ios自动化需要appium server运行在mac系统上,代码稍微改一下也能在ios自动化--会ios自动化环境搭建就行

6:appium架构原理(怎么扮演包工头角色)

 

 

 test script              appium             Device Automation      Android Device

  test script+appium server+Device Automation是pc端运行架构,Android Device是手机app所在的平台

  现在学习的自动化针对另外一台设备的自动化,跨硬件,selenium web ui是在本设备上运行  (cs架构)

  appium整体上是一个cs架构(c:test script    s:appium )

  test script:编写的自动化脚本,客户端client,自动化脚本扮演的角色就是客户端,

        写代码的时候不能直接控制浏览器,需要通过中间媒介,代码所以只扮演客户端和遥控器的角色

        selenium 通过driver才能控制的,appium架构更复杂:

  1:test script:客户端脚本,点击哪些元素,输入哪些字符控件都是通过代码来完成,

          代码指令发送手机并且让手机执行,需要经历一系列步骤,
  2:appium server:服务端
  3:测试平台sdk:Device Manipulation
  4:手机端自动化驱动程序:Android Device

  pc端架构逻辑:

    1:代码发送给appium server,(通过http请求指令发给(Appium server))
    2:appium server需要解析一下指令(appium既能测试ios也能测试安卓,这里发送给安卓和ios指令不一样,

      操作的指令调用的序列不同,所以需要经过解析)
      我们写代码不关注你是ios还是安卓的,各种元素操作就行,直接写就行,都是一套api,
    3:appium server解析指令之后,调用测试平台的sdk(sdk:安卓开发需要安卓提供的sdk,

      sdk软件开发包,里面包含一些自动化测试工具。还有一些系统对外提供的api
      手机系统需要对外提供一些接口才能去操作它,不然操作不了,需要官方提供的标准的api库才能去调用,

      标准的api库和自动化测试工具统称为sdk,集合在一个sdk的工具包里面,安卓有安卓的sdk,ios有ios的sdk,
      通过安卓sdk工具去连接我们的设备,并且向我们的设备发送指令

  手机端架构逻辑:

    4:需要手机端的驱动,最重要一步,设备能不能支持自动化,主要看这个

      手机端驱动:

        ios 9.3和以上:   XCUITest驱动(ios闭源,自动化必须mac下运行)大部分机型,这是苹果自研的系统 

                自动化 XCUITest必须要安装到mac下面。无法通过windows自动化 XCUITest

        ios9.3和以下:    UIAutomation驱动    很少

        安卓 4.2+:    Google's

          UIAutomator/UIAutomator2驱动     UIAutomator2是appium研发的  (UIAutomator1是安卓自带的,原生的 )

        Windows:  Microsoft's WinAppDriver

    自动化手机 appium 本质上就是操作驱动进行自动化(需要连接驱动才能自动化)

7:安卓底层自动化架构:了解下安卓驱动怎么工作的

                uiAutomator controller(理解为命令转换器)

                测试命令脚本发送过来的指令需要经过它转化,

                然后才发送给手机

  webdiver script(测试脚本)<——>Appium server(类似服务器) <——>uiAutomator command server(手机上的工具,tcp server)

                uiAutomator command client(tcp client)   tcp server 接收到命令之后,调用底层的驱动,驱动去做个自动化

                它将appium解析好的命令通过 scokert指令

                发送给手机上面的工具

8:appium自动化环境安装,问题,原理环境 

  一:安卓手机建议6.0以上的真机

    低于6.0一些命令可能用不了,查看包路口信息等一些命令可能使用不了

  二:计算机(windows)

    win10(win7微软已经不维护了)
    内存8g
    硬盘可用内存:4g
    分辨率:1280*800以上

  三:安装第三方库

    pip install Appium-python-Client    appium这个工具支持很多语言,java c等,我们使用python,所以安装Appium-python-Client

      1.appium 像是一个服务,appium-python-client 是让 python 连接 appium 服务的一个驱动,

          也就是一个 python 语言封装和 appium api 通讯的一个库(python,java,js等)

      2.appium 又继承了 selenium 的 webdriver,因此 appium-python-client 安装可能需要更新 selenium。

    要确保安装匹配版本的selenium和appium ,appium依赖selenium,所以需要匹配selenium,

      安装的appium-python-client依赖的selenium需要对应版本

    pip install selenium -U          u:upgrade,selenium已安装就升级到最新版。appium和selenium版本匹配

  四:安装Appium 服务端,appium Desktop(windows版本)压缩包的桌面版本  

    测试脚本发送指令发送给服务端的,Appium服务端是可以通过命令行启动

    (需要另外一套安装方法,暂时不介绍,现在安装服务端是桌面版本的,桌面版本的服务端有个元素定位工具)
    桌面版本的安装简单,下载好直接安装就行,(桌面版本服务端,手动启动,元素定位工具)

    安装1.13版本的,装过高版本的再装了1.15版本需要管理员权限启动appium,默认端口号4723
    其他版本使用可能有问题(安装1.13版本)重新换成1.13版本的有个问题:

    如果之前装过高版本,再去启动appium server的时候需要右键管理员权限启动appium,
    appium server默认端口号4723,可以修改的,如果端口号冲突可以修改的

  五:安装安卓sdk

    包下载下来解压到某个文件夹,然后配置环境就行

    (sdk很多工具都是java编写的,所有需要安装java环境jdk)(adb命令在E:\androidsdk\platform-tools目录里面)

    环境变量搭建:选择系统环境变量

      1:系统环境变量新建一个ANDROID_HOME变量,变量值为E:\androidsdk

      2:然后在path路径追加platform-tools路径:E:\androidsdk\platform-tools

  六:安装jdk(1.8版本)

    java运行环境:java命令在jdk的bin文件目录,adb命令在sdk的platform-tools里面

    环境变量本质就是配置应用程序所在的目录,系统根据环境变量找这个执行命令,根据环境变量找可执行程序,

    需要配置环境变量:找到盘目录对应的路径

    下载jdk安装包,双击jdkxxx.exe的文件运行,

    然后配置环境变量:

      系统变量名:JAVA_HOME          C:\Program Files (x86)\Java\jdk1.8.0_172 :系统变量值

      PATH                  C:\Program Files (x86)\Java\jdk1.8.0_172\bin;C:\Program Files (x86)\Java\jre1.8.0_172\bin

      %java home %bin             环境变量相对变量配置,  这种相对环境变量也可以

  七:手机端环境配置

    针对另外的一个系统做自动化,如果win7系统需要安装电脑针对手机usb的驱动,

    否则可能无法识别(手机助手,或者对应品牌的官网下载安装),

    电脑上不要安装360哪些自带adb的工具,否则会和安卓sdk里面的adb冲突

    很多工具带adb客户端,为了连接手机,我们需要用自己的

    1:手机端打开usb相关的设置

      usb线连接手机和电脑
      进入手机设置-关于手机
      不断点击版本号(7)次以上,激活开发者模式 --点击定制化系统的版本号,
      退出到上级菜单,在开发者模式中,启动usb调试 让你选择手机模式,选择usb连接为MTP媒体传输模式
      手机端设置usb连接为MTP媒体传输模式
      确认授权电脑调试

    2:启动adb命令  adb devices -l

 

    3:确保电脑端没有安装其他adb程序软件,如:杀毒软件,安全管家手机助手等

      可能造成adb冲突,禁止自动化脚本运行(确保环境整洁没问题)

    4:确保手机端开发者选项中相应的adb权限全部打开 ,有的手机打卡usb权限还不够,

      除了打开usb调试,还需要关闭监控adb安装命令

      有的除了usb调试,还要打开usb安装,还需要打开usb调试安全----开发端口

    5:确保手机端appium相关的app对应权限全部打开    

      appium相关的app只要第一次执行脚本才会正确去安装

      设置----应用管理---权限设置----对应的app,查看权限

  八:首次运行脚本手机自动新增两个app

    appium -settings    应用会自动安装并启用     服务形式去启动

    UiAutomator2       appium优化后的安卓底层自动化驱动,

    这两个app确保可以自动安装,并开启全部权限

    我们有些手机不支持UiAutomator2,那么使用UiAutomator1,需要加相关的操作,2的性能更好

    UiAutomator2这个应用没有图标,设置里面--所有应用里可以搜索

  九:代码验证环境,代码能够自动化启动被测应用就代表环境安装成功

9:查看被测app包名和入口信息:重点

  手机打开被测app然后电脑端cmd输入:adb shell dumpsys activity recents | findstr intent={  

  如果连接多台手机,-s去指定设备名称查询  

  adb -s 设备id(唯一标识) shell dumpsys activity recents | findstr intent={

  然后查看cmd里面打印的第一条结果,

  cmp=后面得内容全部复制,后面内容就是   :包名/入口信息,一一对应去填写

  如:cmp=com.miui.home/.launcher.Launcher}就是包名和入口信息

  intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800000 cmp=com.miui.home/.launcher.Launcher}

  app没有安装怎么通过app包获取包名和入口信息:

    使用sdk提供的工具:在E:\androidsdk\build-tools\29.0.3\aapt.exe 

    cmd切换到E:\androidsdk\build-tools\29.0.3\aapt.exe程序所在的目录下面,

    因为这个目录没有添加环境变量,不能在任意目录使用命令

    命令:aapt dump badging+adk路径    查看pachage的(包名+路口信息)    adk包可以直接拖到命令行

      launchable -activity:name=....(入口信息)

      包名:在开头package name =

      入口信息:在下面点:launchable -activity:name=....(入口信息)  载入的时候需要启动的activity,就是入口信息

10:简单自动化boss直聘代码

from appium import webdriver        #1:导包

# 准备自动化配置信息,Appiam可以测试安卓和ios,可以测试手机上的某个应用,
# 那么要告诉appium到底要测试哪些,这些信息通过字典配置项传递进去的   如下
desired_caps = {
    #1:被测平台信息三项:platformName,plathformVersion,deviceName
    'platformName': 'Android',      # 移动设备平台--被测平台信息,ios还是安卓,
    'plathformVersion': '10',        # 平台OS版本号,写整数位即可   安卓版本号,
    'deviceName': 'test0106',       # 设备的名称--值可以随便写,但是配置项必须得有

    #2:被测app信息两项:appPackag,appActivity
    'appPackage': 'com.hpbr.bosszhipin',                # 包名
    'appActivity': '.module.launcher.WelcomeActivity',  # 入口信息

    #3:其他项
    'noReset': True,        # 自动化时候自行注册和登录boss直聘,跑完自动化脚本后,如果不写这个配置项,会把登录信息用户信息清空
                            # 相当于重新安装了应用一样,为了避免重置app清空app信息+这个配置项

    'newCommandTimeout': 6000,  #设置session的超时时间,单位秒,默认60s
                                # 元素调试的时候很有用,代码和appium server连接时候需要创建一个session,
                                # 待会元素定位时候也是依据这个原理,这中间会有很长一段时间代码不向appiumserver发送指令
                                # 造成超时断开,默认时间60s,把设置时间拉长600s或者6000s

    # 'automationName': 'UiAutomator2',   # 设置底层测试驱动为UiAutomator2,1.15默认使用的底层驱动就是UiAutomator2
                                         # 手机不支持ui2就用ui1或者UiAutomator1
    'automationName': 'UiAutomator1',  
    'unicodeKeyboard': True,
    'resetKeyboard': True

    # 'skipServerInstallation':True       #跳过UI2的安装配置项,如果第一次运行程序,不要添加该配置
}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #2:创建webdriver对象 - --appium使用Remote返回一个driver对象

    # 参数1:'http://127.0.0.1:4723/wd/hub'
        # appium服务器的ip和端口地址,客户端脚本需要向服务端发送命令,http协议发送
    # 参数2:desired_caps:要告诉appium要自动化的信息,什么手机,什么app,什么配置


driver.implicitly_wait(10)          #隐式等待

driver.find_elements_by_id('com.hpbr.bosszhipin:id/img_icon')[1].click()  #点击放大镜搜索按钮先取所有符合条件的元素


search_input = driver.find_element_by_id('com.hpbr.bosszhipin:id/et_search')
search_input.send_keys('软件测试')
#搜索框输入职位信息,输入关键字,有的界面输入框点击一下成为可输入的时候,
# 可能元素属性发送了变化,所有每次输入需要点击观察一下--没变可以直接操作元素(这种情况注意一下)

driver.find_element_by_id('com.hpbr.bosszhipin:id/tv_filtered_name').click()
#输入回车或者选择第一个结果,webui可以 \n来模拟回车,
# appium里面不行, \n在安卓系统不会被解析为回车,submit提交也没这个功能


job_msg = driver.find_elements_by_id('com.hpbr.bosszhipin:id/view_job_card')
# 获取当前页面所有职位信息元素    找大的元素--返回列表

for job in job_msg:             #遍历大列表循环输出:
    name = job.find_element_by_id('com.hpbr.bosszhipin:id/tv_position_name')     # 输出岗位名称

    salray = job.find_element_by_id('com.hpbr.bosszhipin:id/tv_salary_statue')   # 输出薪资

    company = job.find_element_by_id('com.hpbr.bosszhipin:id/tv_company_name')   # 输出公司名称

    print('%s|%s|%s' % (name.text, salray.text, company.text))

driver.quit()       #退出app
# 结束自动化session--结束session之后不能通过当前session来进行定位,需要重新启动session

11:appium自带元素定位工具inspector

  ui自动化就是选择元素操作元素,web ui自动化定位元素,chrome浏览器自带工具可以定位

  手机没有这样得工具,借用外部工具查看元素,debug元素,首推:appium自带的定位工具

  appium自带元素定位工具打开方式:

    进入方式与打开方式

      1:创建新的session(执行结束后,driver.quit断开了session,session连接已经断开了就没法attach了--)

      2:attach已有的session

        新建已有的session,配置信息一个个原封不动都copy复制进去

        Automatic Server——>Desired Capabilities  然后配置信息一个个复制进去。然后——>

        点击save as 保存——>Saved Capability Sets 点击查看保存的配置——>选中一个保存的信息点击start session就可以进去了

  appium自带元素定位工具功能:

    1:最左边是当前同步的画面
    2:三种模式,默认选择元素模式,需要点击一下激活,
    3:最右测有选择元素的信息,这个信息有class,elementid,等信息--
      元素定位的时候就是根据这些属性信息定位的,除了元素自身的属性,

      还可以通过元素的层级关系进行定位-xml结构的
    4:中间的放大镜--验证表达式是不是可以唯一定位

12:appium选择元素的方法和web不同,选元素主要根据以下三种方法,resource-id,content-desc属性,xpath

  1:resource-id:app中id不一定唯一定位,手机自动化和web自动化的区别,id其实是控件的属性

          id可以省略包名和/。也能定位到,初学者建议不省略

          driver.find_element_by_id    单数模式,返回符合条件的第一个

  2:content-desc:content-desc属性(可以唯一定位)

          driver.find_element_by_accessibility_id

  3:xpath:最常用的app定位元素方式(css是web专用,app底层驱动并不识别css)css开发渲染对应的样式(css前端开发基础)

    xml,路径定位语言,html父级是xml,xpath用来定位xml表示的元素和节点,手机里面元素结构树就是xml结构,

          driver.find_element_by_xpath

13:app中的xpath表达式解析

  //*[@class="s-top-wrap s-isindex-wrap"]   

  xpath表达式,浏览器自身具备解析xpath表达式的能力,解析xpath需要相当大的计算量

  手机功能不具备解析xpath的能力,解析xpath没有在手机上执行

  手机放弃解析css和xpath能力,除了手机浏览器有解析css和xpath的能力,

  我们的app和自动化测试工具都不具备解析xpath能力

  解析xpath放在appium server这块的,appium server解析xpath这个表达式定位元素的方法,

  然后转化成底层对测试驱动识别出的元素定位信号,然后交给它来执行,底层驱动定位元素用的什么方法

  它和平台自身用的测试框架有关系  安卓为例:安卓用的UiAutomator,用UiAutomator api进行定位

14:xpath语法

  //元素类型(class属性)[@属性="属性值"]  根据属性来定位元素的,属性能够唯一定位元素,

  //*[@text='科学']             假设属性唯一定位元素,元素类型可以*来代替      * 匹配所有元素类型    

  class选择  //class =//类型  这个属性类型在appium里面就是class属性的值(appium中class的值当成元素类型)       

      //android.widget.TextView   ==  //*[@class="android.widget.TextView"]                     

       //android.widget.TextView      这里class当作标签了 

     //*[@class="android.widget.TextView"]    这里class当作属性

     在app里面class既是属性也是标签      这两种写法效果一样的

  xpath里面的层级关系  

    父元素/子元素

    祖先元素//后代元素

    第几个子元素,[x] 下标

    兄弟关系

  xpath属性定位

    通过id选择      ://*[@resource-id='com.zhihu.android:id/container_parent']
    通过class选择      ://android.widget.TextView
    通过其他属性选择     ://*[属性='属性值']
    选择子元素      ://*[属性='属性值']/*
    选择父元素      ://*[属性='属性值']/..

15:三种元素定位工具

  一:元素定位工具一:appium server自带的inspector

    appium 元素定位工具:本质是调用appium的api去操控这个元素,然后调用appium的截图方法查看手机页面内容

               从手机当前页面去截图然后和当前元素结构树做个匹配,才能使用元素定位工具

  二:元素定位工具二:WEditor

    WEditor:python结合appium底层框架研发的

    WEditor的使用步骤:

      1:安装:pip install weditor    python开发的,python安装weditor就行

      2:启动:python -m  weditor      一个python模块,这个动作就是:先把元素定位工具客户端给启动起来

      3:运行浏览器默认谷歌,

        python -m  weditor ,只是本地打开服务器,并且浏览器能够访问,手机和电脑需要能够连接

        WEditor工具原理:点击connect需要在手机上装个ATX

                (ATX安装好了之后他会和和电脑端进行通信,数据交互,所有才能定位当前的界面)   ATX:小汽车,

    1:WEditor工作特性:

      1:这个工具支持实时模式,需要手动点击激活,

        服务器不停向手机ATX发送请求,不停传画面,对性能有损耗,一般关掉,
      2:相对appium这个工具定位更精准,有时候手机界面不是纯原生的,

        定位元素要把界面html元素结构转化成原生的结构,有的工具有差距,转化能力没那么强
      3:这个工具可以直接提供xpath,和手写的类似,可以直接复制使用   只适用安卓
        但是不适合写脚本全部复制这些xpath来使用,获取多个元素的表达式的时候就不合适了
      4:还有个锁定坐标的功能,点击元素之后坐标可以锁定

        (坐标锁定之后是一个position百分比的坐标) x,y显示大的是像素坐标
      5:右侧可以写代码确认元素定位方法是否可以,这个api不是appium的,

        是ui2的--另外一套的方法,这个库只支持安卓

    2:注意事项:

      1:ATX安装到你手机上--安装代理程序
      2:运行代码时候需要结束UIAUTOMATOR,这个工具和appium有冲突的,
      3:原理和appium一样,手机上安装一个代理程序ATX通过代理和本地进行通信,

        完成元素定位,截屏等(代理通信,传输数据),手机界面的屏幕数据传给服务端,
        服务端截获数据展现在浏览器上面

    3:WEditor 验证元素是不是存在和唯一存在得方法,在工具里面输入命令:如下,写python代码

      # coding: utf-8
      #
      import uiautomator2 as u2
      d = u2.connect()
      脚本输入的内容:
      ele=d.xpath('//*[@resource-id="com.hpbr.bosszhipin:id/tv_required_location"]')
      print(ele.text)

  三:元素定位工具三:安卓sdk/tools/bin/uiautomatorviewer工具

    uiautomatorviewer:E:\androidsdk\tools\bin\uiautomatorviewer里面,

    这个工具和appium有冲突,很脆弱,不需要占用任何端口,安卓原生的

    这个工具只能查看元素的特征,功能单一,截图更清楚,定位速度更快

    这个工具能将当前界面的截屏和元素信息保存下来

      左上角第四个图标save——>保存在桌面(然后桌面有两个文件:一张图+xml文件)

      弄出来有个问题。xml文件元素节点标签名都是node

      使用xpath表达式使用node作元素类型,写不写都一样---这时候采用class属性作为元素特征

  四:元素定位方法

    1:查看元素结构树
    2:appium自带得元素定位工具
    3:代码来测试,自己跑(find-elements),然后打印元素列表的长度
    4:WEditor 输入python代码自己验证

  五:实在上面三种元素定位工具都不得行,只能使用黑科技方法了

    需要根据xml结构树定位元素,元素属性去对比,去文本里查找

    

16:ui1和ui2

  ui1驱动是原生的,可能兼容性问题小一点。

  UiAutomator2   是appium优化后的安卓底层自动化驱动,性能更强

17:appium环境问题深入了解

  driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps) ,

     这行代码负责启动被测应用,这行代码负责检测很多事情,检测各种环境,

    电脑端的,jdk,安卓sdk,没有匹配好都能检测出来,

    手机端安卓的ui1和ui2和appium settings环境没有安装或者不能启动都能检测出来

  webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)这一行代码发生了什么?

    1:客户端代码与appium server建立连接,并传递caps配置信息

      运行代码之前先要启动appium server,启动服务脚本才能向它发送请求

    2:Appiumserver接收到caps配置信息,检查配置信息是否符合要求   

      必要的配置项是不是都有,是不是格式错误

    3:利用adb工具检查当前连接的移动设备,通过之后先看一下利用adb工具检查

      appium根据你环境变量的安卓sdk路径自己去找adb,和cmd命令输入不同

      配置项写了版本号不对,根据你设定的版本编号无法找到设备,

      安卓10版本你写个8也会错误提示的,有时候也能找得到,会忽略版本信息

    4:第一次运行脚本的时候安装appium-settings与uiautomator2到被测手机 

      默认使用ui2,大部分安卓机都支持ui2,性能更好,问题少

    5:手机启动appium-settings作为监听服务,用于手机和appium-server进行通信

      手机无法启动appium-settings也会提示错误,提示appium settings无法打开

      这时候试试手动点击能不能打开,不能打开的话查看appium-settings和ui2的相关权限是否都打开

    6:uiautomator2启动被测app,手机操作系统打开被测试应用,也要相关权限, uiautomator2可以定位h5界面的元素)小程序自动化

18:adb连接方式

  1:usb有线连接   (adb devices -  查看) adb devices -l

  2:无线连接:主要利用adb无线连接功能 

    1:先要usb有线连接到电脑上 --首先需要激活无线连接
    2:激活手机Adb的无线服务,输入命令行:adb tcpip 5555(5555是手机默认的端口)
    3:计算机以无线方式连接到手机:输入命令:adb connect <device ip>) ---当前手机的ip
      手机上查看当前手机的ip,atx和各种方式都可以查看当前手机ip
      如果是四个5激活的:adb connect <device ip>) 没有问题
      入是其他端口激活的:adb connect <device ip>):8888 连接时候需要带上端口号

    使用无线连接的意义:

      可能usb端口有限,或者要拿着手机到处走,有限不方便,使用无线需要确保手机和电脑处于同一局域网,连接同一个wifi

    无线连接的优势:

      1:减少USB连接干扰
      2:提高连接稳定性
      3:脱离有线的束缚,(确保在同一局域网(连接同一个wifi))

    无线连接的问题:无线连接采用的是adb连接,adb连接和手机上appium settigs不占用同一个端口,一般不会有冲突和干扰

      1:不能激活
      2:拔线后无线连接断开了,这种情况是系统自己内部逻辑--安全机制比较好,

        发现没有连usb先就会断开所有的adb服务,避免安全问题,不能解决使用有线连接
        无线连接问题(1:无线连接不能激活 2:无线连接拔线就断开了)华为,360等,

        发现断开usb就断开所有adb连接服务

19:appium自动化原理

  appium自动化主要靠手机底层驱动,自动化程序能在手机上面去运行,ui1或者ui2,

  使用ui1输入中文需要加两个配置项,配置一下输入法,配置输入法可能手机安全等级比较高,禁止配置输入法--就gg了

20:一些常用的adb命令

  adb kill -server        关闭adbservre

  adb devices        启动adb server,检测

  adb --help          查看命令

21:手机界面的一些操作

  appium能不能做游戏自动化

  有些app控件不是应用的安卓原生的应用开发的,可能利用unit  3d'等技术开发的,

  它的控件对于uiautomator而言是不可检测的,无法正常寻找元素和定位元素进行Zion规划

  有时候应用出现这种情况,某个应用的某个界面上面的某个控件就是点击不了,

  不是应用的安卓原生的应用开发的),这时候考虑使用其他方法,坐标操作(临时解决方法,某个元素定位不到的时候)

22:appium自动化一些常用的操作函数

  一:坐标操作,模拟坐标点击:driver.tap(x,y)

    当某个元素定位不到的时候,可以采用坐标操作,可以模拟长按效果,默认点击

    优点:可以暂时解决解决定位不到元素的问题,不能全部代码用坐标来写,坐标都是飘忽不定的,失败概率高

    缺点:不能适用不同分辨率的屏幕

    driver.tap([(870,y)],3000)  :传参列表嵌套元组:[(),(),(),(),()],每个元素代表一个坐标。列表里面最多传5个坐标,最多五根手指

                  对于我们这个普通的安卓应用而言,开发最多只实现三根手指的交互效果,通常写三个坐标差不多了,

                  写四个五个没其他特殊效果,最常见的就是一个数据

                  坐标点击,这种点击不会寻找元素,这种运行速度更快,这样操作点击可能经常需要等待

    driver.tap([(870,90)])       点击坐标

    driver.tap([(870,90)],3000)   长按坐标3000ms,写时间参数就是长按的效果,长按时间就是你写的时间,

                  时间单位是ms,毫秒  3000ms=3s(长按的位置不要有图标,否则效果不同)

  二:相对位置模拟坐标点击

    可以坐标相对屏幕位置计算(减小误差)相对位置(宽高比例位置)

    使用2分法案来计算相对位置:高度一半位置肉眼分辨出来(获取1/2位置),

                  1/2再取1/2,变成1/4,一直这样2分法制下去就能落到点击区域

                 (或者获取坐标值相除也行)比较快速的方法

  三:获取屏幕尺寸:  driver.get_window_size   

    size=driver.get_window_size()     获取屏幕尺寸,返回一个字典,宽和高是值

    width=size['width']             宽

    height=size['height']          高

    y=height/16               取相对坐标,点击的点在界面宽占1/16

  四:滑动操作:    driver.swipe(x1,y1,x2,y2,1500)

    driver.swipe(x1,y1,x2,y2)    (api) x1 y1起点 x2 y2 终点  ----起点和终点的坐标

      明确起点和终点(向上或者向下滑动)手指落下的点起点,滑动完手指松开的点是终点
      使用场景:目标元素不在当前屏幕范围,需要滑动屏幕
      解决方法:模拟滑动

    左右滑动,上下滑动    考虑起点和终点--方向错了逻辑不同

    起点在下面终点在上面---从下往上滑,下面的内容显示

    driver.swipe(500,1300,500,300)    横坐标不变,纵坐标向上滑动了1000个像素的距离

    driver.swipe(500,1300,500,1300-1000)  也可以起点的y桌标-滑动的距离这样写

    滑动的时候没有坐标让我们去等待去寻找的,如果进入应用就开始滑动,有页面跳转的话需要sleep硬编码sleep等待一下

    滑动具有惯性:

      从起点滑动到终点需要时间,时间没有设置,和设备底层有关系的,保险需要设置一下,

      因为如果滑动距离很长,滑动时间很短,会造成惯性效果,不可控,一下滑很多

      自动化的时候可以设置时间让这个滑动变得可控,设置时间1500ms,每次设置1.5s时间,保证滑动稳定

  五:获取元素的尺寸

    block.size      返回一个  宽高的字典

  六:模拟按键操作  :driver.press_keycode(Keycode)  

    使用场景:模拟手机硬件信息,如电源,音量,明暗,键盘等

    driver.press_keycode(Keycode)      和driver.keyevent()效果是一样的

    安卓 keycode查看网址:https://www.cnblogs.com/xiaowenshu/p/10012794.html

    

    

 

相关文章

前言:appium可以说是app最火的一个自动化框架,它的主要优势...
(原文:https://www.cnblogs.com/fancy0158/p/10047906.htm...
一Appium介绍1.1含义开源,跨平台,多语言支持的移动应用自动...
前言:Appium是一个自动化测试开源工具,支持iOS平台和Andro...
转:https://blog.csdn.net/Tigerdong1/article/details/801...
(原文:https://www.cnblogs.com/fancy0158/p/10056418.htm...