手机端自动化

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或者安卓

1:appnium不具备手机自动化的能力,靠手机 操作系统 自身测试框架,调用 手机 操作系统 自身 测试框架 需要一个驱动
  如:安卓ui Automotor1,/ui Automotor2(基于1改造后的)(驱动) 2:Automotor2 安卓本身并不自带,想用这个驱动话需要安装,但不需要自己去网上下载安装,通过 执行脚本自动安装 3:桌面端的自动化,很大的内容,开发技术很多,appium自动化也只是其中一种技术。Windows(win10系统) 4:WinAppDriver(能够自动化windows原生的控件) 现在前端工具很多用到js编码编写的,不可以windows自动化 5:appium是js开发的,无法自动化WinAppDriver类型的控件,windows平台开发技术很复杂,元素定位很混乱,没有一个统一的技术 6: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)or Mac
  win10(win7微软已经不维护了)
  内存8g
  硬盘可用内存:4g
  分辨率:1280*800以上
三:Windows机器安装第三方库: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 服务端是可以通过命令行 启动(需要另外一套安装方法,暂时不介绍,现在安装 服务端 是 桌面版本的,桌面版本的服务端有个 元素 定位工具)   桌面版本的 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运行环境: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调试 】     usb线连接手机和电脑     进入手机设置-关于手机     不断点击版本号(7)次以上,激活开发者模式 -- 点击定制化系统的版本号,     退出到上级菜单,在开发者模式中,启动usb调试 让你选择手机模式,选择 usb 连接为 MTP媒体传输模式     手机端设置 usb 连接为 MTP 媒体传输模式     确认授权电脑调试   2:启动adb命令 adb devices -l   3:确保电脑端没有安装其他adb程序软件
    如:杀毒软件,安全管家手机助手等,可能造成adb冲突,禁止自动化脚本运行(确保环境整洁没问题)   4:确保手机端开发者选项中相应的adb权限全部打开
    有的手机打卡 usb权限 还不够,,
    1:除了打开 usb调试
    2:还需要关闭 监控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={    【获取 被测 app相关信息】
  查看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 自带的定位工具 inspector   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通过代理和本地进行通信,
    完成元素定位,截屏等(代理通信,传输数据),手机界面的屏幕数据传给服务端,服务端截获数据展现在浏览器上面
  4: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结构树定位元素,元素属性去对比,去文本里查找
  利用driver.page_source  获取页面的xml信息,也就是页面的元素结构树,然后自己做元素定位
  (有些界面受保护的,界面进去是黑的,定位不了,比如boss直聘密码修改界面)

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                                查看命令
adb install D:\全部环境\Chrome\gugeliulanqix64.rar        adb命令,安装包的命令,包拖动到cmd输入命令里面然后回车就行

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
七:模拟打开通知栏  :driver.open_notifications()      不需要填写任何参数
  滑动可以用来打开通知栏:屏幕往下滑动,通知栏除了可以滑动打开,还可以模拟打开通知栏
使用场景:   需要查看通知,被测应用会发通知,打开通知栏后定位通知栏信息进行对比是否和预期相符合   操作完之后,接下来需要关闭通知栏
八:关闭通知栏:三种方法    driver.keyevent() 
  1:可以向上滑动
  2:打开手机左下角的返回虚拟按键进行点击
    (需要调出虚拟按钮--安卓系统接收三个键的信号的,虽然现在都是全面屏习惯上滑,)
  3:模拟发送返回按键 driver.keyevent(4)
九:driver.keyevent()
  这个函数可以模拟发送任何按键,如abcdecf和特殊字符,(银行金融类的密码键盘不能输入,只能点击键盘)
  虚拟键盘的字符有个文档的:安卓keycode查看网址:https://www.cnblogs.com/xiaowenshu/p/10012794.html
  driver.keyevent(4)          这个表示发送返回键 (左下角的返回按键)
  driver.keyevent(66)          回车键(enter) 模拟直接输入enter
  代码不能快于页面的反应速度,很容易造成页面和操作不同步,很多地方现需要强等:
  比如send_keys()后模拟回车driver.keyevent(66) 中间建议加等待时间  
txt文本也能作为元素定位。xpath元素特性描述一些
十:手机界面操作:滑动屏幕操作
  appium webdriver 的swipe方法(坐标和duration)
  直接查看,预计操作坐标
  先获取元素坐标,再分析操作坐标(再健壮)
  location=ele.location 左上角坐标,(dict:有 x,y)
  sizel=ele.size 宽高(dict:有width,height)

操作不可见元素:
  先滑动到其可见
  再操作该元素
获取全屏幕尺寸:   screesize =driver.windiw_size()   screenW=screenSize('width')   screenW=screenSize('height')
十一:获取页面的html信息
  driver.page_source

23:class="android.widget.EditText"

EditText:手机元素类型一定要是 .EditText类型的才是输入框,其他的类型是输入不了的,无法send_keys 
EditText 可编辑的元素,只有这种类型才是输入框,其他类型的输入不了,操作一个按钮sendkeys是操作不了的,只有输入框才能sendkeys

24:appium-进阶扩展 

posted @ 2023-07-25 13:57  至高无上10086  阅读(200)  评论(0编辑  收藏  举报