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-进阶扩展
标签:appium,安卓,元素,driver,自动化,手机 From: https://www.cnblogs.com/ywt798/p/17579723.html