Python自动化测试PO模型封装过程详解


Posted in Python onJune 22, 2021

在自动化中, Selenium 自动化测试中有一个名字经常被提及 PageObject( 思想与面向对象的特征相 同 ) ,通常 PO 模型可以大大提高测试用例的维护效率  

优点:可重用,业务和对象分离,代码结构清晰,方便代码维护  

Python自动化测试PO模型封装过程详解 

核心要素

1. 在 PO 模式中抽离封装集成一个BasePage 类,该基类应该拥有一个只实现 webdriver 实例的属性

2. 每一个 page 都继承 BasePage ,通过 driver 来管理本 page 中元素,将 page 中的操作封装成一个个方法

3.TestCase 继承 unittest.Testcase 类,并依赖 page 类,从而实现相应的测试步骤  

PO 实现进入百度页面输入数据后进入下一个页面  

组织代码

Python自动化测试PO模型封装过程详解 

  1 :实现 BasePage

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains #鼠标操作
class BasePage():
    '''
    BasePage封装所有界面都公用的方法。
    例如driver,find_element等
    '''
    # 实例化BasePage类时,事先执行的__init__方法,该方法需要传递参数
    def __init__(self,driver,url):
        self.driver = driver
        self.base_url = url
    # 进入网址
    def get(self):
        self.driver.get(self.base_url)
    #元素定位,替代八大定位
    def get_element(self,*locator):
        return self.driver.find_element(*locator)
    #点击
    def left_click(self,*locator):
        ActionChains(self.driver).click(self.get_element(*locator)).perform()
    #输入
    def send_text(self,text,*locator):
        self.driver.find_element(*locator).send_keys(text)
    #清除
    def clear_text(self, *locator):
        self.driver.find_element(*locator).clear()
    # 表单切换
    def switch_iframe(self,*locator):
        self.driver.switch_to.frame(self.driver.find_element(*locator))
    #窗口切换
    def switch_window(self,n):
        self.driver.switch_to.window(self.driver.window_handles[n])

2 :实现 SearchPage

from selenium.webdriver.common.by import By
from base.base_page import BasePage
class SearchOne(BasePage):
    def __init__(self,driver,url):
        BasePage.__init__(self,driver,url)
    #进入百度
    def open_baidu(self):
        self.get()
    #输入数据
    def input_search_content(self,text):
        self.send_text(text,By.ID,"kw")
    # 点击按钮
    def click_baidu_search(self):
        self.left_click(By.ID, "su")
    def click_open_hao(self):
        self.left_click(By.XPATH,".//*[@id='1']/h3/a[1]")

3 :实现 TestCase

import unittest
from selenium import webdriver
from page.page_one import SearchOne
from page.page_two import SearchTwo
class BaiBu(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Firefox()
        cls.driver.implicitly_wait(10)
    def test001(self):
        url="http://www.baidu.com"
        s = SearchOne(self.driver,url)
        s.open_baidu()
        s.input_search_content("123")
        s.click_baidu_search()
        s.click_open_hao()
        self.driver.switch_to.window(self.driver.window_handles[1])
    def test002(self):
        s=SearchTwo(self.driver,"")
        s.open_baidu_map()
    def tearDown(self) -> None:
    #      self.driver.quit()
        pass
if __name__ == '__main__':
    unittest.main()

PO 模式的优点  

1:PO 提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰

2 :页面对象与用例分离,使得我们更好的复用对象

3 :可复用的页面方法代码会变得更加优化

4 :更加有效的命令方式使得我们更加清晰的知道方法所操作的 UI 元素

以上就是Python自动化测试PO模型封装的详细内容,更多关于Python自动化测试PO模型的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python如何实现守护进程的方法示例
Feb 08 Python
深入解答关于Python的11道基本面试题
Apr 01 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
python实现TF-IDF算法解析
Jan 02 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
Django框架模板介绍
Jan 15 Python
Django异步任务之Celery的基本使用
Mar 23 Python
Django框架创建项目的方法入门教程
Nov 04 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 #Python
Python答题卡识别并给出分数的实现代码
Python 中的单分派泛函数你真的了解吗
Jun 22 #Python
Python实现DBSCAN聚类算法并样例测试
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 #Python
利用Python第三方库实现预测NBA比赛结果
Django实现drf搜索过滤和排序过滤
You might like
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
React SSR样式及SEO的实践
2018/10/22 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
介绍Python中几个常用的类方法
2015/04/08 Python
详解Python import方法引入模块的实例
2017/08/02 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
python实现flappy bird小游戏
2018/12/24 Python
Numpy之reshape()使用详解
2019/12/26 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
别名指示符是什么
2012/10/08 面试题
应届生人事助理求职信
2013/11/09 职场文书
职工运动会邀请函
2014/01/19 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
社区志愿者活动总结
2014/06/26 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL