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-初识相关推荐

  1. Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)...

    ​简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...

  2. 软件测试 | APP测试 —— Appium 自动化测试框架的初识与学习要领

    随着移动终端的普及,手机App应用越来越多,也越来越重要.而作为测试袁的我们也要与时俱进,努力学习手机App的相关测试,本章将介绍手机自动化测试框架Appium.那究竟什么是 Appium呢? 接下来 ...

  3. python+appium判断元素存在_python自动化测试应用--Appium元素篇

    1.1概要 本篇将对和界面元素相关的内容做讲解,比如,查找元素的几种常见方法,还将介绍如何查看app界面上的元素去做定位,最后还将新手经常遇到的问题做个简单的回答. 1.2 查找app界面元素的工具 ...

  4. appium的python教程_移动App Appium自动化测试教程Appium+Python 【2018年新】_IT教程网...

    资源名称:移动App Appium自动化测试教程Appium+Python [2018年新] 资源目录: 第一章:App自动化测试概述 1-1 Appium自动化课程简介 1-2 课程大纲 1-3 移 ...

  5. pythonapp自动化_移动App Appium自动化测试教程Appium+Python 【2018年新】

    资源介绍 资源名称:移动App Appium自动化测试教程Appium+Python [2018年新] 资源目录: 第一章:App自动化测试概述 1-1 Appium自动化课程简介 1-2 课程大纲 ...

  6. 自动化测试之Appium

    文章目录 问题归整 1. [华为手机如何打开开发者权限](https://jingyan.baidu.com/article/49ad8bce96e1955835d8fa57.html) 2. 报错, ...

  7. Robot Framework 自动化测试框架核心指南-初识Robot Framework(学习笔记2)

    初识Robot Framework 1.1如何创建一个自动化测试项目 1.1.2 创建测试套件 1.1.3 创建测试用例 1.2 Robot Framework基础关键字 1.2.1 如何搜索Robo ...

  8. Appium 并发测试基于unitest

    前言: 在回归测试阶段,UI测试,兼容测试是测试的必要步骤.UI自动化的本身是比较冗余的测试,但是换个角度思考,UI自动化同时连接多台设备,那么在回归测试时,在同一个脚本下产生的测试结果是非常有价值的 ...

  9. day3----编码-集合-深浅copy-文件操作-函数初识

    day3----编码-集合-深浅copy-文件操作-函数初识 本文档主要内容: 一 编码 二 集合 三 深浅copy 四 文件操作 五 函数初识 首先,我们来看看两个字符串的比较 打开cmd,进入do ...

  10. Appium的Java封装

    文章出处 http://blog.csdn.net/niubitianping/article/details/52612211 一.为什么需要封装? 封装的本意就是为了方便.简洁. 二.Androi ...

最新文章

  1. iterm2 主题_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器
  2. 如何学好3D游戏引擎编程《转自3D游戏引擎网》
  3. Qt元对象QMetaObject的indexOfSlot等函数获取类方法注意问题
  4. ASP.NET Core Web API中使用Swagger
  5. pandas处理excel文件和csv文件
  6. UBIFS - UBI File-System
  7. hive相关操作语句
  8. oracle mysql认证考试流程_Oacle认证考试:Oracle移植到MySQL注意事项
  9. 软件签名不一致是什么意思
  10. Linux下安装jre
  11. 十分钟django后台 simpleui -含自定义后台首页
  12. android 指纹 分发,移动终端及基于指纹识别来实现操作的方法和系统与流程
  13. 计算机格式化后能恢复数据吗,格式化数据恢复 电脑格式化了还能恢复吗?原来找回如此简单!...
  14. 华为CIO陶景文:华为数字化转型实践(附下载)
  15. 架构 | 如何从零开始搭建高性能直播平台?
  16. 基于JAVA的个人博客论坛系统的设计与实现参考【数据库设计、源码、开题报告】
  17. randint和randrange的区别
  18. 【Python】Python基本概念、print()输出函数、标准数据类型、type()函数与isinstance()函数、数据类型转换、变量与变量名的命名规则、注释
  19. C# Interlocked类的事例
  20. 有感于李开复演讲(2)

热门文章

  1. 【产品】如何选择智能锁,智能锁安全吗?
  2. DNS泄漏测试的意义
  3. ros下启动robotiq-2f85电爪
  4. 一个大四程序猿的2020年剁手清单
  5. behance上流行的抽象炫酷资源,国外高级抽象炫酷素材合集分享
  6. Fast AutoAugment阅读笔记
  7. 内网服务器管理面板安装教程
  8. 磁力链接做成rar文件后怎么打开
  9. windows7经典开机音乐_重温经典 - AGM无线电贰厂九九按键功能机
  10. 趣图 | 搬砖人的现实