1-appium-初识
appium-初识
前置条件:
请熟悉adb 相关命令 :https://editor.csdn.net/md/?articleId=111087992
请熟悉app测试相关基础知识:https://blog.csdn.net/weixin_42914706/article/details/111087869
本机安装pycharm +appium工具
1,pycharm版本提供
链接:https://pan.baidu.com/s/1P_ZT1KtuxT7xGCiHWRq2iA
提取码:vb73
2,appium安装-可置界官网下载安装
http://appium.io/
配置包安装
在pycharm中setting中安装依赖包 Python-Appium-Clint*
appium运行原理
自动化脚本 ----------------> appium服务:地址;127.0.0.1端口:4723 ---------->手机端口:bootstrap.jar开启服务调用端口4723-------->等待appium和自动化脚本返回,appium 声明手机驱动对象:webdriver.remote 服务地址,启动参数------->调用uiautomator自动化工具执行具体command
代码:
# -*-coding:utf-8 -*-
from appium import webdriver
from time import sleep
import os#声明一个字典
desired_caps = {}
#系统
desired_caps["platformName"] = "Android"
#版本
desired_caps["platformVersion"] = "8.0.0"
#设备名-此为我本地链接设备
desired_caps["deviceName"] = "27QGL20828000064"
#包名
desired_caps["appPackage"] = "com.taobao.taobao"
#启动名
desired_caps["appActivity"] = "com.taobao.tao.TBMainActivity"
# desired_caps["noReset"] = "true"
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
#关闭app
sleep(20)
driver.close_app()
sleep(10)
driver.start_activity('com.huawei.camera','com.huawei.camera')
sleep(10)
#关闭手机驱动对象
driver.quit()
注释:
1,http://127.0.0.1:4723/wd/hub ===》appium地址加端口,wd理解为webdriver缩写
2,关闭app -driver.close_app();
关闭手机驱动对象 -driver.quit() 关闭apk后在启动其他apk会报错,所以我们一般用close_app
调试报错:
1,appium运行无法发现error running command: Error: Could not find 'adb.exe
a:C:\android-sdk-windows\tools目录下并没有adb.exe这个可执行文件。并且当打开Eclipse时,有关Android的插件会报错
b:**改系统变量为C:\android-sdk-windows\platform-tools
c:C:\android-sdk-windows\platform-tools目录下的adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll 这三个文件拷到你C:\android-sdk-windows\tools目录下
appium基本命令
1、apk的安装
driver.install_app(dir_file[file])
2、apk的卸载
driver.remove_app(dir_file[file])
3、判断apk是否存在
driver.is_app_installed(apk_name)
4、push文件及信心
Data = str(base64.b64encode('push 1234567'.encode('utf-8')),'utf-8')driver.push_file('/sdcard/test.txt',Data)
注释:
str对数据进行解码,新建test文件,并把‘pus’ 信息写入文件,如果未指定sd下面文件夹,则随机生成tmp文件存储’pus;数据。
5、appium获取文件数据
pull_data = driver.pull_file('/sdcard/test.txt')
print(pull_data)
print(str(base64.b64decode(pull_data),'utf-8'))
#输出-直接输出为字节乱码,需解码后转换成字符型 utf8 格式。G:\Django_project\venv\Scripts\python.exe I:/appuim+python+uiautomatorviewer/test.py
cHVzaCAxMjM0NTY3
push 1234567
6、获取当前屏幕内元素结构
def get_current_screen():#打开设置界面-driver.start_activity('com.android.settings', 'com.android.settings.HWSettings')#获取元素信息current_pag_data = driver.page_sourcefor i in ('电池','battery'):if i in current_pag_data:print(i+' 在设置界面')else:print(i+' 不在设置界面,需重新拉起')```注释:启动apk后,driver.page_source获取当前页元素
1,通过页面信息可判断是否在当前页7、封装__init__driver```python
*init__Driver.py*
# -*-coding:utf-8 -*-
from appium import webdriver
def __init_driver():# 声明一个字典desired_caps = {}# 系统desired_caps["platformName"] = "Android"# 版本desired_caps["platformVersion"] = "8.0.0"# 设备名-此为我本地链接设备desired_caps["deviceName"] = "27QGL20828000064"# 包名desired_caps["appPackage"] = "com.huawei.android.launcher"# 启动名desired_caps["appActivity"] = "com.huawei.android.launcher.unihome.UniHomeLauncher"# desired_caps["noReset"] = "true"driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)return driver
进行调用
*test.py*def launch_screen():#返回手机launch界面#返回launch界面driver =init_driver.init_Driver.__init_driver()driver.quit()if __name__ == '__main__':launch_screen()
注释:launch_screen函数内__init_driver传给driver,否则加上下面driver.quit() 会导致多次调用并初始化
尝试用adb 命令与driver封装命令
def push(tag,pc_path,phone_path,driver =None):if tag ==0:os.system('adb push {} {}'.format(pc_path,phone_path))elif tag ==1:with open(pc_path,'r') as f:Data = str(base64.b64encode(f.read().encode('utf-8')),'utf-8')print(Data)time.sleep(5)driver.push_file(phone_path,Data)if __name__ == '__main__':driver = init_driver.init_Driver.__init_driver()# push(tag=0,pc_path='./test.py ',phone_path=' /sdcard/',driver=None)push(tag=1,pc_path='./1.txt ',phone_path='/sdcard/1.txt',driver=driver)
元素定位
前置条件:安装uiautomatorviewer
不知道怎么安装可以学习:https://blog.csdn.net/weixin_42914706/article/details/111087910
注:元素的基本定位基于当前界面元素定位
1、单个元素定位和一组元素的定位
from init_driver.init_Driver import __init_driverif __name__ == '__main__':driver = __init_driver()try :# #通过xpath ====》启动apkdriver.find_element_by_xpath("//android.widget.TextView[@text='应用市场']").click()time.sleep(4)#通过class_name 点击操作driver.find_element_by_id("com.huawei.appmarket:id/lantern").click()time.sleep(2)#通过find_element_by_class_name 点击返回driver.find_element_by_class_name("android.widget.LinearLayout").click()ele_list =driver.find_element_by_id("com.huawei.appmarket:id/lantern")for i in ele_list:print(i.text)except Exception as e :print(e)finally:driver.quit()
注释:1>分别通过ind_element_by_xpath、find_element_by_id、find_element_by_class_name进而click。
2>xpath
常用属性定位id、class、text ==>//*[contains(@text,‘要查询的内容’)]-能查询
3>定位一组元素时,elements 后面多s可将其赋值给元素再形成list内进行选择操作
ele_list =driver.find_elements_by_id("com.huawei.appmarket:id/lantern")for i in els_list:if i.text =='排行':i.click()s此方法来处理无法进行上述方法操作的步骤
2、元素的等待
1>显示等待
from init_driver.init_Driver import __init_driver
from selenium.webdriver.support.ui import WebDriverWaitif __name__ == '__main__':driver = __init_driver()try :# #通过xpath ====》启动apkprint(time.strftime("%H:%M:%S",time.localtime()))WebDriverWait(driver, timeout=10, poll_frequency=1).until(lambda x: x.find_element_by_xpath("//android.widget.TextView[@text='应用市场']"))driver.find_element_by_xpath("//android.widget.TextView[@text='应用市场']").click()#显示等待WebDriverWait(driver,timeout =90,poll_frequency =1).until(lambda x:x.find_element_by_id("com.huawei.appmarket:id/lantern"))except Exception as e :print(e)finally:print(time.strftime("%H:%M:%S", time.localtime()))driver.quit()
注释:WebDriverWait 是selenium 内的方法
WebDriverWait 穿参timeout 超时时间,poll_frequency操作频率,lambda参数传参driver方法2、隐式等待```python
implicitly_wait()
注释:隐式等待,相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。隐式等待是等页面加载,而不是元素加载!!!(隐式等待就是针对页面的,显式等待是针对元素的隐式等待使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,如果Element或数组没有马上被发现的话。
默认设置是0。
一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。
3、强制等待
time.sleep(time)
案例分析介绍:
场景:通过点击搜索-输入查询信息-确认有无结果-遍历所有内容-点击返回-到主页
from init_driver.init_Driver import __init_driver
from selenium.webdriver.support.ui import WebDriverWaitif __name__ == '__main__':driver = __init_driver()try :# #通过xpath ====》启动apkprint(time.strftime("%H:%M:%S",time.localtime()))WebDriverWait(driver, timeout=10, poll_frequency=1).until(lambda x: x.find_element_by_xpath("//android.widget.TextView[@text='应用市场']"))driver.find_element_by_xpath("//android.widget.TextView[@text='应用市场']").click()time.sleep(5)#点击搜索driver.find_element_by_id('com.huawei.appmarket:id/fixed_search_view').click()time.sleep(1)#连续输入列表内容并返回for i in ['qq','王者荣耀','hyxd']:input_ele = driver.find_element_by_id("com.huawei.appmarket:id/search_src_text")input_ele.clear()#清空表格input_ele.send_keys(i)#获取联想下拉菜单text信息research_data = driver.find_element_by_id('com.huawei.appmarket:id/item_name').textif research_data :print(research_data)print(' 有结果')else:print(' 无结果')# #点击返回time.sleep(2)driver.find_element_by_id('com.huawei.appmarket:id/back_button').click()except Exception as e :print(e)finally:print(time.strftime("%H:%M:%S", time.localtime()))driver.quit()
注释:
1,通过显示等待点击应用图标进入等待进入首页
2,通过id 搜索定位-点击进入搜索
3,循环列表进入循环查询-单次(send输入查询信息-通过id定位确认下拉列表是否出现-清空搜索栏)其中element 与elements区别
获取元素属性值
1,方法get_attribute()
data = driver.find_element_by_id('com.huawei.appmarket:id/lanternName').get_attribute('text')
print(data)
输出:
分类
注释:
1,get_attribute('text') 中可以是其他属性
1>get_attribute(#) #为元素属性值
2>value =‘name’ 返回是content-desc 或text值,而text 返回的只是text属性值
3>Value ='classname’或resourceid 分别为各自属性值,但API》=18才支持
获取元素所在坐标、包、启动名
1,find_element_by_id(##).location
data = driver.find_element_by_id('com.huawei.appmarket:id/lanternName').location
print(data)
输出:
{'x': 67, 'y': 681}
注释:
1,通过对返回信息处理,可得到坐标后期可以用在滑动和坐标相关处理中
print(driver.current_package,' \n',driver.current_activity)
注释:
1,打印出包名、启动名
滑动坐标
1,swipe两点之间的滑动
driver.swipe(50,600,600,600,5000)`注释:起始x,y 到结束x,y 加时间
2,scroll 从一个元素滑动到另一个元素
start_ele=driver.find_element_by_xpath("//android.widget.TextView[@text='华为视频']")
end_ele=driver.find_element_by_xpath("//android.widget.TextView[@text='智能证件照']")
driver.scroll(start_ele,end_ele)
3,drag拖拽事件-第一个元素到第二个元素,并替代第二个元素
tart_ele=driver.find_element_by_xpath("//android.widget.TextView[@text='华为视频']")
end_ele=driver.find_element_by_xpath("//android.widget.TextView[@text='音乐']")
driver.drag_and_drop(start_ele,end_ele)
注意:应用场景、拖动图标,替换图标,扩展屏等
应用至于后台,在拉起,模拟热启动background_app
1,置于后台5秒后启动-模拟启动
driver.background_app(5)
其他一些用法
1,获取手机时间
driver.device_time
2,获取手机分辨率
driver.get_window_size()
注释:1,滑动坐标范围
3,返送一些keyevent值
driver.keyevent(25)#音量键
常用按键值可阅读之前整理adb干货资料
https://editor.csdn.net/md/?articleId=111087992
4,操作手机通知栏
driver.open_notifications()
1,打开通知栏,可操作系统常用自带管理,飞行模式,联网,截图等
要操作点击横幅
简单需求-打开通知栏-点击下拉-选择飞航模式
driver.open_notifications()
time.sleep(2)
driver.find_element_by_id('com.android.systemui:id/expand_indicator').click()
time.sleep(1)
driver.find_element_by_xpath("//android.widget.Switch[@text='关闭' and @content-desc='飞行模式']").click()
5,获取手机当前网络network_connection
print(driver.network_connection)
输出:
1
注释:1,大家可通过查看network_connection 方法进行查看
由此得知此设备网络设置为了飞行模式
可以通过set_network_connection
driver.set_network_connection(1)#设置飞行模式
注释:对设备网络进行设置,但有时会出现root报错信息,为没权限操作,大家
可以通过其他方法规避,达到测试效果
6,截图get_screenshot_as_file
current_apth = os.path.join(os.getcwd(),'1.png')
driver.get_screenshot_as_file(current_apth)
测试中注意事项:
1,server 启动参数增加两个参数配置
desired_caps[‘unicodeKeyboard’] =True
desired_caps[‘resetKeyboard’] =True
对文本框send数据时,避免报错
基础知识已经整理了,下面会整理些appium的高级操作及调试代码中遇到一些坑!!!希望对大家有帮助
补充一些appium 高级操作TouchAction 及用例的基本举例
https://blog.csdn.net/weixin_42914706/article/details/112000840
1-appium-初识相关推荐
- Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)...
简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...
- 软件测试 | APP测试 —— Appium 自动化测试框架的初识与学习要领
随着移动终端的普及,手机App应用越来越多,也越来越重要.而作为测试袁的我们也要与时俱进,努力学习手机App的相关测试,本章将介绍手机自动化测试框架Appium.那究竟什么是 Appium呢? 接下来 ...
- python+appium判断元素存在_python自动化测试应用--Appium元素篇
1.1概要 本篇将对和界面元素相关的内容做讲解,比如,查找元素的几种常见方法,还将介绍如何查看app界面上的元素去做定位,最后还将新手经常遇到的问题做个简单的回答. 1.2 查找app界面元素的工具 ...
- appium的python教程_移动App Appium自动化测试教程Appium+Python 【2018年新】_IT教程网...
资源名称:移动App Appium自动化测试教程Appium+Python [2018年新] 资源目录: 第一章:App自动化测试概述 1-1 Appium自动化课程简介 1-2 课程大纲 1-3 移 ...
- pythonapp自动化_移动App Appium自动化测试教程Appium+Python 【2018年新】
资源介绍 资源名称:移动App Appium自动化测试教程Appium+Python [2018年新] 资源目录: 第一章:App自动化测试概述 1-1 Appium自动化课程简介 1-2 课程大纲 ...
- 自动化测试之Appium
文章目录 问题归整 1. [华为手机如何打开开发者权限](https://jingyan.baidu.com/article/49ad8bce96e1955835d8fa57.html) 2. 报错, ...
- Robot Framework 自动化测试框架核心指南-初识Robot Framework(学习笔记2)
初识Robot Framework 1.1如何创建一个自动化测试项目 1.1.2 创建测试套件 1.1.3 创建测试用例 1.2 Robot Framework基础关键字 1.2.1 如何搜索Robo ...
- Appium 并发测试基于unitest
前言: 在回归测试阶段,UI测试,兼容测试是测试的必要步骤.UI自动化的本身是比较冗余的测试,但是换个角度思考,UI自动化同时连接多台设备,那么在回归测试时,在同一个脚本下产生的测试结果是非常有价值的 ...
- day3----编码-集合-深浅copy-文件操作-函数初识
day3----编码-集合-深浅copy-文件操作-函数初识 本文档主要内容: 一 编码 二 集合 三 深浅copy 四 文件操作 五 函数初识 首先,我们来看看两个字符串的比较 打开cmd,进入do ...
- Appium的Java封装
文章出处 http://blog.csdn.net/niubitianping/article/details/52612211 一.为什么需要封装? 封装的本意就是为了方便.简洁. 二.Androi ...
最新文章
- iterm2 主题_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器
- 如何学好3D游戏引擎编程《转自3D游戏引擎网》
- Qt元对象QMetaObject的indexOfSlot等函数获取类方法注意问题
- ASP.NET Core Web API中使用Swagger
- pandas处理excel文件和csv文件
- UBIFS - UBI File-System
- hive相关操作语句
- oracle mysql认证考试流程_Oacle认证考试:Oracle移植到MySQL注意事项
- 软件签名不一致是什么意思
- Linux下安装jre
- 十分钟django后台 simpleui -含自定义后台首页
- android 指纹 分发,移动终端及基于指纹识别来实现操作的方法和系统与流程
- 计算机格式化后能恢复数据吗,格式化数据恢复 电脑格式化了还能恢复吗?原来找回如此简单!...
- 华为CIO陶景文:华为数字化转型实践(附下载)
- 架构 | 如何从零开始搭建高性能直播平台?
- 基于JAVA的个人博客论坛系统的设计与实现参考【数据库设计、源码、开题报告】
- randint和randrange的区别
- 【Python】Python基本概念、print()输出函数、标准数据类型、type()函数与isinstance()函数、数据类型转换、变量与变量名的命名规则、注释
- C# Interlocked类的事例
- 有感于李开复演讲(2)