Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
1.简介
今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录。
2.业务模块封装
因为现在各种APP的层出不群,各式各样的。但是其大多数都有注册、登录。为了不要使小伙伴卡在入门处,所以宏哥在这里仅仅是给你打一个样,俗话说:师傅领进门修行靠个人。剩下的就靠童鞋们自己实现和学习了
2.1登录页面业务逻辑模块
思路:
1、首先定义封装一个登录类的视图
2、然后继承公共类的定位方法,定位账号和密码的输入框
3、在类中,定义登录APP的方法
4、在类中,定义登录APP检查账户的方法
5、在类中,定义检查登录APP登录状态的方法
2.1.1loginView.py

2.1.2参考代码
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-11-18
@author: 北京-宏哥 QQ交流群:707699217
Project:Appium自动化测试框架综合实践 - 代码实现
'''
# 3.导入模块
import logging
from kyb_testProject.common.common_fun import Common,NoSuchElementException
from kyb_testProject.common.desired_caps import appium_desired
from selenium.webdriver.common.by import Byclass LoginView(Common):username_type=(By.ID,'com.tal.kaoyan:id/login_email_edittext')password_type=(By.ID,'com.tal.kaoyan:id/login_password_edittext')loginBtn=(By.ID,'com.tal.kaoyan:id/login_login_btn')tip_commit=(By.ID,'com.tal.kaoyan:id/tip_commit')button_mysefl=(By.ID,'com.tal.kaoyan:id/mainactivity_button_mysefl')username=(By.ID,'com.tal.kaoyan:id/activity_usercenter_username')RightButton=(By.ID,'com.tal.kaoyan:id/myapptitle_RightButton_textview')logoutBtn=(By.ID,'com.tal.kaoyan:id/setting_logout_text')def login_action(self,username,password):self.check_cancelBtn()self.check_skipBtn()logging.info('============login_action==============')logging.info('username is:%s' %username)self.driver.find_element(*self.username_type).send_keys(username)logging.info('password is:%s'%password)self.driver.find_element(*self.password_type).send_keys(password)logging.info('click loginBtn')self.driver.find_element(*self.loginBtn).click()logging.info('login finished!')def check_account_alert(self):logging.info('=====check_account_alert====')try:element=self.driver.find_element(*self.tip_commit)except NoSuchElementException:passelse:logging.info('close tip_commit')element.click()def check_loginStatus(self):logging.info('====check_loginStatus======')self.check_market_ad()self.check_account_alert()try:self.driver.find_element(*self.button_mysefl).click()self.driver.find_element(*self.username)except NoSuchElementException:logging.error('login Fail!')self.getScreenShot('login fail')return Falseelse:logging.info('login success!')self.logout_action()return Truedef logout_action(self):logging.info('=====logout_action======')self.driver.find_element(*self.RightButton).click()self.driver.find_element(*self.logoutBtn).click()self.driver.find_element(*self.tip_commit).click()if __name__ == '__main__':driver=appium_desired()l=LoginView(driver)l.login_action('bjhg2019','bjhg2019')# l.login_action('bjhg2018','34454')l.check_loginStatus()
2.2注册页面业务逻辑封装
思路:
1、首先定义封装一个注册类的视图
2、然后继承公共类的定位方法,定位账号和密码等其他的输入框
3、在类中,定义注册APP的注册状态的方法
4、在类中,定义添加注册APP信息的方法
2.2.1registerView.py

2.2.2参考代码
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-11-18
@author: 北京-宏哥 QQ交流群:707699217
Project:Appium自动化测试框架综合实践 - 代码实现
'''
# 3.导入模块
import logging,random
from kyb_testProject.common.desired_caps import appium_desired
from kyb_testProject.common.common_fun import Common,By,NoSuchElementExceptionclass RegisterView(Common):register_text=(By.ID,'com.tal.kaoyan:id/login_register_text')#头像设置相关元素userheader=(By.ID,'com.tal.kaoyan:id/activity_register_userheader')item_image=(By.ID,'com.tal.kaoyan:id/item_image')save=(By.ID,'com.tal.kaoyan:id/save')#用户名密码邮箱相关元素register_username= (By.ID, 'com.tal.kaoyan:id/activity_register_username_edittext')register_password= (By.ID, 'com.tal.kaoyan:id/activity_register_password_edittext')register_email= (By.ID, 'com.tal.kaoyan:id/activity_register_email_edittext')register_btn= (By.ID, 'com.tal.kaoyan:id/activity_register_register_btn')#完善资料界面元素perfectinfomation_school = (By.ID, 'com.tal.kaoyan:id/perfectinfomation_edit_school_name')perfectinfomation_major = (By.ID, 'com.tal.kaoyan:id/activity_perfectinfomation_major')perfectinfomation_goBtn = (By.ID, 'com.tal.kaoyan:id/activity_perfectinfomation_goBtn')#院校相关元素forum_title = (By.ID, 'com.tal.kaoyan:id/more_forum_title')university = (By.ID, 'com.tal.kaoyan:id/university_search_item_name')#专业相关元素major_subject_title = (By.ID, 'com.tal.kaoyan:id/major_subject_title')major_group_title = (By.ID, 'com.tal.kaoyan:id/major_group_title')major_search_item_name = (By.ID, 'com.tal.kaoyan:id/major_search_item_name')#用户中心相关元素button_mysefl = (By.ID, 'com.tal.kaoyan:id/mainactivity_button_mysefl')username = (By.ID, 'com.tal.kaoyan:id/activity_usercenter_username')def register_action(self,register_username,register_password,register_email):self.check_cancelBtn()self.check_skipBtn()logging.info('======register_action======')self.driver.find_element(*self.register_text).click()logging.info('set userhead')self.driver.find_element(*self.userheader).click()self.driver.find_elements(*self.item_image)[10].click()self.driver.find_element(*self.save).click()logging.info('username is %s'%register_username)self.driver.find_element(*self.register_username).send_keys(register_username)logging.info('password is %s' % register_password)self.driver.find_element(*self.register_password).send_keys(register_password)logging.info('email is %s' % register_email)self.driver.find_element(*self.register_email).send_keys(register_email)self.driver.find_element(*self.register_btn).click()try:self.driver.find_element(*self.perfectinfomation_school)except NoSuchElementException:logging.error('register fail !')self.getScreenShot('register fail')return Falseelse:self.add_register_info()if self.check_register_status():return Trueelse:return Falsedef add_register_info(self):logging.info('======add_register_info=====')logging.info('select school...')self.driver.find_element(*self.perfectinfomation_school).click()self.find_elements(*self.forum_title)[1].click()self.find_elements(*self.university)[1].click()logging.info('select major...')self.driver.find_element(*self.perfectinfomation_major).click()self.driver.find_elements(*self.major_subject_title)[1].click()self.driver.find_elements(*self.major_group_title)[2].click()self.driver.find_elements(*self.major_search_item_name)[1].click()self.driver.find_element(*self.perfectinfomation_goBtn).click()def check_register_status(self):logging.info('=====check_register_status=====')self.check_market_ad()try:self.driver.find_element(*self.button_mysefl).click()self.driver.find_element(*self.username)except NoSuchElementException:logging.error('register fail!')self.getScreenShot('register fail')return Falseelse:logging.info('register success!')return Trueif __name__ == '__main__':driver=appium_desired()register=RegisterView(driver)username = 'bjhg2019' + 'fly' + str(random.randint(1000, 9000))password = 'bjhg2019' + str(random.randint(1000, 9000))email = 'bjhg' + str(random.randint(1000, 9000)) + '@163.com'register.register_action(username,password,email)
3.小结
好了,今天由于时间的关系就分享就到这里,宏哥这里着重实现了两个业务模块,其他业务模块你可以照猫画虎的就可以轻易地实现了。感谢您耐心的阅读!
相关文章:
Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录。 2.业务模块封装 因为现在各种APP的层出不群,各式各样的。但是其大多数都有注册、登录。为…...
防止跨站脚本攻击XSS之Antisamy
目录 一、什么是跨站脚本攻击(XSS) 二、通常有哪些解决方案 三、常见的XSS攻击例子有哪些 3.1 存储型XSS攻击(黑产恶意截流,跳转不法网站) 3.2反射型XSS攻击: 四、什么是跨站请求伪造? 五…...
Python爬虫实战案例——王者荣耀皮肤抓取
大家好,我是你们的老朋友——南枫,今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩,直接上代码: 导入我们需要使用到的,也是唯一用到的库: 我们要抓取皮肤其…...
PyTorch计算机视觉实战:目标检测、图像处理与深度学习
本书基于真实数据集,全面系统地阐述现代计算机视觉实用技术、方法和实践,涵盖50多个计算机视觉问题。全书分为四部分:一部分介绍神经网络和PyTorch的基础知识,以及如何使用PyTorch构建并训练神经网络,包括输入数据缩放…...
4D 生物打印:将时间维度融入,打造个性化动态组织
4D 生物打印技术将时间维度融入 3D 生物打印,赋予打印出的结构动态变化的能力,使其更接近于真实组织和器官的特性。要实现这一目标,需要使用智能生物材料和智能设计策略。 智能生物材料 目前用于 4D 生物打印的智能生物材料主要包括形状记忆…...
银行清算业务功能测试解析
银行清算业务是指银行间通过账户或有关货币当地清算系统,在办理结算和支付中用以清讫双边或多边债权债务的过程和方法。按地域划分,清算业务可分为国内联行清算和国际清算。常见的清算模式包括实时全额清算、净额批量清算、大额资金转账系统及小额定时清…...
CVE-2024-6387漏洞预警:尽快升级OpenSSH
OpenSSH维护者发布了安全更新,其中包含一个严重的安全漏洞,该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion,CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件(也…...
学习整理在php中使用PHPExcel读取excel表列数大于Z时读取不到的解决方案
php读取excel列数大于Z时读取不到 背景解决方案关键代码 背景 表格数据超过26列, 也就是在Z列之前没有AA列及以后的情况, 测试一直都没有问题,超过,就会获取不到数据了 解决方案 private function getExcelData(){//获取excel文…...
python sklearn机械学习-数据预处理
🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…...
搜索引擎常用语法
引号 (" "): 用双引号将词组括起来,搜索引擎将返回包含完全相同短语的结果。 示例:"人工智能发展趋势" 减号 (-): 在关键词前加上减号可以排除包含特定词语的结果。 示例:人工智能 -机器学习(排除包含 “机器…...
华为智能驾驶方案剖析
华为ADS智驾方案始终坚持激光雷达毫米波雷达摄像头的多传感器融合路线,行业降本压力下硬件配置从超配逐步转向贴合实际需求,带动整体硬件成本下降。 1)单车传感器数量呈现下降趋势,包括激光雷达从3个减配至1个、毫米波雷达从6R减配至3R、摄像…...
DDR3(一)
目录 1 SDRAM1.1 同步动态随机存储器1.2 位宽1.3 SDRAM结构1.4 SDRAM引脚图 2 SDRAM操作指令2.1 读写指令2.2 刷新和预充电2.3 配置模式寄存器2.4 读/写突发2.5 数据屏蔽 SDRAM是DDR3的基础,在学习DDR3之前,我们先来学习一下SDRAM的相关知识。 1 SDRAM …...
Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章
Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章 在微服务架构中,服务发现是实现服务间通信的关键机制。Eureka作为Netflix开源的服务发现框架,与Spring Cloud Bus的集成,提供了一种动态、响应式的服务治理解决方案。本文…...
Kafka入门到精通(三)-Kafka
Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动…...
高校教师教学质量评估系统-计算机毕业设计源码03344
摘要 在高等教育中,教学质量是培养优秀人才的关键。为了提高教学质量,高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架,旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架,具…...
币界网讯,预计以太坊现货 ETF 将于 7 月中旬推出
刚刚 ETF Store 总裁 Nate Geraci 在 X (前Twitter)平台上宣布,备受数字货币市场期待的SEC以太坊现货 ETF提案,将于7 月中旬通过美国证券交易委员会(SEC)批准。Nate Geraci透露修订后的 S-1 文件将于 7 月 …...
【FFmpeg】avio_open2函数
【FFmpeg】avio_open2函数 1.avio_open21.1 创建URLContext(ffurl_open_whitelist)1.1.1 创建URLContext(ffurl_alloc)1.1.1.1 查找合适的protocol(url_find_protocol)1.1.1.2 为查找到的URLProtocol创建UR…...
技术成神之路:设计模式(二)建造者模式
1.定义 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…...
基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
爬虫scrapy库精简使用大全
一、基本命令 创建项目 scrpay startproject myapp创建爬虫文件 scrapy genspider spider_name "https://www.baidu.com"运行爬虫文件 scrapy crawl spider_name一、使用代理ip 打开中间件middlewares.py,增加以下代码 class ProxyMiddleware:def process…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
