APP自动化简单理解(在python中实现简单的app自动化框架)
一、app自动化环境搭建
1、安装jdk及配置jdk的环境变量
app底层是c语言,应用层是java,所以需要jdk
2、安装SDK,配置android SDK环境
3、安装模拟器
4、下载安装Appium工具
01、appium客户端 appium destop 服务器
02、命令行安装:pip.exe install Appium-Python-Client
apium python库
二、测试
1、打开usb选项
2、电脑与模拟器建立连接 通过adb命令
检查电脑和模拟器是否建立连接 adb devices
3、没有连接 adb connect 127.0.0.1:62001
三、pycharm代码启动app.apk
1、线性代码
下载考研帮,在电脑端下载后拉到模拟器即可使用
#用python代码启动考研帮
#提前告知代码要测试哪个app,哪个设备
#设备信息
from appium import webdriverinfo={
#测试的平台Androidios
#info['platformName']='Android'
"platformName":"Android",
#测试的版本号设置-关于-版本号
"platformVersion":"7.1.2",
#设备名adbdevices
"deviceName":"127.0.0.1:62001",
#包名获取方式有很多种adbshelldumpsyswindowfindstrmCurrentFocu打开当前窗口的命令
"appPackage":"com.tal.kaoyan",
#应用名
"appActivity":"com.tal.kaoyan.ui.activity.SplashActivity",
#"允许不重置"
"noRest":False
}
#启动考研帮
#web自动化seleniumwebdriver
#app自动化appiumwebdriver
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',info)
#重点打开appiumdestop,start#清空设置-应用-缓存
#appiumsdk中的工具tools,uiautomator.bat
#测试登录
#取消点击
#driver.find_element_by_id('android:id/button2').click()
#跳过点击
#driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
#用户协议点击同意
#每次打开界面都不一样,不写代码了
#无法播放此视频点击确定
driver.find_element_by_id('android:id/button1').click()
#密码登录
driver.find_element_by_id('com.tal.kaoyan:id/loginRegistorcodeAndPassword').click()
#输入用户名,输入密码,点击登录按钮
driver.find_element_by_id('com.tal.kaoyan:id/loginEmailEdittext').send_keys('')
driver.find_element_by_id('com.tal.kaoyan:id/loginPasswordEdittext').send_keys('')
#已阅读并同意,点击单选按钮
driver.find_element_by_id('android.widget.CheckBox').click()
#点击登录
#driver.find_element_by_id('com.tal.kaoyan:id/loginLoginBtn').click()
#xpath写法
driver.find_element_by_xpath("//*[@text='登录']").click()
2、优化代码
优化思路:
- 登录脚本 优化 配置信息放在yaml文件
- 启动时,如果说没启动,启动报错,可以用日志文件记录起来,封装日志
- 登录,有些app会弹窗,这些方法可以封装成公共方法 公共文件
- 登录脚本,关键字驱动,把常用的方法封装成一个文件
- 测试登录,测试不同的情况,可以用unittest,pytest;+ddt测试数据,可以放在测试文件中
- 生成测试报告 unittest,pytest
- 把框架放在jenkins,实现开发提交代码,就自动运行自动化框架,把测试报告发出来
搭建框架容易,难点在编程基础
完整优化代码
2.1)base_page.py
#基类,封装的公共方法都在这里class BasePage:def __init__(self,driver):self.driver= driver#元素定位def locator(self,loc):return self.driver.find_element(*loc)#输入# self.driver.find_element_by_id('').sendkey('')def input_(self,loc,txt):self.locator(loc).send_keys(txt)# 点击def click(self,loc):self.locator(loc).click()
2.2)common_fun.py
import logging
from selenium.common.exceptions import NoSuchElementException
import logging
from selenium.webdriver.common.by import By
from config.desired_caps import appium_desiredfrom config.base_page import BasePage
class Common(BasePage):cancel = (By.ID,'android:id/button2')skip=(By.ID,'com.tal.kaoyan:id/tv_skip')def check_cancel(self):logging.info("=============开始检查取消按钮==============")try:cancel=self.driver.find_element(*self.cancel)except NoSuchElementException:logging.info("取消按钮没有找到")else:logging.info("点击取消")cancel.click()def check_skip(self):logging.info("=========开始检查跳过按钮============")try:skip = self.driver.find_element(*self.skip)except NoSuchElementException:logging.info("跳过按钮没有找到")else:logging.info("点击跳过")skip.click()#1、获取整个屏幕的大小sizedef size(self):# a=driver.get_window_size()['width']x=self.driver.get_window_size()['width']y=self.driver.get_window_size()['height']return x,y#向左划,宽1000 高1000# driver.swipe(900,800,500,800,2000)def swipeLeft(self,t,n):lsize=self.driver.size()#900x1=lsize[0]*0.9y1=lsize[1]*0.5x2=lsize[0]*0.1for i in range(n):self.driver.swipe(x1,y1,x2,y1,t)
2.3)cs_caps.yaml
platformName: Android
platformVersion: 7.1.2
deviceName: 127.0.0.1:62001
appPackage: com.tal.kaoyan
appActivity: com.tal.kaoyan.ui.activity.SplashActivity
noRest: False
ip: 127.0.0.1
port: 4723
2.4)desired_caps.py
import yaml
from appium import webdriver
from config.testLog import test_log
log=test_log()
# 要yaml文件的数据 找到yanl文件,可读
def appium_desired():stream = open('../config/cs_caps.yaml', 'r')# 数据加载出来data = yaml.load(stream, Loader=yaml.FullLoader)# 字典是什么 元组是什么info = {}info['platformName'] = data['platformName']info['platformVersion'] = data['platformVersion']info['deviceName'] = data['deviceName']info['appPackage'] = data['appPackage']info['appActivity'] = data['appActivity']info['noRest'] = data['noRest']# info['ip']=data['ip']# info['port']=data['port']# driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', info)log.info('开始跑')driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', info)return driver
if __name__ == '__main__':appium_desired()
2.5)login_page.py
from selenium.webdriver.common.by import By
from config.common_fun import Commonlog=test_log()
class LoginPage(Common):user=(By.ID, 'com.tal.kaoyan:id/login_email_edittext')pwd=(By.ID, 'com.tal.kaoyan:id/login_password_edittext')button = (By.ID, 'com.tal.kaoyan:id/login_login_btn')def login(self, username,password):#点击取消self.check_cancel()#点击跳过self.check_skip()#输入用户名,输入密码,点击登录log.info('请输入用户名%s'%username)self.input_(self,user,username)log.info('请输入密码%s' % password)self.input_(self, pwd, password)self.click(self.button)#要测试各种情况,测正常的情况,异常的情况,先进性unittest永历官吏框架
#结合ddt,想要把测试数据放在Yaml中,放在代码
if __name__ == '__main__':driver = appium_desired()lp=LoginPage(driver)lp.login('qwerty2664','qwerty123')
2.6)testLog.py
#日志
import logging
def test_kog():logger=logging.getLogger()logger.setLevel(logging.INFO)if not logger.handlers:#输出到控制台sh=logging.StreamHandler()logger.addHandler(sh)#设置格式fomartor=logging.Formatter(fmt='%(asctime)s%(filename)s%(levelname)s%()')sh.setFormatter(fomartor)#输出到文本fh =logging.FileHandler('../logs/runlog.log',encoding='utf-8')logger.addHandler(fh)fh.setFormatter(fomartor)return logger
APP自动化简单理解(在python中实现简单的app自动化框架)相关推荐
- python使用spark_如何在Python中编写简单代码,并且速度超越Spark?
全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...
- python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?
全文共 3482字,预计学习时长 7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选 ...
- Python中yield简单用法
Python中yield简单用法 你或许知道带有yield的函数在Python中被称之为generator,那何为 generator? 我们暂时抛开generator,先从一个常见编程题目开始,循序 ...
- hid python uhf_简单的读写Python中的USB HID设备?
我有一个相当简单的USB HID设备,我一直在试图弄清楚如何读取和写入使用Python.我已经能够使用PyWinUSB从它读取,但是当我尝试写入它时,问题就出现了.试图写入它会使事情爆炸.简单的读写P ...
- 五分钟理解yield在python中的简单用法,让你不再迷惑
很多同学无论是在学习python还是使用python的过程中,都会遇到yield关键字,这个让人头大的问题,今天,就给大家分享一下我自学yield的心路历程 基本概念: (1)在 Python 中,使 ...
- 怎么用python画简单的图-python中简单易学的绘图:用turtle画太极图
为什么想画太极图呢?因为我儿子不知道是看了哪本书还是哪个电视,竟然特地打印出一张太极图要挂在大门口,我赶紧说祖宗这挂在门外,别人看见了还以为咱家出什么事了,你喜欢就挂自己卧室门口吧,于是这张图就成了他 ...
- redis基础入门及Python中的简单使用
1.什么是Redis? Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ...
- python简单绘图代码-python中简单易学的绘图:用turtle画太极图
为什么想画太极图呢?因为我儿子不知道是看了哪本书还是哪个电视,竟然特地打印出一张太极图要挂在大门口,我赶紧说祖宗这挂在门外,别人看见了还以为咱家出什么事了,你喜欢就挂自己卧室门口吧,于是这张图就成了他 ...
- python接口自动化(九)--python中字典和json的区别(详解)
简介 这篇文章的由来是由于上一篇发送post请求的接口时候,参数传字典(dict)和json的缘故,因为python中,json和dict非常类似,都是key-value的形式,为啥还要这么传参,在群 ...
- python字典api_python接口自动化(九)--python中字典和json的区别(详解)
简介 这篇文章的由来是由于上一篇发送post请求的接口时候,参数传字典(dict)和json的缘故,因为python中,json和dict非常类似,都是key-value的形式,为啥还要这么传参,在群 ...
最新文章
- php use as是什么意思,use关键字在PHP中的几种用法
- scala函数的定义语法说明
- ACM:动态规划,01背包问题
- hadoop中两种上传文件方式
- POI增加 数据验证 下拉
- 字符数组,字符串、数字转化
- make 怎么降级_Ubuntu 中将 make 的版本降低
- POJ1657 Bailian1657 Distance on Chessboard【基础】
- elementui 日期选择值格式
- 修改sqlserver编码为utf8_修改Matlab默认编码格式为UTF-8
- 洛谷 1315 观光公交——贪心
- 呼叫中心语音外呼营销系统软件成企业首选
- BZOJ 1951 古代猪文 鲁卡斯定理+费马小定理+中国剩余定理
- 算法设计与分析——动态规划
- 《非暴力沟通》读后感
- 网站出现502 bad getway
- Cortex-M3处理器系统框图
- 【学习求职必备】认真认识一下世界末日那年成立的“华为诺亚方舟实验室”...
- AMPL IDE语法整理
- Centos 5.4下的编译安装 xmms 和 mplayer