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.小结

    好了,今天由于时间的关系就分享就到这里,宏哥这里着重实现了两个业务模块,其他业务模块你可以照猫画虎的就可以轻易地实现了。感谢您耐心的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走在健康前沿:低GI食品认证与现代饮食的新篇章

随着现代社会节奏的加快,人们对健康饮食的追求也日益增强。在众多饮食理念中,低血糖生成指数(GI)食品凭借其对控制血糖和预防慢性疾病的潜在益处,逐渐成为健康饮食领域的明星。 GI的科学解码 GI,即食物血糖…

CTFHUB-SSRF-URL Bypass

开启题目 给出提示,url参数的值中必须包含有 http://notfound.ctfhub.com ,可以采用,也就是 HTTP 基本身份认证绕过 HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。 也就是…

AIGC文生图lora微调训练案例;SD-Train界面训练stable Diffusion lora模型

lora仓库(1000多个lora微调模型分享): https://lorastudio.co/models 1、命令代码方式:文生图lora微调训练案例 主要用huggingface相关包:peft、accelerate、diffusers 参考: https://huggingface.co/blo…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

PostgreSQL的pg_filedump工具

PostgreSQL的pg_filedump工具 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777pg_filedump 是一个工具&#x…

JAVA小知识30:JAVA多线程篇1,认识多线程与线程安全问题以及解决方案。(万字解析)

来 多线程,一个学起来挺难但是实际应用不难的一个知识点,甚至在很多情况下都不需要考虑,最多就是写测试类的时候模拟一下并发,现在我们就来讲讲基础的多线程知识。 一、线程和进程、并发与并行 1.1、线程和进程 线程&am…

Java学习十二—Java8特性之Optional类

一、简介 Java 8 引入了 Optional​ 类作为一种容器,可以用来显式地表示一个值存在或不存在。它解决了传统上可能会遇到的空指针异常问题,同时提供了一种更优雅的方式来处理可能为null的情况。 Java 8 中引入 Optional​ 类的背景可以从以下几个方面来理…

线程池概念的详解

前言👀~ 上一章我们介绍了什么是定时器以及如何去实现一个定时器,今天我们来讲解在多线程中同样很重要的一个内容线程池 线程池的出现 线程池概念 标准库中的线程池 工厂模式 newCacheThreadPool方法 newFixedThreadPool方法 ThreadPoolExecutor…

Akamai+Noname强强联合 | API安全再加强

最近,Akamai正式完成了对Noname Security的收购。本文我们将向大家介绍,经过本次收购后,Akamai在保护API安全性方面的后续计划和未来愿景。 Noname Security是市场上领先的API安全供应商之一,此次收购将让Akamai能更好地满足日益增…

图像基础知识

图像卷积 卷积(convolution)是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。 卷积概念是两个变量在某范围内相乘后求和的结果。图像处理中的卷积概念:数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积…

Java进阶学习|Day4.Java多线程,线程池

文章目录 了解多线程CPU进程(Process)线程多线程开发多线程优点 实现方式继承Thread类实现Runnable接口实现Callable接口 线程状态转换线程状态线程调度调整线程优先级线程睡眠线程等待线程让步线程加入线程唤醒 线程同步线程同步方式多线程间通信 线程池了解线程池定义常见接口…

可视化作品集(02):应急预警上的应用

应急预警领域是可视化大屏的一个重要应用场景,大屏展示的海量数据能为应急工作提供数据支持,本文带大家看看这类大屏的设计。 可视化大屏在应急和预警领域有广泛的应用, 1. 突发事件监测和应急响应: 可视化大屏可以实时展示突发…

顺序表的应用——通讯录的实现

前言 本篇博客将接着上次顺序表的内容进行拓展应用,这次来为大家介绍通讯录的实现,它就是基于顺序表的结构完成的;如果你对此感兴趣,请看下面的内容; 1.顺序表的应用 我们前面学过,顺序表可以存放任意类…

Java | Leetcode Java题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution {public String shortestPalindrome(String s) {int n s.length();int[] fail new int[n];Arrays.fill(fail, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s.charAt(j 1) ! s.charAt…

ASP.NET Core Blazor 5:Blazor表单和数据

本章将描述 Blazor 为处理 HTML 表单提供的特性&#xff0c;包括对数据验证的支持。 1 准备工作 继续使用上一章项目。   创建 Blazor/Forms 文件夹并添加一个名为 EmptyLayout.razor 的 Razor 组件。本章使用这个组件作为主要的布局。 inherits LayoutComponentBase<div …

论文 | PRCA: 通过可插拔奖励驱动的上下文适配器拟合用于检索问答的黑盒大语言模型

论文全称&#xff1a;PRCA: Fitting Black-Box Large Language Models for Retrieval Question Answering via Pluggable Reward-Driven Contextual Adapter 核心问题&#xff1a;如何在检索增强式问答&#xff08;ReQA&#xff09;任务中&#xff0c;利用大型语言模型&#xf…

【C语言入门】初识C语言:掌握编程的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言入门 &#x1f4d2;1. 选择…

单片机关键任务优先级的实现学习

与总体产品联调时&#xff0c;需要各个单机系统严格按照总体要求&#xff0c;进行数据输出&#xff0c;时间的偏差将出现系统异常&#xff0c;控制失败等不稳定情况产生&#xff0c;甚至影响到产品安全。 因此必须确保某些关键任务的优先执行。单片机任务优先级一般有两种方式…

[小试牛刀-习题练]《计算机组成原理》之指令系统

一、选择题 0.【指令-课本习题】某计算机按字节编址&#xff0c;指令字长固定且只有两种指令格式&#xff0c;其中三地址指令29条&#xff0c;二地址指令107条&#xff0c;每个地址字段为6位&#xff0c;则指令字长至少应该是&#xff08;A&#xff09; A.24位 B. 26位 C. 28位…

ctfshow web sql注入 web242--web249

web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…