App自动化测试笔记(十一):综合案例

news2024/12/23 17:41:37

短信案例

需求

在《短信》应用中,进入发送短信页面,在姓名和内容栏中,输入对应的数据,并点击发送。
包名界面名:com.android.mms/.ui.ConversationList
发送短信页面标识:resource-id,com.android.mms:id/action_compose_new
接收者标识:resource-id,com.android.mms:id/recipients_editor
内容标识:resource-id,com.android.mms:id/embedded_text_editor
发送按钮标识:content-desc,发送

数据
[18888888888, hello]
[13333333333, abc]
要求
使用 pytest框架 + po模式 +数据参数化
 

结构

-base
--base_action.py
--base_driver.py
-page
--page.py
--display_page.py
--more.py
--network.py
--setting_page.py
-scripts
--test_setting.py
 

代码

base_action.py代码

from selenium.webdriver.support.wait import WebDriverWait
 
class Base():
    def __init__(self,driver):
        self.driver = driver
    def find_element(self,loc,time = 5 ,poll = 1):
        ele = WebDriverWait(self.driver,timeout=time,poll_frequency=poll).until(lambda x:x.find_element(loc[0],loc[1]))
        return ele
 
    def find_elements(self,loc,time = 5 ,poll = 1):
        ele = WebDriverWait(self.driver,timeout=time,poll_frequency=poll).until(lambda x:x.find_elements(loc[0],loc[1]))
        return ele
    def base_click(self,loc):
        self.find_element(loc).click()
    def base_send_keys(self,loc,value):
        self.find_element(loc).send_keys(value)

base_driver.py代码
from appium import webdriver
 
def init_driver():
    desired_caps = dict()
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '5.1'
    desired_caps['deviceName'] = '192.168.56.101:5555'
    desired_caps['appPackage'] = 'com.android.settings'
    desired_caps['appActivity'] = '.Settings'
    return webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

page.py代码

from page.display_page import Display
from page.more import More
from page.network import Network
from page.setting_page import Setting
 
class Page():
    def __init__(self,driver):
        self.driver = driver
    def setting(self):
        return Setting(self.driver)
    def display(self):
        return Display(self.driver)
    def more(self):
        return More(self.driver)
    def network(self):
        return Network(self.driver)

display_page.py代码
from base.base_action import Base
from selenium.webdriver.common.by import By
 
class Display(Base):
    # driver.find_element_by_id("com.android.settings:id/search").click()
    look_up_click = By.ID, "com.android.settings:id/search"
    # self.driver.find_element_by_id("android:id/search_src_text").send_keys("hello")
    send_keys_element = By.ID, "android:id/search_src_text"
    def page_lookup(self):
        self.base_click(self.look_up_click)
    def page_send_keys(self):
        self.base_send_keys(self.send_keys_element,"hello")

more.py代码
from base.base_action import Base
from selenium.webdriver.common.by import By
 
class More(Base):
    # self.driver.find_element_by_xpath("//*[@text = '移动网络']").click()
    mobile_network_click = By.XPATH, "//*[@text = '移动网络']"
    # self.driver.find_element_by_xpath("//*[@text = '首选网络类型']").click()
 
    def page_mobile_network(self):
        # self.driver.find_element_by_xpath("//*[@text = '移动网络']").click()
        self.base_click(self.mobile_network_click)

network.py代码

from base.base_action import Base
from selenium.webdriver.common.by import By
 
class Network(Base):
    network_type_click = By.XPATH, "//*[@text = '首选网络类型']"
    # self.driver.find_element_by_xpath("//*[@text = '3G']").click()
    type_3G_click = By.XPATH, "//*[@text = '3G']"
    # self.driver.find_element_by_xpath("//*[@text = '2G']").click()
    type_2G_click = By.XPATH, "//*[@text = '2G']"
    def page_network_type(self):
        # self.driver.find_element_by_xpath("//*[@text = '首选网络类型']").click()
        self.base_click(self.network_type_click)
    def page_type_3G(self):
        # self.driver.find_element_by_xpath("//*[@text = '3G']").click()
        self.base_click(self.type_3G_click)
    def page_type_2G(self):
        # self.driver.find_element_by_xpath("//*[@text = '2G']").click()
        self.base_click(self.type_2G_click)

setting_page.py代码
from base.base_action import Base
from selenium.webdriver.common.by import By
 
class Setting(Base):
    # driver.find_element_by_xpath(BY.XPATH,"//*[@text = '显示']").click()
    display_element = By.XPATH, "//*[@text = '显示']"
    # self.driver.find_element_by_xpath("//*[@text = '更多']").click()
    more_click = By.XPATH, "//*[@text = '更多']"
    def page_display(self):
        self.base_click(self.display_element)
    def page_more(self):
        # self.driver.find_element_by_xpath("//*[@text = '更多']").click()
        self.base_click(self.more_click)

test_setting.py代码

import os, sys
sys.path.append(os.getcwd())
from page.page import Page
# from page.network import Network
# from page.setting_page import Setting
from base.base_driver import init_driver
# from page.display_page import Display
# from page.more import More
 
"""
更多-移动网络-首选网络类型-点击2g
更多-移动网络-首选网络类型-点击3g
显示-搜索按钮-输入hello-点击返回
"""
class TestSetting:
    def setup(self):
        self.driver = init_driver()
        # self.display = Display(self.driver)
        # self.more = More(self.driver)
        # self.setting = Setting(self.driver)
        # self.network = Network(self.driver)
        self.page = Page(self.driver)
    def teardown(self):
        self.driver.quit()
    def test_setting01(self):
        self.page.setting().page_more()
        self.page.more().page_mobile_network()
        self.page.network().page_network_type()
        self.page.network().page_type_3G()
    def test_setting02(self):
        self.page.setting().page_more()
        self.page.more().page_mobile_network()
        self.page.network().page_network_type()
        self.page.network().page_type_2G()
    def test_setting03(self):
        self.page.setting().page_display()
        self.page.display().page_lookup()
        self.page.display().page_send_keys()


通讯录案例

需求

在《通讯录》应用中,进入添加联系人页面,在姓名和电话栏中,输入对应的数据。
包名界面名:com.android.contacts/.activities.PeopleActivity
添加联系人页面标识:resource-id,com.android.contacts:id/floating_action_button
姓名标识:text,姓名
电话标识:text,电话
因为appium每次启动应用时都会"重置应用",才会出现本地保存,若不想重置,可直接在启动参数加一行代码
desired_caps['noReset'] = True 即可
数据
[zhangsan, 18888888888]
[lisi, 13333333333]
[wangwu, 17777777777]
要求
使用 pytest框架 + po模式 + 数据参数化。


结构

-base
--base_action.py
--base_driver.py
-page
--page.py
--page_contact_list.py
--page_new_contact.py
-scripts
--test_add_contact.py

代码

base_action.py代码

from selenium.webdriver.support.wait import WebDriverWait
 
class BaseAction:
    # 初始化driver
    def __init__(self,driver):
        self.driver = driver
 
    # 创建基础查找元素的方法
    def find_ele(self,loc,time = 5, poll = 1):
        ele = WebDriverWait(self.driver,timeout = time,poll_frequency=poll).until(lambda x:x.find_element(loc[0],loc[1]))
        return ele
 
    # 创建基础的点击动作
    def base_click(self,loc):
        self.find_ele(loc).click()
 
    # 创建基础的输入文本方法
    def base_send_keys(self,loc,text):
        self.find_ele(loc).send_keys(text)

base_driver.py代码
from appium import webdriver
# 将driver用方法封装
def init_driver():
    desired_caps = dict()
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '5.1'
    desired_caps['deviceName'] = '192.168.56.101:5555'
    desired_caps['appPackage'] = 'com.android.contacts'
    desired_caps['appActivity'] = '.activities.PeopleActivity'
    # 不重置程序
    desired_caps['noReset'] = True
    return webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

page.py代码
from page.page_contact_list import PageContactList
from page.page_new_contact import PageNewContact
 
class Page():
    def __init__(self,driver):
        self.driver = driver
    # 创建PageContactList对象入口
    def creat_contect_list(self):
        return PageContactList(self.driver)
 
    # 创建PageNewContact对象入口
    def creat_new_contect(self):
        return PageNewContact(self.driver)

page_contact_list.py代码
from selenium.webdriver.common.by import By
from base.base_action import BaseAction
 
class PageContactList(BaseAction):
    # 点击新增联系人元素
    ele_add_contact = By.ID,"com.android.contacts:id/floating_action_button"
    # 点击新增联系人
    def page_add_click(self):
        self.base_click(self.ele_add_contact)

page_new_contact.py代码

from selenium.webdriver.common.by import By
from base.base_action import BaseAction
 
class PageNewContact(BaseAction):
    # 定位输入姓名元素
    ele_send_out_name = By.XPATH,"//*[@text = '姓名']"
    # 定位输入电话元素
    ele_send_out_phone = By.XPATH,"//*[@text = '电话']"
    # 定位返回元素
    ele_click_back = By.CLASS_NAME,"android.widget.ImageButton"
    
    # 页面输入姓名操作
    def page_send_out_name(self,text):
        self.base_send_keys(self.ele_send_out_name,text)
    
    # 页面输入手机号码操作
    def page_send_out_phone(self,text):
        self.base_send_keys(self.ele_send_out_phone,text)
    
    # 页面点击返回操作
    def page_click_back(self):
        self.base_click(self.ele_click_back)

test_add_contact.py代码
import os, sys
sys.path.append(os.getcwd())
import time
import pytest
from base.base_driver import init_driver
from page.page import Page
 
class TestCase():
    
    def setup(self):
        self.driver = init_driver()
        self.page = Page(self.driver)
    
    def teardown(self):
        time.sleep(3)
        self.driver.quit()
    
    # 参数化+业务流程
    @pytest.mark.parametrize(("name","phone"),[("zhangsan","18888888888"),("lisi", "13333333333"),("wangwu","17777777777")])
    def test_add_contact(self,name,phone):
        self.page.creat_contect_list().page_add_click()
        self.page.creat_new_contect().page_send_out_name(name)
        self.page.creat_new_contect().page_send_out_phone(phone)
        self.page.creat_new_contect().page_click_back()

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:开心螺蛳粉】自提!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述

在这里插入图片描述

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

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

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

相关文章

乐得瑞 1C to 2C快充线:引领充电数据线新潮流,高效快充解决接口难题

随着科技的不断进步,数据线的接口种类也日渐繁多,但在早些时候,三合一和二合一的数据线因其独特的设计而备受欢迎。这类数据线通常采用USB-A口作为输入端,并集成了Micro USB、Lightning以及USB-C三种接口,满足了当时市…

【二】【算法分析与设计】编程练习

数字三角形 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 KiKi学习了循环,BoBo…

2024年AI辅助研发趋势深度分析

随着人工智能(AI)技术的飞速发展,其在各个行业领域中的应用也日益广泛。特别是在研发领域,AI已经成为变革的先锋,极大地推动了科技进步的步伐。本文将从技术进展、行业应用案例、面临的挑战与机遇、未来趋势预测、法规…

JavaScript实现小球移动(二)

这次采用了封装函数的方法&#xff0c;将小球向左向右移动封装在同一个函数内。 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

接雨水(leetcode hot100)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

‘ jupyter ‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

安装anaconda后&#xff0c;在 Dos黑窗口 运行 jupyter notebook 的两个问题 原因&#xff1a;没配置环境变量 解决方法&#xff1a; 在 系统环境变量Path 中 添加两个地址 这里以anaconda安装在 D:\anaconda\install 下为例 &#xff08;根据个人安装具体位置而定&#xff…

Centos7.9安装glibc2.18后回滚到glibc2.17

对glibc的操作非常危险&#xff0c;如果您对Linux操作系统的操作仅限于查看别人的资料来解决问题的话&#xff0c;我还是比较真诚的劝退你了。只所以还是写下这篇博文&#xff0c;一是为了记录自己排错的过程&#xff0c;二是更正目前网络中一些不太正确的博文&#xff0c;防止…

史上最全AP/mAP通用代码实现(yolov5 txt版本)-下

提示&#xff1a;通用map指标框架代码介绍&#xff0c;直接使用yolov5数据格式&#xff0c;实现论文map指标计算代码解读 文章目录 前言该版本是直接使用yolo数据格式实现map计算&#xff0c;集成txt转json格式内容。 一、map模块整体认识二、map计算应用代码解读三、通用map计…

指针进阶(4)看一下这些与指针有关的题你都会做吗?

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

JVM-垃圾收集器G1

G1垃圾回收器 概述&#xff1a; 是一款面向服务器的垃圾收集器,主要针对配备多个处理器及大容量内存的机器. 以极高效率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.G1保留了年轻代和老年代的概念&#xff0c;但不再是物理隔阂了&#xff0c;它们都是&#xff08;可以不连…

供应链管理系统(SCM):得供应链得天下不是空话。

2023-08-26 15:51贝格前端工场 Hi&#xff0c;我是贝格前端工场&#xff0c;优化升级各类管理系统的界面和体验&#xff0c;是我们核心业务之一&#xff0c;欢迎老铁们评论点赞互动&#xff0c;有需求可以私信我们 一、供应链对于企业的重要性 供应链对企业经营的重要性不可…

在外包公司搞了2年,出来技术都没了...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了2年的的功能…

O2O:Sample Efficient Offline-to-Online Reinforcement Learning

IEEE TKDE 2024 paper Introduction O2O存在策略探索受限以及分布偏移问题&#xff0c;进而导致在线微调阶段样本效率低。文章提出OEMA算法首先使用离线数据训练乐观的探索策略&#xff0c;然后提出基于元学习的优化方法&#xff0c;减少分布偏移并提高O2O的适应过程。 Meth…

Java零基础 - 数组的定义和声明

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

React-Redux中actions

一、同步actions 1.概念 说明&#xff1a;在reducers的同步修改方法中添加action对象参数&#xff0c;在调用actionCreater的时候传递参数&#xff0c;数会被传递到action对象payload属性上。 2.reducers对象 说明&#xff1a;声明函数同时接受参数 const counterStorecre…

DDoS和CC攻击的原理

目前最常见的网络攻击方式就是CC攻击和DDoS攻击这两种&#xff0c;很多互联网企业服务器遭到攻击后接入我们德迅云安全高防时会问到&#xff0c;什么是CC攻击&#xff0c;什么又是DDoS攻击&#xff0c;这两个有什么区别的&#xff0c;其实清楚它们的攻击原理&#xff0c;也就知…

mybatis中使用<choose><when><otherwise>标签实现根据条件查询不同sql

项目场景&#xff1a; 有时候业务层未进行条件处理那么在sql怎么操作呢,这里我是将c#版本的代码改成Java版本的时候出现的问题,因为c#没有业务层 更多操作是在sql中实现的 也就是业务层和编写sql地方一起写了,当我按照c#代码改Java到写sql时发现<if>标签不能实现我们业务…

3.8 动态规划 背包问题

一.01背包 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 代码随想录 (programmercarl.com) 携带研究材料: 时间限制&#xff1a;5.000S 空间限制&#xff1a;128MB 题目描述: 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会…

OpenCascade源码剖析:Handle类

Handle其实就是智能指针的上古版本&#xff0c;了解一点C11的应该对shared_ptr非常熟悉&#xff0c;那么你就把Handle当做shared_ptr来理解就没有任何问题了。 不过OCCT的Handles是侵入式的实现&#xff0c;前面讲过Standard_Transient类提供了引用计数机制&#xff0c;这个就…

新质生产力助春播春管:佳格天地连续第5年上线大数据平台,服务春季生产

随着“惊蛰”节气过去,全国各地陆续掀起春播春管热潮。今年的政府工作报告中指出,2023年我国粮食产量1.39万亿斤,再创新高。2024年要坚持不懈抓好“三农”工作,扎实推进乡村全面振兴,粮食产量预期目标1.3万亿斤以上。 粮食产量预期目标的明确为一年农事生产指引了方向。同时,新…