概念:由程序代替人工进行系统校验的过程
1.1自动化测试能解决的问题? 回归测试 (冒烟测试) 针对之前老的功能进行测试 通过自动化的代码来实现SEO靠我。针对上一个版本的问题的回归 兼容性测试 web实例化不同的浏览器驱动相当于对不同的浏览器进行操作,从而解决浏览器的兼容性测试问题性能测试 通过一些工具来模拟多个用户实现并发操作提高工作效率,保障产品SEO靠我质量 1.2自动化测试的优点 自动化测试能在较少的时间内执行更多的测试用例自动化测试能够减少人为的错误自动化测试能够克服手工的局限性自动化测试可以重复执行( 注册用户 SEO靠我--已注册) 1.3自动化则试的误区自动化测试可以完全代替手工测试 针针某些功能(图片、页面架构)也是没有办法通过自动化来实现
自动化测试一定比手工测试厉害 金融行业更看重业务的积累
自动SEO靠我化测试可以发现更多的BUG 是因为自动化测试主要用来做回归测试
自动化测试适用于所有的功能 页面的架构、图片、文字,用户体验
1.4自动化测试分类 web自动化测试(本阶段学习内容) weSEO靠我b系统移动app自动化(本阶段学习内容) app应用接口自动化 接口:用来给web或者app前端传输数据用的单元测试-自动化测试 针对开发人员的代码进行测试。 是由开发自己来做的安全测试(渗透测试) SEO靠我针对系统、数据、应用等安全方面进行测试桌面应用自动化测试 针对windows的桌面应用程序进行自动化测试嵌入式设备自动化测试 针对嵌入式设备的应用程序进行自动化测试概念:UI(SEO靠我user interface)通过对web应用以及app应用进行自动化测试的过程。
2.1 什么项目适合做ui自动化测试? 需求变动不频繁 前端代码变更维护不方便项目周期长 项目短,上线SEO靠我之后不需要再去测试项目需要回归测试 不用回归测试的也不需要写自动化 2.2 UI自动化测试在什么阶段开始? 手工测试完成之后才做自动化测试,相当于是编写自动化测试代码(SEO靠我通过手工测试能够清楚的知道自动化测试的步骤以及结果) 2.3 UI自动化测试所属分类 黑盒测试(功能测试) UI自动化测试 模拟人工对web以及app页面进行操作的过程SEO靠我白盒测试(单元测试)灰盒测试(接口测试)1、V1 通过手工测试完成之后,有十个功能。
2、 针对V1版本的十个功能,进行自动化的代码编写
3、V2 增加了十个功能(总共有20个功能), v2版本的测试过程SEO靠我当,新增的10个功能手工测试。针对老的10个功能就可以通过自动化来进行回归测试。
selenium中文名是硒,就是用来做web自动化测试的
开源软件: 源代码开放,但是不一定免费
跨平台: 平台指操作系SEO靠我统。 linux、windows、 mac操作系统
支持多种浏览器:firefox、chrome、 ie、edge、opera、safari
支持多语言:python\java\C#\js\Ruby\PHSEO靠我P
成熟稳定功能强大:被大公司使用。google、华为、百度、腾讯
后续大家在选择自动化工具的时,这几个特点就是选择工具的依据。
1.3selenium发展史selenium 1.0
selenium IDESEO靠我
是firefox的一款插件,通过它可以记录用户的操作并生成对应的自动化脚本。selenium grid 通过grid可以将脚本下发到不同的电脑在不同的浏览器上面执行。
selenium RC
由JS封装的SEO靠我一个工具,用来对浏览器进行操作的。
selenium 2.0
selenium 1.0 + webdriver针对浏览器的操作都是通过webdriver来实现的。支持的语言更多selenium 3.0
删除SEO靠我了selenium RC全面支持java8支持macOS,支持safari浏览器支持微软最新的EDGE浏览器,支持更多的浏览器需要注意浏览器与浏览器驱动的版本, 不同的浏览器有不同的浏览器驱动SEO靠我,而且不同的版本也有不同的浏览器驱动
2.3selenium工具包安装在线安装方式: 在dos命令行中输入: pip install selenium
离线安装方式:
需要获取selenium离线安装包并解SEO靠我压在DOS命令行进入到解压的目录,然后执行python setup.py installpycharm进行安装
在file菜单中选择setting, 然后选择"project- interpreter"SEO靠我
如何确认selenium安装完成:可以通过pip show selenium进行查看
2.4 浏览器驱动安装安装浏览器驱动之前,一定要知道自己浏览器的版本。
通过https://npm.taobao.orSEO靠我g/mirrors/chromedriver/ 获取对应的浏览器驱动
解压浏览器驱动文件,并将驱动文件复制到python的根目录就行了。
查看python安装根目录:通过where python命令
2.4SEO靠我 入门示例项目创建
项目名称不要 与第三方的模块名同名
文件名称也不要与第三方的模块名或者是类名同名
项目创建时不要使用虚拟环境.
!
# 导入selenium import timefrom SEO靠我selenium import webdriver # 实例化浏览器驱动对象(创建浏览器驱动对象) driver = webdriver.Chrome() # 创建的是SEO靠我谷歌浏览器驱动对象 chrome后面有括号,而且第一个字母要大写 # driver = webdriver.Firefox() # 创建火狐浏览器驱动对象 # 打开百度SEO靠我网站 driver.get("http://www.baidu.com") # 等待3s(代表业务操作) time.sleep(3) # 通过快捷导包的SEO靠我方式导入time模块, 光标要在time后面再按alt+enter # 退出浏览器驱动(释放系统资源) driver.quit()FAQ:
搭建环境问题总结:
1、安装过程SEO靠我中没有urllib3这个模块
如果没有对应的模块,可以通过在线或者离线的方式,安装一下urllib3这个模块2、chrome浏览器的版本与chrome浏览器驱动的版本不一致
先确定浏览器的版本,再下载对应SEO靠我的浏览器驱动版本3、chrome浏览器安装有问题,移动了chrome浏览器的应用程序目录 从C盘移到E盘
不要随便去移动安装程序的位置,因为在注册表中会记录程序安装目录信息。4、chrome浏览器驱动没SEO靠我有复制到python安装的根目录下
python安装的根目录不是python安装文件的目录。5、大家在创建项目时,用的是虚拟环境(包含venv目录),虚拟环境下找不到selenium模块
切换虚拟环境到正SEO靠我常的环境[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FkR0r67H-1648985748052)(img/image-20200621143100635.png)]SEO靠我
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ofcLeR0i-1648985748053)(ui自动化测试day01/image-20200621143416928.SEO靠我png)]
元素: 由标签头+标签尾+标签头和标签尾包括的文本内容
元素的信息就是指元素的标签名以及元素的属性
元素的层级结构就是指元素之间相互嵌套的层级结构
元素定位最SEO靠我终就是通过元素的信息或者元素的层级结构来进行元素定位。
3.2 浏览器开发者工具介绍 浏览器开发者工作主要用来查看元素的信息, 同时也可以查看接口的相关信息。浏览器开发者工作不需要安装,SEO靠我浏览器自带.浏览器开发者工具的启动: 直接按F12 不区分浏览器通过右键的方式来启动浏览器开发者工具 (谷歌浏览器右键选择“检查”, 火狐浏览器右键选择“检查元素” 浏览器开发者工具使用 点击 浏览器SEO靠我开发者工具左上角的 元素查看器按钮再点击想要查看的元素 3.3 元素定位 id定位name定位class_name定位tag_name定位link_text定位partSEO靠我ail_link_text定位xpath定位css定位 3.3.1 ID定位通过元素的ID属性值来进行元素定位 ,在html标准规范中 ID值是唯一的
说明: 元素要有ID属性
定位方法:SEO靠我 find_element_by_id(id) # id参数表示的是id的属性值
# 导包selenium import timefrom selenium import webdrivSEO靠我er # 创建浏览器驱动对象 driver = webdriver.Chrome() # 打开测试网站 driver.get("fileSEO靠我:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8ASEO靠我%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html") # 通过ID定SEO靠我位到用户名输入框并在用户名输入框中输入admin driver.find_element_by_id("userA").send_keys("admin") # 通过ISEO靠我D定位到密码输入框并在密码输入框中输入123456 driver.find_element_by_id("passwordA").send_keys("123456") SEO靠我 # 等待3s time.sleep(3) # 退出浏览器 driver.quit() 3.3.2 name定位通过元素的name属性SEO靠我值为进行元素定位 name属性值 在HTML页面中,是可以重复的。
说明:元素要有name属性
定位方法: find_element_by_name(name) # name 参数表示的是name的属性值SEO靠我
# 导入selenium import timefrom selenium import webdriver # 实例化浏览器驱动对象(创建浏览器驱动对象) SEO靠我 driver = webdriver.Chrome() # 创建的是谷歌浏览器驱动对象 chrome后面有括号,而且第一个字母要大写 # driver = webdriver.FSEO靠我irefox() # 创建火狐浏览器驱动对象 # 打开百度网站 driver.get("file:///D:/software/UI%E8%87%AA%E5%8A%A8SEO靠我%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9BSEO靠我%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html") # 通过name定位用户名,输入admin driver.find_eSEO靠我lement_by_name("userA").send_keys("admin") # 通过name定位密码, 输入123456 driver.find_elemenSEO靠我t_by_name("passwordA").send_keys("123456") # 等待3s(代表业务操作) time.sleep(3) # 通过快捷导包的方式导SEO靠我入time模块, 光标要在time后面再按alt+enter # 退出浏览器驱动(释放系统资源) driver.quit() 3.3.3 class_SEO靠我name定位通过元素的class属性值进行元素定位 class属性值是可重复的
说明:元素必须要有class属性
定位方法: find_element_by_class_name(class_name) SEO靠我# class_name参数表示的是class的其中一个属性值
# 导入selenium import timefrom selenium import webdriver SEO靠我 # 实例化浏览器驱动对象(创建浏览器驱动对象) driver = webdriver.Chrome() # 创建的是谷歌浏览器驱动对象 chrome后面有括号,而且第一个字母要大写SEO靠我 # driver = webdriver.Firefox() # 创建火狐浏览器驱动对象 # 打开百度网站 driver.get("file:///DSEO靠我:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%ESEO靠我5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html") # 1).通过classSEO靠我_name定位电话号码A,并输入:18611111111 driver.find_element_by_class_name("telA").send_keys("1861111111SEO靠我1") # 2).通过class_name定位电子邮箱A,并输入:123@qq.com driver.find_element_by_class_name("dzyxASEO靠我").send_keys("123@qq.com") # 等待3s(代表业务操作) time.sleep(3) # 通过快捷导包的方式导入time模块, 光标要在timSEO靠我e后面再按alt+enter # 退出浏览器驱动(释放系统资源) driver.quit() 3.3.4 tag_name定位通过元素的标签名称进行定SEO靠我位, 在同一个html页面当中,相同标签元素会有很多。
这种定位元素的方式不建议大家在工作当中使用。
定位方法: find_element_by_tag_name(tag_name) # tag_nameSEO靠我表示的是元素的标签名称。
如果有重复的元素,定位到的元素默认都是第一个元素
# 导入selenium import timefrom selenium import webdriver SEO靠我 # 实例化浏览器驱动对象(创建浏览器驱动对象) driver = webdriver.Chrome() # 创建的是谷歌浏览器驱动对象 chrome后面有括号,而且第一个SEO靠我字母要大写 # driver = webdriver.Firefox() # 创建火狐浏览器驱动对象 # 打开百度网站 driver.get("fileSEO靠我:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8ASEO靠我%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html") # 1).使用SEO靠我tag_name定位用户名输入框,并输入:admin driver.find_element_by_tag_name("input").send_keys("admin") SEO靠我 # 等待3s(代表业务操作) time.sleep(3) # 通过快捷导包的方式导入time模块, 光标要在time后面再按alt+enter # 退出浏览器驱动SEO靠我(释放系统资源) driver.quit() 3.3.5 link_text定位 通过超链接的全部文本信息进行元素定位 ,主要用来定位a标签定位方法:SEO靠我 find_element_by_link_text(link_text) # link_text参数代表的是a标签的全部文本内容。 # 导入selenium impoSEO靠我rt timefrom selenium import webdriver # 实例化浏览器驱动对象(创建浏览器驱动对象) driver = webdriver.ChrSEO靠我ome() # 创建的是谷歌浏览器驱动对象 chrome后面有括号,而且第一个字母要大写 # driver = webdriver.Firefox() # 创建火狐浏览器驱动对象 SEO靠我 # 打开百度网站 driver.get("file:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%SEO靠我95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6SEO靠我%B3%A8%E5%86%8CA.html") # 通过linu_text定位到新浪网站并点击 # driver.find_element_by_link_text("SEO靠我新浪").click() driver.find_element_by_link_text("访问 新浪 网站").click() # 等待3s(代表业务操作) SEO靠我 time.sleep(3) # 通过快捷导包的方式导入time模块, 光标要在time后面再按alt+enter # 退出浏览器驱动(释放系统资源) drivSEO靠我er.quit() 3.3.6 partial_link_text定位 通过超链接的局部文本信息进行元素定位,主要用来定位a标签定位方法:find_element_bSEO靠我y_partial_link_text(partial_link_text) # partial_link_text表示的是a标签 的局部文本内容 # 导入selenium SEO靠我 import timefrom selenium import webdriver # 实例化浏览器驱动对象(创建浏览器驱动对象) driver = webdriSEO靠我ver.Chrome() # 创建的是谷歌浏览器驱动对象 chrome后面有括号,而且第一个字母要大写 # driver = webdriver.Firefox() # 创建火狐浏览器SEO靠我驱动对象 # 打开百度网站 driver.get("file:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8BSEO靠我%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetSEO靠我est/%E6%B3%A8%E5%86%8CA.html") # 通过partial_link_text定位到新浪网站并点击 driver.find_element_bSEO靠我y_partial_link_text("访问 新浪 网站").click() # 等待3s(代表业务操作) time.sleep(3) # 通过快捷导包的方式导入tiSEO靠我me模块, 光标要在time后面再按alt+enter # 退出浏览器驱动(释放系统资源) driver.quit() 3.3.7 定位一组元素定位一SEO靠我组元素的方法:
find_elements_by_id(id)
find_elements_by_tag_name(tag_name)
定位一组元素返回的值是一个列表
可以通过下标来使用列表中的元素
下标是从0SEO靠我开始。
# 导入selenium import timefrom selenium import webdriver # 实例化浏览器驱动对象(创建浏览器驱动对象) SEO靠我 driver = webdriver.Chrome() # 创建的是谷歌浏览器驱动对象 chrome后面有括号,而且第一个字母要大写 # driver = webdriveSEO靠我r.Firefox() # 创建火狐浏览器驱动对象 # 打开百度网站 driver.get("file:///D:/software/UI%E8%87%AA%E5%8ASEO靠我%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9SEO靠我%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html") # 使用tag_name定位密码输入框(第二个input标签),并输入:1234SEO靠我56 elements = driver.find_elements_by_tag_name("input") elements[2].send_keys("12345SEO靠我6") # 等待3s(代表业务操作) time.sleep(3) # 通过快捷导包的方式导入time模块, 光标要在time后面再按alt+enter SEO靠我# 退出浏览器驱动(释放系统资源) driver.quit()学习目标:
掌握基于敏捷开发的测试流程掌握app的测试要点,熟悉各种专项测试的关注点熟悉GT工具的使用,能使用GTSEO靠我工具进行对应的性能测试所谓灰度发布,就是指在发布SEO靠我生产环境过程当,先发布其中几台服务器,如果这几台服务器功能运行一段时间后能够正常,那么再把其他未升级或者未发布的服务器进行生产环境发布,那如果说先发布的几台服务器运行有问题,那么就需要回滚到原来的版本SEO靠我。
2.3app项目发布平台android 安卓app文件后缀名是 apk
IOS 苹果app文件后缀名是ipa
获取app安装包文件的方式一:
anroid 可以直接找开发给对应apk安装包IOS 直接将手SEO靠我机给开发人员,让开发人员安装对应的ipa包获取app安装包文件的方式二:
可以借助内测试平台
国内用的内测平台是蒲公英, 国外用的是fir.im
测试包生成之后会上传到蒲公英平台,然后生成一个链接地址(二维SEO靠我码),可以直接通过二维码或者链接地址下载对应的测试包
生产app安装包的获取
anroid app安装包 豌豆荚、应用宝、360手机助手、各类手机品牌商城(上传app安装包需要审核 2-3 )
ios apSEO靠我p安装包 appstore itools(IOS时间更长,一周左右)
瀑布模型(传统行业)
需求分析设计编码测试运行维护优点:
1、为项目提供了按阶段划SEO靠我分检查点(文档)
2、当前一阶段完成后,只需要关注后续阶段。
缺点:
1、在项目各介段之间极少有反馈,出现问题没法及时处理,灵活性差
2、只有在项目结束交付上线时才能看到最终的结果
3、需要太多的文档来驱动项目SEO靠我进行。影响项目的效率。
结论:采用传统的瀑布模型最大的问题是开发的周期长,迭代的速度慢。
互联网行业特点:追求创新、以快吃慢、需求高度不确定性
互联网产品开发的特点:新需求、新方向
降低项目风险,确保正确的方SEO靠我向:快速的反馈机制、快速试错的流程 (针对需求不确定性)
敏捷开发:
概念:以用户的需求为核 心,采用迭代、循序渐近的方法进行软件开发
在敏捷开发过程当,软件项目在构建初期会被切分成不同的子系统以及不同的失SEO靠我代,各个子项目的成果经过测度,具备可视,可集成和可运行的特征。
3.2 Scrum介绍概念:Scrum是一个敏捷开发框架,是一个增量的,迭代的开发过程。在这个框架中,整个开发周期包括若干个小的迭代
周期,SEO靠我每个小的迭代周期成为一个Sprint(sprint:项目开发过程中最小迭代周期),每个Sprint的周期建议为2~4
周。在Scrum中,将产品Backlog(产品待办列表)按商业价值排出需求列表。在每SEO靠我个迭代中开发团队从产品
Backlog挑选最有价值的需求进行开发,实现完成后产品推出市场,进入下一个迭代需要熟悉的三个角色:
产品负责人:收集产品需求,确定产品上线时间,排产品需求的优先级项目经理:带领团SEO靠我实现SCRUM敏捷过程,确保组内成员不被外界干扰,确保组内成员按时完成任务开发团队:程序员,测试员,设计(程序员分前端、后端、android开发、ios开发)每日立会: 需要知道每天干 了什么,明天计SEO靠我划干什么,以及遇到的问题。 一般早上开会,15分钟左右。 同时需要知道项目的进度是否正常功能测试兼容性测试安装、卸载、升级测试交叉事件测试PUSH测试性能测试
* CPU
* 内存
* 流量
* 电量
* 流畅度
* 启动速度
* 用户体验测试
* 稳定性测试 2、业务SEO靠我功能测试根据测试功能去拆分功能点,再根据功能点去分析测试点。
系统 1、android 2、IOS
手机系统的版本 覆盖主流 https://tongji.baidu.cSEO靠我om/research/app
android 对应的主流版本 9.0 \ 8.1 \10.0的版本IOS 对应的主流版本 13.3.1 \ 13.4.1\ 13.3品牌-机型 覆盖主流 https:/SEO靠我/tongji.baidu.com/research/app
android 华为、小米、vivoIOS 苹果屏幕分辨率 覆盖主流 https://tongji.baidu.com/research/aSEO靠我pp
软硬件兼容性
与手机硬件兼容
home键、电源键、音量调节等
与外部硬件设备兼容
耳机、蓝牙等
与操作系统软件兼容
wlan设置、系统时间调节、LBS定位等
与其他APP兼容
后台在播放音乐时,进入动态页面点击动SEO靠我态视频的播放,系统如何处理网络兼容性 2G\3G\4G\5G\WIFI
不可能去做全兼容的测试。
可以去做深度兼容测试。需要借助于第三方云测试平台。testin云测,云测平台有很多手机。
在云测平台注册账号SEO靠我,上传APP,给钱,拿 报告 。
app是一个客户端程序,客户端在使用前是需要安装的,因此需要测试安装、卸载、升级的操作
安装测试点:(只要大家能想到的点,都可以去进行测试,没SEO靠我有对错)
正常场景:1、在不同的操作系统、不同的手机品版和版本上安装
2、从不同的渠道下载app进行测试
3、不同的安装路径,安装在手机的内存卡或者是SD卡(非必要)
异常场景:
4、安装时出现异常(关机、断网SEO靠我),恢复后能否继续安装
5、安装时存储空间不够或者内存不足
6、安装时点出取消再安装
7、安装之后再次覆盖安装
8、低版本覆盖安装高版本
卸载
正常卸载:长按app正常删除卸载、通过第三方工具进行卸载
异常卸载:aSEO靠我pp正在运行卸载、取消卸载、卸载关机、卸载之后数据是否保留
升级
正常升级: 从低版本升级到高版本,从app内部升级, 从app应用商城升级
异常升级:跨版本升级, 关机,内存不足,电量不足
升级提示
升级之后SEO靠我数据的检查
概念:交叉测试又称为冲突测试,或者干 扰测试
交叉事件的关注点:
1、app运行时接打电话
2、app运行时收发短信
3、app运行时收到推送通知
4、app运行时接到视频通话
5、app运SEO靠我行连接蓝牙
6、app运行时切换网络、切换应用
7、app运行时旋转屏幕
1、打开USB调式, 点击“系统SEO靠我应用”–“设置”, 在设置 的最下方选择“关于平板电脑”,在关于平板电脑中点击“版本号”,直接提示开发者选项已打开。
2、返回到设置 菜单页面时,可以 看到 “开发者选项”这个菜单。点击进入到开发者选项SEO靠我, 需要打开 USB调试 以及指针位置 这两个选项。
3、开启超级管理员访问权限
点击“系统应用”–“文件管理器”, 在文件管理器的左上方有三横杆的按钮,在弹出的页面中点击左下方的 齿轮 按钮,进入到设置SEO靠我页面之后,选择 “常规设置”—“访问模式”,将访问模式更改为超级管理员访问模式。 3.1 性能工具介绍及安装GT随身调 android版是由腾讯公司开发的性能测试平台。直接运行在手机上SEO靠我面的。
可以通过GT工具进行基础的性能测试:内存、CPU、电量、网络流量、流畅度,可以以绘制图表的形式显示出指标的相关数据
GT工具提供了查看日志的功能。可以通过查看相关日志来分析和定位app功能异常以及SEO靠我crash等问题
3.2 性能工具使用打开GT工具,在AUT界面选择被测试的app以及对应的性能指标
设置参数,进入到参数页面,点击右上角的"编辑"按钮,拖动想要测试的参数到已关注区域,而且要勾选。
勾选之SEO靠我后,点击上方的红色 录制按钮。
执行测试之前,进入到日志界面,开启logcat的日志记录功能。
如果要进行电量或流量的性能测试需要进入到插件页面进行设置。
返回到AUT界面,在上面点击“启动”或者“runnSEO靠我ing” 来启动被测试的app
针对app进行相关的业务操作
操作完成之后,再进入到GT工具,查看性能参数的数据。
3.3 CPU测试GT工具提供了两个CPU的监控指标:CPU和jiffes
CPU指标就是指SEO靠我当前手机中cpu的整体使用率
用户态:cpu处于应用程序执行的时间
系统态:表示的是系统内核执行的时间
空闲态:表示空闲系统进程执行的时间
cpu使用率 = cpu空闲态/cpu的总的执行时间
jiffief:SEO靠我
表示的是开机以来,程序消耗的CPU时间片的总数
CPU问题的影响:
1、CPU使用长时间处于90%以上 (70 80 )
2、手机发热、耗电量增加
3、反应变慢,引起ANR(假死状态)
操作步骤:
1、打开GT工SEO靠我具,进入到AUT页面,选择测试的app,勾选CPU性能指标
2、进入到参数界面,配置CPU参数选项,然后进行勾先,点击录制
3、进入到日志界面,打开logcat记录日志
4、返回到AUT界面,启动app
5、SEO靠我针对app进行相关的业务操作(实际工作当中,操作时间会比较长)
6、返回到GT工具界面,查看相关的参数数据。
3.4 内存测试PSS和private dirty
private dirty(私有内存):
进程SEO靠我独占的内存,也就是进程销毁时可以回收的内存容量.
PSS(实际使用内存):
将跨进程的共享内存也加入进来,进行按比列计算PSS。就能够准确的表示进程占用的实际物理内存。
常见问题:
1、内存泄漏
内存泄漏(meSEO靠我mory leak):当程序运行时申请了对应的内存空间,而当程序销毁时并没有释放对应的内存空间。
2、内存溢出
内存溢出 (out of memory):是指程序在申请内存空间时,没有足够的内存空间供其使SEO靠我用。
内存问题产生的影响
1、程序实际使用的内存PSS会不停的增长
2、程序会出现闪退(crash)
内存的指标根据不同的手机配置、以及不同的公司,指标值是不一样的。
内存操作步骤: 打开GT工具,选择对应的被SEO靠我测app, 勾选内存指标(PSS和private dirty)进入到参数界面,编辑参数,勾选对应参数,并点击录制按钮进入到日志界面,开启logcat,记录日志信息回到AUT界面,点击 启动按钮,启动被SEO靠我测试的app针对启动的app进行相关的业务功能操作(时间一般也会在几个小时左右。)操作完成,回到GT工具的参数界面,查看获取到的参数数据。 3.5 流畅度测试 3.6 SEO靠我流量测试 3.7 电量测试 3.8 用户体验测试 3.6 弱网测试GT工具提供了流畅度的监控指标:FPSEO靠我S
FPS是指人的肉眼能够看到的画面每一秒帧数
效果:想要达到流畅的效果,至少每秒的帧数要达到24帧
每秒和帧数越高流畅度就越好
如果想要达到最佳的流畅度需要达到每秒60帧
当页面静止不动时,FPS的值显示的是SEO靠我0
测试时间:15-30分钟
操作步骤:
1、打开GT工具,进入到AUT界面,选择被测试的app
2、进入到参数界面,点击编辑拖动FPS参数到已关注参数中,勾选之后,点击录制
3、进入到日志界面,开启logcaSEO靠我t记录日志信息
4、返回到AUT界面,点击启动,打开被测试的app
5、针对被测app进行相关的业务操作
6、返回到参数界面查看参数数据
3.6 流量测试GT工具里面提供了一个监控流量的指标:NET
流量:手机SEO靠我在访问网络过程当所产生的上传和下载的数据(报文)就称为流量
常用流量测试方法
抓包测试法
通过抓包工具将所有的网络应用数据包,全部抓取到并保存到某个文件中,进行分析的过程 。
wireshark所有协议的报文SEO靠我,sniffer也可以抓所有的报文,tcpdump命令可以抓所有的报文
统计测试法
获取的是某一个应用程序获取的数据报文,统计出对应的流量。
GT工具测试步骤:
打开GT进入到AUT界面,选择被测试的app,SEO靠我勾选NET指标进入到参数界面,点击编辑,拖选 NET参数,勾选并点击录制进入到日志界面,开启Logcat记录日志信息进入到插件界面,选择“抓包”,再点击“开始”返回到AUT界面,点击“启动”,启动测试SEO靠我app针对启动的app进行相关业务操作返回到参数界面,停止录制,再返回到插件界面,点击“抓包”,再点“停止”流量的优化:
数据压缩 在HTTP协议中可以通过此字段将数据进行压缩,减少数据容量。conteSEO靠我nt-encoding: gzip
* 不同的数据格式的采用 json lxml 数据格式
* 控制访问的频次 通过异步加载的方式来加载数据。
* 只获取必要的数据
* 缓存机制
* 懒加载 将多个图片放在同一SEO靠我张图片里面,一起加载。 3.7 电量测试GT工具当中提供了电量的监控指标:电流、电压,电量跟温度
就是指移动设备电量消耗快慢的一种测试方法。一般用平均电流来衡量电量的消耗速度。
常见的耗电SEO靠我场景:
定位,GPS
网络传输
蓝牙
屏幕的亮度
GT工具只能特定类型的机型进行电量的测试。
可换其他性能测试工具进测试,也可以使用对比方式进行测试(拿 同类型的产品,在同样的手同样的场景下进行对比测试。)
3.8SEO靠我 用户体验测试用户体验主要是跟app的界面有关。
UI界面测试 包括界面的设计、界面元素框架、结构、颜色、布局、图片、按钮选中的一些效、文字的内容。易用性测试 菜单的层次、完成业务操作的步骤是否过多, SEO靠我点击按钮的范围 是不是合适,包括返回键的操作横竖屏测试 横屏之后,页在的表格是不是能正常的显示。关注手机上的其他辅助功能 放大字体如何测试app?
首先了解需求。
测试的过程 :
* 测试SEO靠我功能* 兼容性测试* 安装、卸载、升级测试* 交叉事件测试* 用户体验测试* PUSH测试* 性能测试(CPU、内存、电量、流量、流畅度、启动时间)* 稳定性测试当对app进行了充分
的测试之后,主可以SEO靠我编写测试报告 ,发布app到线上了。
app的发布,打包上传到各大应用商城。
测试人员也需要关注,关注的是app线上的BUG。
运维需要关注的app的线上环境
Robtium
基于anroid的一款开源自动化测试框 架
支持java语言
不支持跨平台
macaca
由阿里巴巴公开开发的一套开源自动化解决方案
适用平台:PC端、android、IOS
支持的语SEO靠我言:java、python、nodejs
Appium
是一款国外开源的自动化测试框架
适用平台:android、IOS
支持的语言:java\js\php\python\C#\ruby
社区活跃、资料丰富
apSEO靠我pium的特点:
开源
支持Native App(全部android sdk的java代码生成) 原生的app如果页面有变更,就得发一版本,提交到应用商城去审核
Web App(都是由HTML5生成的) 访SEO靠我问速度慢。H5的代码以及元素信息
Hybird APP(既有native app也有H5的页面)混合app 是当前工作中用得最多的
支持andorid 、IOS
支持跨平台、支持windows、linux、SEO靠我macos
支持多语言 java js python C# ruby
![](https://img-SEO靠我blog.csdnimg.cn/c29099cf8dba409c84265059398980da.png?x-oss-process=image/watermark,type_d3F5LXplbmhlSEO靠我aQ,shadow_50,text_Q1NETiBA5pyo5pyo5466,size_20,color_FFFFFF,t_70,g_se,x_16)
通过此图可以知道app的自动化环境需要以下工具:
aSEO靠我ppium服务器基于python的appium客户端(appium-client-python)adb(adb集成在android-sdk中)JDK双击可执行文件SEO靠我,安装过程中建议不要将安装目录设置在含有中文的目录。建议不要发装在系统盘中。
验证: 在DOS命令行中输入 java -version 如果能看下图所显示的信息就是正确的。
下载链接: https://android-sdk.en.softonic.com/?ex=MOB-593.7
安装步骤:
解压android-sdk的压缩包文件将解压的目SEO靠我录复制到某一个文件夹下,文件夹的路径也不要包含 中文添加相应的环境变量(以下三个目录) D:\Program Files\android-sdk\tools uiautomatorviewer.batSEO靠我工具可以用来查看app的元素信息D:\Program Files\android-sdk\platform-tools adb.exe 此工具用来连接手机D:\Program Files\androiSEO靠我d-sdk\build-tools\25.0.0 aapt.exe 可以获取app的包名和启动名验证:
1、在DOS命令行中输入 uiautomatorviewer 如果能显示以下图片,就说明是正常的。SEO靠我
2、在DOS命令行中输入: adb ,如果 能出现以下图片,就说明是正常.
3、在DOS命令行中输入: aapt , 如果能出现发下图片,就说明是正常的
4SEO靠我.1 appium安装 双击appium服务器的可执行文件,默认安装在C盘。 4.2 appium验证 启动服务之前,需要先配置SEO靠我jdk以及android-sdk的目录。 启动服务,如果能看到以下图片信息,说明安装正常
adb 包含 了三个部分 adb 客户端 用来下发adb的指令工具Server 服务端 adb.exe执行之后的进程,表示aSEO靠我db的服务端,通过服务端与手机上的adb守护进程进行 通信adb守护进程 随着android系统的启动而启动,当android系统关闭之后它才会关闭。
如果是真机,不要 使用一带多接头的数据线,否则找不到手机设备
adb devices 常看手机的设备ID名称以及状态
emulator-5554 device emulator-55SEO靠我54表示的是手机设备的ID名称, device表示设备处于在线状态,
如果不在线显示的是offline
( 如果adb服务没有启动,下发该命令时,会自动的去启动adb的服务)adb start-serveSEO靠我r 启动adb服务
adb kill-server 关闭adb 服务
2.2 获取包名和界面名 包名: app包名 ,通过app的包名来区分不同的app,app包名是唯 一的界面名(启动名SEO靠我): 相当于web页面当中的链接地址,在app当中,每个界面都有一个名字原因:自动化过程当,需要通过app的包名和界面名来启动app。
操作步骤: adb命令
在手机或者模拟器上面打开app
windowsSEO靠我命令一:adb shell dumpsys window windows | findstr mFocusedApp
windows命令二: adb shell dumpsys window |findSEO靠我str “usedApp”
com.android.settings/.Settings com.android.settings是包名, .Settings是界面名 通过 / 分隔包名和界面名
LINUSEO靠我X/MacOS命令一: adb shell dumpsys window windows | grep mFocusedApp
LINUX/MacOS命令二: adb shell dumpsys winSEO靠我dow |grep “usedApp”
通过aapt获取app的包名和界面名
aapt dump badging D:\BaiduNetdiskDownload\apptools\apk\xuechebuSEO靠我.apk 后面表示的是app安装包的路径及名称
包名: package: name=‘com.bjcsxq.chat.carfriend’ # package:name 后面的字符串表示的是app的包名SEO靠我
界面名: launchable-activity: name=‘com.bjcsxq.chat.carfriend.module_main.activity.SplashActivity’ launcSEO靠我hable-activity: name后面的字符串是界面
2.3 安装卸载appapp安装 adb install 路径/app安装包名称
app卸载 adb uninstall 包名
2.4 上传下载文SEO靠我件上传 将电脑上的文件上传到手机
adb push 电脑上的文件路径 手机的路径
例子:adb push ./monkey.txt /sdcard
下载文件 从手机上下载文件到本地
adb pull 手机的文SEO靠我件路径 电脑的文件夹路径
例子:adb pull /sdcard/monkey.txt D:\opt
2.5 查看日志信息为什么要获取日志信息:用来给开发定位问题。
adb logcat 来查看相关的日志信SEO靠我息
2.6 测试app的启动速度(性能测试)测试app启动速度的命令:
adb shell am start -W 包名/界面名
Starting: Intent { act=android.intent.SEO靠我action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.baidu.homework/.activity.user.passport.ChSEO靠我oiceLoginModeActivity }
Status: ok
Activity: com.baidu.homework/.activity.user.passport.ChoiceLoginModSEO靠我eActivity
ThisTime: 3345
TotalTime: 3345
WaitTime: 3378需要大家关注的是TotalTImie的时间值,那么在实际的测试过程当,会进行多次测试,然后取平均SEO靠我值。
monkey 集成在adb工具当中,主要用来做稳定性测试用的, monkey是通过java语言编写的一种稳定性测试工具。
主要用来测试app会不会出现crash(崩溃)的情SEO靠我况。
相当于让一只猴子来随机操作app,所有的操作都有可能出现,长时间的操作来测试app会不会出现问题。
monkey常用的参数
-p 参数 对指定的app进行随机操作adb shell monkey -pSEO靠我 com.baidu.homework 100 (100次随机事件)
-v 参数 表示的是记录信息的级别
level 0:adb shell monkey -p com.baidu.homework -vSEO靠我 100 默认级别
level 1: adb shell monkey -p com.baidu.homework -v -v 100 打印出来的信息会比较详细,只打印跟本程序相关的日志信息
level SEO靠我2: adb shell monkey -p com.baidu.homework -v -v -v 100 打印出来的信息会更多,会显示出其他程序运行的信息
-s 用于指定伪随机数。如果两次的伪随机数SEO靠我相同,那么两次的操作步骤、流程、操作事件完全一样。
主要的作用,就是用来复现上次的问题
adb shell monkey -p com.baidu.homework -v -v -s 10 100
–thrSEO靠我ottle 用于指定随机事件的间隔时间, 单位是毫秒
adb shell monkey -p com.baidu.homework -v -v --throttle 3000 -s 10 100
组合使用SEO靠我:
adb shell monkey -p com.baidu.homework --throttle 500 --pct–touch 10 --pct-motion 50 -v -v -s 100 3SEO靠我00> log.log
–pct–touch 10 触模(10表示的是整个随机同件中的百分比)
–pct-motion 50 滑屏(50表示的是整个随机同件中的百分比)
日志分析
如果在日志里面出现了 ANRSEO靠我(application not responsing)
如果日志中出现了Exception,可能程序崩溃。
=----------------------------------------------SEO靠我==
手势操作命令
模拟点击事件
adb shell input tap x y # x y表示的是坐标点 参数之间用空格隔开
模拟滑屏事件(参数之间用SEO靠我空格隔开)
adb shell input swipe startx starty endx endy # startx, starty 表示的是起始点坐标,endx,endy表示的是终点坐标
模拟键盘操SEO靠我作
adb shell input keyevent 键值 (3 表示的HOME键 4 表示的返回键 66表示的回车键)
模拟输入操作
adb shell input text 内容 内容表示要输入的内容,SEO靠我另外输入的内容不能是中文
如果出现上图中 offline的设备,记得重启一下adb服务
如果电脑上面连接了多个模拟器或者是手机。那么需要加上一个参数 -s device_name
adb -s emulatSEO靠我or-5554 shell input keyevent 4
弱网测试步骤:
打开fiddler,设置相应的代理端口(当端口被占用时需要手动更改代理端口)
在fiddler中设置网络的上传和下载SEO靠我的速度
点击 “rules”–“customize rules”在手机中设置网络的代理
手机的IP地址必须与fiddler电脑的IP地址,是同一个局域 网。也就是在同一网段。
查看电脑的IP地址命令: ipSEO靠我config
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOpUmPRe-1649137680297)(ui自动化测试day07/image-202006SEO靠我30110815138.png)]
# 导入webdriver import timefrom appium import webdriver # 初始化app的配置信息SEO靠我 des_cap = dict() # 定义字典参数des_cap["platformName"] = "android" # 表示的是android 或者IOS系统 SEO靠我des_cap["platformVersion"] = "5.1.1" # 表示的是平台系统的版本号 des_cap["deviceName"] = "****" # 表示的是设备的SEO靠我ID名称(如果只有一个设备可以用****来替代) des_cap["appPackage"] = "com.android.settings" # 表示的是app的包名 SEO靠我 des_cap["appActivity"] = ".Settings" # 表示的是app的界面名driver = webdriver.Remote("http://localhost:4723/SEO靠我wd/hub", des_cap)time.sleep(6)driver.quit()通过uiautomatorviewer工具可以查看app的元素信息。
查看SEO靠我元素信息:
如果出现如下错误:
需要重启adb服务。获取app页面信息时不能正在运行代码,会占用adb服务。
为了提高效率,在android sdk的 tools目录下,将uiautomatorviewerSEO靠我.bat复制一份出来,并修改为ui.bat就OK了。
后续直接在dos中输入ui就可以打开了
driver.start_activity(“包名”,”SEO靠我界面名“)
driver.start_activity("com.baidu.homework", ".activity.user.passport.ChoiceLoginModeActivity") driver.current_package 获取当前脚本运行中的app的包名
driver.current_activity 获取当前脚本运行中的app的界面名
区别:
关闭app之后,可以再使用其他代码启动新的app
关闭驱动,那么代码与appium服务器SEO靠我之间的连接已经断,开不能再做任何的操作。
判断手机是否安装app driver.is_app_installed(“包名”)
返回值:TSEO靠我rue 有安装app 或者False 没有安装app
driver.background_app(seconds) # seconds 表示的是将app置于后台运行多少秒的时间
通过元素的resource-id来进行元素定位
driver.find_element_by_id(resource_id的值)
1.2 通过claSEO靠我ss_name定位元素 通过元素的class属性值来进行元素定位
app中,class的值始终都只有一个。
driver.find_element_by_class_name(class)
1.3SEO靠我 通过xpath定位元素 通过xpath的元素属性来进行元素定位
driver.find_element_by_xpath(“//*[@text=‘value’]”)
单个元素定位不到会报错。
# 导入wSEO靠我ebdriver import timefrom appium import webdriver # 初始化app的配置信息 from seleniumSEO靠我.webdriver.common.by import Bydes_cap = dict() # 定义字典参数des_cap["platformName"] = "android" # 表示的是andSEO靠我roid 或者IOS系统 des_cap["platformVersion"] = "5.1.1" # 表示的是平台系统的版本号 des_cap["deviceNameSEO靠我"] = "****" # 表示的是设备的ID名称(如果只有一个设备可以用****来替代) des_cap["appPackage"] = "com.android.settings"SEO靠我 # 表示的是app的包名 des_cap["appActivity"] = ".Settings" # 表示的是app的界面名driver = webdriver.Remote("hSEO靠我ttp://localhost:4723/wd/hub", des_cap) # 找到“更多”按钮并点击(XPATH) element = driver.find_elSEO靠我ement(By.XPATH, "//*[@text=更多]") element.click() time.sleep(2) # 找到 飞行模式的 开关SEO靠我,并点击(ID) air_element = driver.find_element(By.ID, "android:id/switchWidget") air_eleSEO靠我ment.click() time.sleep(2) # 找到返回按钮并点击(class) return_element = driver.find_eSEO靠我lement(By.CLASS_NAME, "android.widget.ImageButton") return_element.click() time.sleeSEO靠我p(3) driver.quit()通过显示等待定位元素
from selenium.webdriver.support.wait import WebDriverWait SEO靠我 # 定义一个获取元素的方法# def get_element(driver, find_type, value): # wait = WebDriverWait(driver, 1SEO靠我0, 1) # element = wait.until(lambda x: x.find_element(find_type, value)) # return elSEO靠我ementdef get_element(driver, element):wait = WebDriverWait(driver, 10, 1)element = wait.until(lambdaSEO靠我 x: x.find_element(element[0], element[1]))return elementdriver.find_elements_by_id(resourceSEO靠我_id)
driver.find_elements_by_class_name(class_name)
driver.find_elements_by_xpath(xpath)
driver.fSEO靠我ind_elements(By.ID, value)
返回的值是一个列表,如果没有找到,说明列表是空值,可以通过下标来使用其中的元素对象,下标是从0开始。
element.clear() 针对元素进行清空操作
element.send_keys(“value”) 针对元素进行输入操作
获取元素的文本内容(获取的是元素text属性的内容)
element.text
获取元素的位置
element.location 返回的值是一个字典,字典中包含x和y , x和y表示的是元素在手机屏SEO靠我幕左上角的点的坐标
获取取元素的大小
element.size 返回值是一个字典,字典中会包含 width和height, width表示的宽度,height表示的高度
获取元素的属性值
element.geSEO靠我t_attribute(“attribute”) # attribute表示的是属性名称
获取ID值时, attribute= “resourceId”
获取的是class的值 , attribute=“SEO靠我className”
如果attribute = "name"时,获取的是text或者content-desc(text优先,找不到text值,再去找content-desc的值)
# 导入webdrivSEO靠我er import timefrom appium import webdriver # 初始化app的配置信息 from selenium.webdrSEO靠我iver.common.by import Byfrom utils import get_elementdes_cap = dict() # 定义字典参数des_cap["platformName"SEO靠我] = "android" # 表示的是android 或者IOS系统 des_cap["platformVersion"] = "5.1.1" # 表示的是平台系统的版本号 SEO靠我 des_cap["deviceName"] = "****" # 表示的是设备的ID名称(如果只有一个设备可以用****来替代) des_cap["appPackage"] =SEO靠我 "com.android.settings" # 表示的是app的包名 des_cap["appActivity"] = ".Settings" # 表示的是app的界面名driveSEO靠我r = webdriver.Remote("http://localhost:4723/wd/hub", des_cap) # 找到wlan 元素 wlan_btn =SEO靠我 By.ID, "com.android.settings:id/title" element = get_element(driver, wlan_btn) # 获取SEO靠我wlan菜单的文本内容 print(element.text)# 获取wlan的位置信息 print(element.location)# 获取wlan元素的大小 SEO靠我 print(element.size)# 获取wlan元素 print(element.get_attribute("className"))time.sleep(6)drSEO靠我iver.quit()============================
在初始化配置中增加两个参数:
"resetKeyboard":SEO靠我 True, # 重置设备的输入键盘 "unicodeKeyboard": True # 采用unicode编码输入 from selenium.webdriver.SEO靠我support.wait import WebDriverWait # 定义一个获取元素的方法# def get_element(driver, find_type, value): SEO靠我 # wait = WebDriverWait(driver, 10, 1) # element = wait.until(lambda x: x.find_elemenSEO靠我t(find_type, value)) # return element # 减少代码量,不必要在每个元素定位的代码中都使用显示等待来定位。 def SEO靠我get_element(driver, element): # element 表示的元素定位的值wait = WebDriverWait(driver, 10, 1)element = wait.uSEO靠我ntil(lambda x: x.find_element(element[0], element[1]))return element# 判断元素是否存 def element_isSEO靠我_exsit(driver, element): # element 表示的元素定位的值try: # 捕获异常信息get_element(driver, element) # 能够正常找元素,就返回TSEO靠我ruereturn Trueexcept Exception as e: # 如果捕获到了异常,返回Falsereturn False# 为了保证代码的健壮性,确定输入的内容一定不会出错,所以在输入前SEO靠我做了一次清除。 def input_text(element, text):""":param element: 表示的是元素对象:param text: 表示的是要输入的内容:retSEO靠我urn:"""# 清除元素中的文本内容element.clear()# 输入文本内容element.send_keys(text) 初始化:区分首次打开还是非首次打开 SEO靠我 "noReset": True # 用来记住app的session,如果有登陆或做过初始化的操作,为True时,后面不需要再操作 # 导入webdriver impSEO靠我ort time from appium import webdriver # 初始化app的配置信息 from selenium.webdriver.SEO靠我common.by import Byfrom utils import get_element, input_text, element_is_exsitdes_cap = { "pSEO靠我latformName" : "android" , #表示的是android 或者ios "platformVersion" : "5.1.1", #表示的是平台系统的版本号 SEO靠我 "deviceName" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) "appPackage" : "com.bjcsxq.chatSEO靠我.carfriend", #表示app的包名 "appActivity" : ".module_main.activity.SplashActivity", #表示的是app的界面名 SEO靠我 "noReset": True # 用来记住app的session,如果有登陆或做过初始化的操作,为True时,后面不需要再操作 ####"".module_main.SEO靠我activity.MainActivity"" } #定义字典参数driver = webdriver.Remote("http://localhost:4723/wd/hub",deSEO靠我s_cap)agree_btn = By.XPATH, "//*[@text=同意并继续使用APP]"# 通过同意协议来判断app是否是首次打开 if element_is_exsitSEO靠我(driver, agree_btn):get_element(driver, agree_btn).click() else:print("非首次打开")# 点击“我的” SEO靠我 me_element = By.ID,"com.bjcsxq.chat.carfriend:id/mine_layout" get_element(driver, me_elemSEO靠我ent).click() # 登录 login_element = By.ID, "com.bjcsxq.chat.carfriend:id/mine_usernameSEO靠我_tv" get_element(driver, login_element).click() # 输入手机号 tel_element = By.ID,SEO靠我 "com.bjcsxq.chat.carfriend:id/login_phone_et" input_text(get_element(driver, tel_element), SEO靠我"13751113926") # 输入密码 password_element = By.ID, "com.bjcsxq.chat.carfriend:id/login_SEO靠我pwd_et" input_text(get_element(driver, password_element), "a123456b") # 点击登录 SEO靠我 insert_element = By.ID, "com.bjcsxq.chat.carfriend:id/login_btn" get_element(driver, insertSEO靠我_element).click() # 点击确定 accept_element = By.CLASS_NAME, "android.widget.Button" SEO靠我 get_element(driver, accept_element).click() # 点击“驾照圈” licence_btn = By.ID, "comSEO靠我.bjcsxq.chat.carfriend:id/apply_layout" get_element(driver, licence_btn).click() # 选SEO靠我择第一条评论 pl_element = By.ID, "com.bjcsxq.chat.carfriend:id/tv_post_replay" get_elementSEO靠我(driver, pl_element).click() # 填写评论内容 nr_element = By.XPATH, "//*[@text=发布评论]" SEO靠我 input_text(get_element(driver, nr_element), "test") # 进行发布 fb_element = By.CLASS_SEO靠我NAME, "android.widget.TextView" get_element(driver, fb_element) time.sleep(3) SEO靠我 driver.quit()保证脚本在不同机型上都能实现滑屏的操作。
driver.get_window_size() 返回的值是字典类型, 包含 height 和 SEO靠我width 高度和宽度的值
driver.get_screenshot_as_file(filename)
注意事项:1、路径必须手动创建 2、文件名称必须是以PNG结尾
import tiSEO靠我mefrom appium import webdriver from selenium.webdriver.common.by import Byfrom utils import SEO靠我get_element, input_textdes_cap = { "platformName" : "android" , #表示的是android 或者ios "SEO靠我platformVersion" : "5.1.1", #表示的是平台系统的版本号 "deviceName" : "****", #表示的是设备的ID名称(如果只有一个设备可以用***SEO靠我*来代替) "appPackage" : "com.android.settings", #表示app的包名 "appActivity" : ".Settings", SEO靠我#表示的是app的界面名 "resetKeyboard": True, # 重置设备的输入键盘 "unicodeKeyboard": True # 采用unicode编SEO靠我码输入 ####"".module_main.activity.MainActivity"" } #定义字典参数driver = webdriver.Remote("hSEO靠我ttp://localhost:4723/wd/hub",des_cap)# 获取手机屏幕分辨率 print(driver.get_window_size())# 截图 SEO靠我 driver.get_screenshot_as_file("img/error.png")time.sleep(2) driver.quit()主要是为了实现视SEO靠我频类的app中,视频播放过程中网络切换时会有提示信息的操作。
3.1 获取手机网络driver.network_connection
appium定义的网络类型
3.2 设置手机网络driver.set_nSEO靠我etwork_connection(connectionType) # connectionType 网络类型的值
import timefrom appium import webdriver SEO靠我 from selenium.webdriver.common.by import Byfrom utils import get_element, input_textdes_cap = {SEO靠我 "platformName" : "android" , #表示的是android 或者ios "platformVersion" : "5.1.1", #表示的是平SEO靠我台系统的版本号 "deviceName" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) "appPackage" : "com.SEO靠我android.settings", #表示app的包名 "appActivity" : ".Settings", #表示的是app的界面名 "resetKeyboarSEO靠我d": True, # 重置设备的输入键盘 "unicodeKeyboard": True # 采用unicode编码输入 ####"".module_main.actSEO靠我ivity.MainActivity"" } #定义字典参数driver = webdriver.Remote("http://localhost:4723/wd/hub",des_cSEO靠我ap)# 获取网络类型 print(driver.network_connection)# 设置网络类型 driver.set_network_connection(4SEO靠我)print(driver.network_connection) time.sleep(2) driver.quit()常用的三个键值: 3 HOMESEO靠我键, 4 返回键 , 66 回车键
driver.press_keycode(键值)
driver.open_notifications()
import timefrom appium SEO靠我import webdriver from selenium.webdriver.common.by import Byfrom utils import get_element, iSEO靠我nput_textdes_cap = { "platformName" : "android" , #表示的是android 或者ios "platformVersioSEO靠我n" : "5.1.1", #表示的是平台系统的版本号 "deviceName" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) SEO靠我"appPackage" : "com.android.settings", #表示app的包名 "appActivity" : ".Settings", #表示的是app的界面名 SEO靠我 "resetKeyboard": True, # 重置设备的输入键盘 "unicodeKeyboard": True # 采用unicode编码输入 ##SEO靠我##"".module_main.activity.MainActivity"" } #定义字典参数driver = webdriver.Remote("http://localhosSEO靠我t:4723/wd/hub",des_cap)# 打开通知栏 driver.open_notifications()# 模拟返回键 driver.press_keycoSEO靠我de(4)time.sleep(2) driver.quit()driver.swipe(startx, starty, endx, endy,SEO靠我 duration=None)
针对频道类的元素进行滑动选择对应的频道。
# 封装一个边滑动边查找的方法 def swipe_find(driver, element, element_info):ele_sizSEO靠我e = element.size # 获取元素大小width = ele_size["width"] # 获取元素的宽度height = ele_size["height"] # 获取元素的高度# 获SEO靠我了element元素左上角点的坐标ele_position = element.locationx = ele_position["x"] # 获取左上角点的x坐标值y = ele_position[SEO靠我"y"] # 获取左上角点的y坐标值start_x = x + width*0.9 # 获取的是起始点X的值y = y + height*0.5 # 获取的是起始及终止点的Y的值end_x = x +SEO靠我 width*0.1 # 获取的是终止点X的值while True:page = driver.page_source # 记录查找前的页面资源,通过对比页面资源来退出死循环try:driver.fiSEO靠我nd_element(*element_info).click() # 如果有找到对应的元素那么点击并返回return Trueexcept Exception as e:print("没有找到该元素SEO靠我!")driver.swipe(start_x, y, end_x, y, duration=1000) # 没有找到元素,那么滑屏后再对比并重新查找time.sleep(1)if page == dSEO靠我river.page_source:print("滑屏操作完成且没有找到元素信息")return Falsescroll是通过元素来进行滑动的
driver.scroll(souSEO靠我rce_element, target_element)
scroll无法设置滑动的持续时间,带有一定惯性。 主要用于IOS中,android高版本系统可以使用。
import timefrom appiSEO靠我um import webdriver from selenium.webdriver.common.by import Byfrom utils import get_elementSEO靠我, input_text, execute_swipedes_cap = { "platformName" : "android" , #表示的是android 或者ios SEO靠我 "platformVersion" : "5.1.1", #表示的是平台系统的版本号 "deviceName" : "****", #表示的是设备的ID名称(如果只有一个设备可以SEO靠我用****来代替) "appPackage" : "com.android.settings", #表示app的包名 "appActivity" : ".SettingSEO靠我s", #表示的是app的界面名 "resetKeyboard": True, # 重置设备的输入键盘 "unicodeKeyboard": True # 采用unicSEO靠我ode编码输入 ####"".module_main.activity.MainActivity"" } #定义字典参数driver = webdriver.RemotSEO靠我e("http://localhost:4723/wd/hub", des_cap) # 存储 按钮 save_btn = By.XPATH, "//*[@text=存SEO靠我储]" save_element = get_element(driver, save_btn)# 蓝牙 按钮 lanya_btn = By.XPATH, "//*[@SEO靠我text=蓝牙]" lanya_element = get_element(driver, lanya_btn)# 通过scroll来进行滑动操作 driver.scrSEO靠我oll(save_element, lanya_element)time.sleep(3)driver.quit() 5、drag_and_drop拖拽事件从一个元素滑动到另外一个元SEO靠我素的位置, 同时也能实现将一个元素拖动另一个元素当。
driver.drag_and_drop(source_element, target_element)
source_element 表示的是被拖动SEO靠我的元素对象
target_element 表示的是目标元素对象
import timefrom appium import webdriver from selenium.webdriveSEO靠我r.common.by import Byfrom utils import get_element, input_textdes_cap = { "platformName" : "SEO靠我android" , #表示的是android 或者ios "platformVersion" : "5.1.1", #表示的是平台系统的版本号 "deviceNameSEO靠我" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) "appPackage" : "com.android.settings", #表示app的包SEO靠我名 "appActivity" : ".Settings", #表示的是app的界面名 "resetKeyboard": True, # 重置设备的输入键盘 SEO靠我 "unicodeKeyboard": True # 采用unicode编码输入 ####"".module_main.activity.MainActivity"" SEO靠我 } #定义字典参数driver = webdriver.Remote("http://localhost:4723/wd/hub", des_cap) # 存储 sSEO靠我ave_btn = By.XPATH, "//*[@text=存储]" # 更多 more_btn = By.XPATH, "//*[@text=更多]"# 通过拖动来SEO靠我实现滑屏操作 driver.drag_and_drop(get_element(driver, save_btn), get_element(driver, more_btn))timSEO靠我e.sleep(3)driver.quit()实现步骤:
1、创建TouchAction对象
2、调用手势方法
3、调用perform() 执行操作
实现步骤:
action = TSEO靠我ouchAction(driver) # 创建建手势对象
action.tap(element=None, x=None, y=None, count=1) # 调用轻敲手势方法,传入的是一个元素对象或SEO靠我者是一个坐标点
count表示的是轻敲的次数, 默认值为1.
action.perform() # 调用perform()执行轻敲操作
import timefrom appium import webdrSEO靠我iver from appium.webdriver.common.touch_action import TouchAction from selenium.webdSEO靠我river.common.by import Byfrom utils import get_element, input_textdes_cap = { "platformName"SEO靠我 : "android" , #表示的是android 或者ios "platformVersion" : "5.1.1", #表示的是平台系统的版本号 "deviceSEO靠我Name" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) "appPackage" : "com.android.settings", #表示aSEO靠我pp的包名 "appActivity" : ".Settings", #表示的是app的界面名 "resetKeyboard": True, # 重置设备的输入键盘 SEO靠我 "unicodeKeyboard": True # 采用unicode编码输入 ####"".module_main.activity.MainActivity"" SEO靠我 } #定义字典参数driver = webdriver.Remote("http://localhost:4723/wd/hub", des_cap)wlan_btn = By.XPATHSEO靠我, "//*[@text=WLAN]" wlan_element = get_element(driver, wlan_btn)# 调用轻敲手势操作 TouchActiSEO靠我on(driver).tap(x=457, y=487).perform() # action = TouchAction(driver) # 创建手势对象 # # 调SEO靠我用手势方法 # action.tap(wlan_element) # # 调用perform()执行 # action.perform() SEO靠我 time.sleep(3) driver.quit()按下:
press(element, x, y)
抬起:
release()
TouchAction(driveSEO靠我r).press(x=477, y=489).release().perform()
按下和抬起可以结合起来使用,达到点击的效果
import timefrom appium import webdrivSEO靠我er from appium.webdriver.common.touch_action import TouchAction from selenium.webdriSEO靠我ver.common.by import Byfrom utils import get_element, input_textdes_cap = { "platformName" :SEO靠我 "android" , #表示的是android 或者ios "platformVersion" : "5.1.1", #表示的是平台系统的版本号 "deviceNaSEO靠我me" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) "appPackage" : "com.android.settings", #表示appSEO靠我的包名 "appActivity" : ".Settings", #表示的是app的界面名 "resetKeyboard": True, # 重置设备的输入键盘 SEO靠我 "unicodeKeyboard": True # 采用unicode编码输入 ####"".module_main.activity.MainActivity"" SEO靠我 } #定义字典参数driver = webdriver.Remote("http://localhost:4723/wd/hub", des_cap)# 调用按钮手势操作 ToSEO靠我uchAction(driver).press(x=477, y=489).perform() # 等待2S time.sleep(2) TouchAcSEO靠我tion(driver).press(x=477, y=489).release().perform()time.sleep(3) driver.quit()模拟SEO靠我手指等待。 wait(ms=0) ms表示的是毫秒数
TouchAction(driver).press(x=650, y=650).wait(5000).release().perform()
impoSEO靠我rt timefrom appium import webdriver from appium.webdriver.common.touch_action import TouchAcSEO靠我tion from selenium.webdriver.common.by import Byfrom utils import get_element, input_textdesSEO靠我_cap = { "platformName" : "android" , #表示的是android 或者ios "platformVersion" : "5.1.1"SEO靠我, #表示的是平台系统的版本号 "deviceName" : "****", #表示的是设备的ID名称(如果只有一个设备可以用****来代替) "appPackage"SEO靠我 : "com.android.settings", #表示app的包名 "appActivity" : ".Settings", #表示的是app的界面名 "reseSEO靠我tKeyboard": True, # 重置设备的输入键盘 "unicodeKeyboard": True # 采用unicode编码输入 ####"".module_SEO靠我main.activity.MainActivity"" } #定义字典参数driver = webdriver.Remote("http://localhost:4723/wd/huSEO靠我b", des_cap)# 找到wlan元素 wlan_btn = By.XPATH, "//*[@text=WLAN]" get_element(driver, wlSEO靠我an_btn).click() time.sleep(2) # 通过等待及按下和抬起实现长按的操作 TouchAction(driver).press(SEO靠我x=467, y=569).wait(3000).release().perform()time.sleep(3)driver.quit()long_press(element, x=NoSEO靠我ne, y=None, duration=1000)
element表示的是元素对象
x, y表示的是坐标点
duration表示的是长按的时长,单位是毫秒
TouchAction(driver).long_SEO靠我press(x=650, y=650, duration=2000).perform()
import timefrom appium import webdriver from appSEO靠我ium.webdriver.common.touch_action import TouchAction from selenium.webdriver.common.by imporSEO靠我t Byfrom utils import get_element, input_textdes_cap = { "platformName" : "android" , #表示的是aSEO靠我ndroid 或者ios "platformVersion" : "5.1.1", #表示的是平台系统的版本号 "deviceName" : "****", #表示的是SEO靠我设备的ID名称(如果只有一个设备可以用****来代替) "appPackage" : "com.android.settings", #表示app的包名 "appActSEO靠我ivity" : ".Settings", #表示的是app的界面名 "resetKeyboard": True, # 重置设备的输入键盘 "unicodeKeyboaSEO靠我rd": True # 采用unicode编码输入 ####"".module_main.activity.MainActivity"" } #定义字典参数driverSEO靠我 = webdriver.Remote("http://localhost:4723/wd/hub", des_cap)# 找到wlan元素 wlan_btn = By.XPATH, SEO靠我"//*[@text=WLAN]" get_element(driver, wlan_btn).click() time.sleep(2) # 通过等待SEO靠我及按下和抬起实现长按的操作 # TouchAction(driver).press(x=467, y=569).wait(3000).release().perform() SEO靠我 TouchAction(driver).long_press(x=467, y=569, duration=3000).perform() time.sleep(3)driverSEO靠我.quit()网站备案号:浙ICP备17034767号-2