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

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

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

核心要素

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

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

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

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

组织代码

 

1 :实现 BasePage

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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 元素

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

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

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

相关文章

数字化智慧工地管理云平台源码(人工智能、物联网)

​智慧工地优势:"智慧工地”将施工企业现场视频管理、建筑起重机械安全监控、现场从业人员管理、物料管理、进度管理、扬尘噪声监测等现场设备有机、高效、科学、规范的结合起来真正实现工程项目业务流与现场各类监控源数据流的有效结合与深度配合,…

【一周安全资讯1202】信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》;网络安全纳入注册会计师考试科目

要闻速览 1、信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》 2、南昌某高校学生个人信息在境外公开出售,警方抓获学校"内鬼" 3、网络安全纳入注册会计师考试科目 4、乌克兰情报机构网攻俄罗斯民航局,称俄民航业正…

swiper/vue 获取 swiper实例方法

在Vue3中使用swiper/vue&#xff0c;如何获取swiper的组件实例&#xff1f; 在项目中使用到 swiper/vue&#xff0c;想调用slideTo方法&#xff0c;发现通过refs的方法&#xff0c;拿不到swiper实例。 <template><swiperref"swiperRef"class"promoti…

合并一个文件夹下的多个txt文件,并对文本内容分列处理。

python 合并一个文件夹下的多个txt文件&#xff0c;并对文本内容分列。 原始文件&#xff1a; 最终结果&#xff1a; import pandas as pd import xlwt import pandas as pd from sqlalchemy import create_engine import pandas as pd import os import glob dirPath g…

k8s(二):Pod

Pod pod 是K8s中最小的可部署单元&#xff0c;用于容纳一个或多个容器。Pod为容器提供了一个共享的环境&#xff0c;包括网络命名空间、存储卷和IP地址。 pod的阶段(phase) Pending: Pod 已被 Kubernetes 系统接受&#xff0c;但有一个或者多个容器尚未创建亦未运行。此阶段包…

【已解决】Win10端口被占用

​ 我总是在启动项目的时候失败&#xff0c;被告知端口号被占用&#xff0c;明明没有被占用(可能是系统卡了或者其它问题)&#xff0c;但是又不想改端口号&#xff0c;或者重启电脑&#xff0c;那怎么办呢&#xff1f; 第一步&#xff1a;打开命令行窗口&#xff0c;以管理员…

【 六袆 - Framework】ActiveMQ in windows安装;

介绍 This document describes how to install and configure ActiveMQ for both Unix and Windows’ platforms. 预安装 ActiveMQ5.16版本对应JDK ActiveMQ版本JDK版本5.16JDK8(推荐)5.17JDK96.0JDK17 Windows Binary Installation This procedure explains how to down…

mvc模式test

项目结构 Book.java package beans; public class Book {private Integer id;private String name;private double price;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void setName(Strin…

不会代码(零基础)学语音开发(语音播报板载双按键状态)

这个例程实现语音播报VDB-150S语音开发板板载的按键开关SW1、SW2的按下情况。 语音开发板将板载的按键开关SW1、SW2的一端都接到了GND端&#xff0c;另一端分别连接到语音模块的GPIO_B0、GPIO_B1引脚&#xff0c;当按下SW1时GPIO_B0引脚会输入低电平&#xff0c;当按下SW2时GP…

老师可以做副业吗

当老师&#xff0c;除了教学工作之外&#xff0c;还可以怎样来丰富自己的职业体验和增加收入呢&#xff1f; 自媒体作者 许多教师选择成为自媒体作者&#xff0c;分享自己的教育心得、教学经验以及与学生相处的生活状态等。通过撰写文章、发布在社交媒体上&#xff0c;不仅可以…

213. 打家劫舍 II --力扣 --JAVA

题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在…

Objaverse:大规模3D模型开放数据集

研究人员推出了 Objaverse&#xff0c;这是一个“包含文本描述的3D 对象的海量开放数据集”。 它包含大约 800 000 个 3D 模型以及文本描述。 Objaverse数据集可以从huggingface下载&#xff0c;并且是通过 Sketchfab&#xff08;Epic Games 旗下的在线平台&#xff09;上共享…

LightDB - 支持 last_day 函数[mysql兼容]

从 23.4 开始 LightDB 支持 mysql 的 last_day 函数。 目前LightDB 实现last_day的与mysql 并不完成相同&#xff0c;会在示例中列举出不同点, 主要是以下几点&#xff1a; 对于错误日期mysql返回null&#xff0c;lightdb 是直接报错对于一些特殊日期&#xff0c;lightdb 不支…

Backend - Python 序列化

目录 一、作用1&#xff1a;代码块存入数据库 二、作用2&#xff1a;前后端传递数据 &#xff08;一&#xff09;前端 1. JSON.stringify() 2. JSON.parse() &#xff08;二&#xff09;后端 1. json.dumps() &#xff08;1&#xff09;作用 &#xff08;2&#xff09…

algo-多数排序

多数排序在leetcode只是一个简单题&#xff0c;但是衍生出来的多种解法却非常有意思 首先是最容易想到的hash和排序算法&#xff0c;接着是 随机化 从概率来讲一个随机挑选一个元素并验证都很大概率是众数 func majorityElementRandom(nums []int) int {n : len(nums)mc : …

RAM、ROM、flash、eMMC

RAM&#xff1a;Random-Access Memory的缩写&#xff0c;意思为“随机存取存储器” ROM&#xff1a;Read-Only Memory的缩写&#xff0c;意思为“只读存储器” 总体来看&#xff1a;都是存储器 最大区别&#xff1a;ROM可以在停止供电的时候仍然保存着数据&#xff1b;RAM在…

又有狗咬娃!江西8岁男童买早餐被狗扑咬,满脸血缝了90多针!

位于江西省吉安市吉安县实验小学门口&#xff0c;一名年仅8岁的男童在去买早餐的路上遭遇了一场恐怖的袭击。据报道&#xff0c;孩子是在清晨的买早餐路上被一只恶狗扑倒咬伤的&#xff0c;伤口深可见骨。 孩子的母亲悲痛欲绝地描述了当时的情景&#xff0c;孩子被咬伤后躺在地…

ky10 x86 一键安装wvp gb28181 pro平台

下载代码 git clone https://gitcode.net/zengliguang/ky10_x86_wvp_record_offline_install.gitfinalshell mobaxterm 修改服务器ip 查看服务器ip ip a 在脚本文件中修改服务器ip 执行安装脚本 切换到root用户 sudo su cd ky10_x86_wvp_record_offline_install/ sourc…

智能优化算法应用:基于黑寡妇算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑寡妇算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑寡妇算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文献7.…