• 详解如何在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库

    同时,我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取

    软件测试视频教程观看处:

    B站最用心的自动化测试教程,从入门到进阶(全600集),通俗易懂,2023最新版,学完即就业!学不会我立马退出测试界!

    二、测试

    1、打开usb选项

    2、电脑与模拟器建立连接 通过adb命令

    检查电脑和模拟器是否建立连接 adb devices

    3、没有连接 adb connect  127.0.0.1:62001

    三、pycharm代码启动app.apk

    1、线性代码

    下载考研帮,在电脑端下载后拉到模拟器即可使用

    1. #用python代码启动考研帮
    2. #提前告知代码要测试哪个app,哪个设备
    3. #设备信息
    4. from appium import webdriver
    5. info={
    6. #测试的平台Androidios
    7. #info['platformName']='Android'
    8. "platformName":"Android",
    9. #测试的版本号设置-关于-版本号
    10. "platformVersion":"7.1.2",
    11. #设备名adbdevices
    12. "deviceName":"127.0.0.1:62001",
    13. #包名获取方式有很多种adbshelldumpsyswindowfindstrmCurrentFocu打开当前窗口的命令
    14. "appPackage":"com.tal.kaoyan",
    15. #应用名
    16. "appActivity":"com.tal.kaoyan.ui.activity.SplashActivity",
    17. #"允许不重置"
    18. "noRest":False
    19. }
    20. #启动考研帮
    21. #web自动化seleniumwebdriver
    22. #app自动化appiumwebdriver
    23. driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',info)
    24. #重点打开appiumdestop,start
    25. #清空设置-应用-缓存
    26. #appiumsdk中的工具tools,uiautomator.bat
    27. #测试登录
    28. #取消点击
    29. #driver.find_element_by_id('android:id/button2').click()
    30. #跳过点击
    31. #driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
    32. #用户协议点击同意
    33. #每次打开界面都不一样,不写代码了
    34. #无法播放此视频点击确定
    35. driver.find_element_by_id('android:id/button1').click()
    36. #密码登录
    37. driver.find_element_by_id('com.tal.kaoyan:id/loginRegistorcodeAndPassword').click()
    38. #输入用户名,输入密码,点击登录按钮
    39. driver.find_element_by_id('com.tal.kaoyan:id/loginEmailEdittext').send_keys('')
    40. driver.find_element_by_id('com.tal.kaoyan:id/loginPasswordEdittext').send_keys('')
    41. #已阅读并同意,点击单选按钮
    42. driver.find_element_by_id('android.widget.CheckBox').click()
    43. #点击登录
    44. #driver.find_element_by_id('com.tal.kaoyan:id/loginLoginBtn').click()
    45. #xpath写法
    46. driver.find_element_by_xpath("//*[@text='登录']").click()

    2、优化代码

    优化思路:

    登录脚本  优化  配置信息放在yaml文件
    启动时,如果说没启动,启动报错,可以用日志文件记录起来,封装日志
    登录,有些app会弹窗,这些方法可以封装成公共方法 公共文件
    登录脚本,关键字驱动,把常用的方法封装成一个文件
    测试登录,测试不同的情况,可以用unittest,pytest;+ddt测试数据,可以放在测试文件中
    生成测试报告 unittest,pytest
    把框架放在jenkins,实现开发提交代码,就自动运行自动化框架,把测试报告发出来
    搭建框架容易,难点在编程基础

    完整优化代码

    2.1)base_page.py

    1. #基类,封装的公共方法都在这里
    2. class BasePage:
    3. def __init__(self,driver):
    4. self.driver= driver
    5. #元素定位
    6. def locator(self,loc):
    7. return self.driver.find_element(*loc)
    8. #输入
    9. # self.driver.find_element_by_id('').sendkey('')
    10. def input_(self,loc,txt):
    11. self.locator(loc).send_keys(txt)
    12. # 点击
    13. def click(self,loc):
    14. self.locator(loc).click()

    2.2)common_fun.py

    1. import logging
    2. from selenium.common.exceptions import NoSuchElementException
    3. import logging
    4. from selenium.webdriver.common.by import By
    5. from config.desired_caps import appium_desired
    6. from config.base_page import BasePage
    7. class Common(BasePage):
    8. cancel = (By.ID,'android:id/button2')
    9. skip=(By.ID,'com.tal.kaoyan:id/tv_skip')
    10. def check_cancel(self):
    11. logging.info("=============开始检查取消按钮==============")
    12. try:
    13. cancel=self.driver.find_element(*self.cancel)
    14. except NoSuchElementException:
    15. logging.info("取消按钮没有找到")
    16. else:
    17. logging.info("点击取消")
    18. cancel.click()
    19. def check_skip(self):
    20. logging.info("=========开始检查跳过按钮============")
    21. try:
    22. skip = self.driver.find_element(*self.skip)
    23. except NoSuchElementException:
    24. logging.info("跳过按钮没有找到")
    25. else:
    26. logging.info("点击跳过")
    27. skip.click()
    28. #1、获取整个屏幕的大小size
    29. def size(self):
    30. # a=driver.get_window_size()['width']
    31. x=self.driver.get_window_size()['width']
    32. y=self.driver.get_window_size()['height']
    33. return x,y
    34. #向左划,宽10001000
    35. # driver.swipe(900,800,500,800,2000)
    36. def swipeLeft(self,t,n):
    37. lsize=self.driver.size()
    38. #900
    39. x1=lsize[0]*0.9
    40. y1=lsize[1]*0.5
    41. x2=lsize[0]*0.1
    42. for i in range(n):
    43. self.driver.swipe(x1,y1,x2,y1,t)

    2.3)cs_caps.yaml

    1. platformName: Android
    2. platformVersion: 7.1.2
    3. deviceName: 127.0.0.1:62001
    4. appPackage: com.tal.kaoyan
    5. appActivity: com.tal.kaoyan.ui.activity.SplashActivity
    6. noRest: False
    7. ip: 127.0.0.1
    8. port: 4723

    2.4)desired_caps.py

    1. import yaml
    2. from appium import webdriver
    3. from config.testLog import test_log
    4. log=test_log()
    5. # 要yaml文件的数据 找到yanl文件,可读
    6. def appium_desired():
    7. stream = open('../config/cs_caps.yaml', 'r')
    8. # 数据加载出来
    9. data = yaml.load(stream, Loader=yaml.FullLoader)
    10. # 字典是什么 元组是什么
    11. info = {}
    12. info['platformName'] = data['platformName']
    13. info['platformVersion'] = data['platformVersion']
    14. info['deviceName'] = data['deviceName']
    15. info['appPackage'] = data['appPackage']
    16. info['appActivity'] = data['appActivity']
    17. info['noRest'] = data['noRest']
    18. # info['ip']=data['ip']
    19. # info['port']=data['port']
    20. # driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', info)
    21. log.info('开始跑')
    22. driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', info)
    23. return driver
    24. if __name__ == '__main__':
    25. appium_desired()

    2.5)login_page.py

    1. from selenium.webdriver.common.by import By
    2. from config.common_fun import Common
    3. log=test_log()
    4. class LoginPage(Common):
    5. user=(By.ID, 'com.tal.kaoyan:id/login_email_edittext')
    6. pwd=(By.ID, 'com.tal.kaoyan:id/login_password_edittext')
    7. button = (By.ID, 'com.tal.kaoyan:id/login_login_btn')
    8. def login(self, username,password):
    9. #点击取消
    10. self.check_cancel()
    11. #点击跳过
    12. self.check_skip()
    13. #输入用户名,输入密码,点击登录
    14. log.info('请输入用户名%s'%username)
    15. self.input_(self,user,username)
    16. log.info('请输入密码%s' % password)
    17. self.input_(self, pwd, password)
    18. self.click(self.button)
    19. #要测试各种情况,测正常的情况,异常的情况,先进性unittest永历官吏框架
    20. #结合ddt,想要把测试数据放在Yaml中,放在代码
    21. if __name__ == '__main__':
    22. driver = appium_desired()
    23. lp=LoginPage(driver)
    24. lp.login('qwerty2664','qwerty123')

    2.6)testLog.py

    1. #日志
    2. import logging
    3. def test_kog():
    4. logger=logging.getLogger()
    5. logger.setLevel(logging.INFO)
    6. if not logger.handlers:
    7. #输出到控制台
    8. sh=logging.StreamHandler()
    9. logger.addHandler(sh)
    10. #设置格式
    11. fomartor=logging.Formatter(fmt='%(asctime)s%(filename)s%(levelname)s%()')
    12. sh.setFormatter(fomartor)
    13. #输出到文本
    14. fh =logging.FileHandler('../logs/runlog.log',encoding='utf-8')
    15. logger.addHandler(fh)
    16. fh.setFormatter(fomartor)
    17. return logger

    四、总结

    PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!

    ☑ 240集-零基础到精通全套视频课程
    ☑ [课件+源码]-完整配套的教程
    ☑ 18套-测试实战项目源码
    ☑ 37套-测试工具软件包
    ☑ 268道-真实面试题
    ☑ 200个模板-面试简历模板、测试方案模板、软件测试报告模板、测试分析模版、测试计划模板、性能测试报告、性能测试报告、性能测试脚本用例模板(信息完整)

    这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

  • 相关阅读:
    【Spring】AOP实现原理
    Ubuntu 16下Linaro 交叉编译器的安装
    MySQL数据库中text类型的数据使用Mybatis自动生成之后,返回值为空
    Linux进程概念和控制(必备知识)
    MySQL日志管理、备份与恢复
    善用浏览器的一些调试技巧
    显示器配置信息删除
    自身免疫疾病诊断原料厂家——博迈伦
    1397:简单算术表达式求值
    CentOS 7 虚拟机开机后的优化操作
  • 原文地址:https://blog.csdn.net/HUA6911/article/details/133353472