Pytest-PO模式

文章目录

*

+ 1. V1版本
+ 2.V2版本
+
* V1.原始
* V2.将重复方法简单提取一下(存在问题;代码冗余)
* V3.将重复方法提取成出来,方法封装(存在问题:维护麻烦,没有参数化,如果页面元素发生变化维护起来麻烦)
* V4.Po模式
* V5.Po模式优化

1. V1版本

一个用例一个脚本,维护不方便

2.V2版本

通过pytest执行

Pytest-PO模式

配置文件
pytest.ini
addopts = -s -v –html=report/report.html –reruns 1 生成测试报告 用例失败执行一次

[pytest]
addopts = -s -v --html=report/report.html --reruns 1
testpaths = ./V3/./scripts
python_files = test_*.py
python_classes = Test*
python_functions = test_*

V1.原始

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

class TestAdd:

    def test_01(self):
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.implicitly_wait(10)
        driver.get("http://tpshop-test.itheima.net")

        driver.find_element(By.CSS_SELECTOR, ".red").click()

        driver.find_element(By.NAME, "username").send_keys("13987362332")
        driver.find_element(By.NAME, "password").send_keys("123456")
        driver.find_element(By.NAME, "verify_code").send_keys("8888")
        driver.find_element(By.NAME, "sbtbutton").click()

        time.sleep(1)
        msg = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text

        assert "账号不存在" in msg
        driver.quit()

    def test_02(self):
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.implicitly_wait(10)
        driver.get("http://tpshop-test.itheima.net")

        driver.find_element(By.CSS_SELECTOR, ".red").click()

        driver.find_element(By.NAME, "username").send_keys("13012345678")
        driver.find_element(By.NAME, "password").send_keys("123")
        driver.find_element(By.NAME, "verify_code").send_keys("8888")
        driver.find_element(By.NAME, "sbtbutton").click()

        time.sleep(1)
        msg = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text

        assert "密码错误" in msg
        driver.quit()

V2.将重复方法简单提取一下(存在问题;代码冗余)

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

class TestAdd:

    def setup_class(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)
        self.driver.get("http://tpshop-test.itheima.net")

        self.driver.find_element(By.CSS_SELECTOR, ".red").click()

    def test_01(self):

        self.driver.find_element(By.NAME, "username").send_keys("13987362332")
        self.driver.find_element(By.NAME, "password").send_keys("123456")
        self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
        self.driver.find_element(By.NAME, "sbtbutton").click()

        time.sleep(1)
        msg = self.driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
        print(msg)

        assert "账号不存在" in msg

    def setup(self):
        self.driver.refresh()

    def test_02(self):

        self.driver.find_element(By.NAME, "username").send_keys("13012345678")
        self.driver.find_element(By.NAME, "password").send_keys("123")
        self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
        self.driver.find_element(By.NAME, "sbtbutton").click()

        time.sleep(1)
        msg = self.driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text

        assert "密码错误" in msg

    def teardown_class(self):
        self.driver.quit()

V3.将重复方法提取成出来,方法封装(存在问题:维护麻烦,没有参数化,如果页面元素发生变化维护起来麻烦)

Pytest-PO模式
注意:要建立一个conftest.py的空文件,要不然会说V3.utils找不到
utils工具类:
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

class UtilsDriver:
    _driver = None

    @classmethod
    def get_driver(cls):
        if cls._driver is None:
            cls._driver = webdriver.Chrome()
            cls._driver.maximize_window()
            cls._driver.implicitly_wait(10)
        return cls._driver

    @classmethod
    def quit_driver(cls):

        if cls._driver is not None:
            cls.get_driver().quit()
            cls._driver = None

def get_msg():
    time.sleep(1)
    return UtilsDriver.get_driver().find_element(By.CSS_SELECTOR, ".layui-layer-content").text

代码:

from selenium.webdriver.common.by import By

from V3.utils import UtilsDriver, get_msg

class TestLogin:

    def setup_class(self):
        self.driver = UtilsDriver.get_driver()

        self.driver.get("http://tpshop-test.itheima.net")

        self.driver.find_element(By.CSS_SELECTOR, ".red").click()

    def test_01(self):

        self.driver.find_element(By.NAME, "username").send_keys("13987362332")
        self.driver.find_element(By.NAME, "password").send_keys("123456")
        self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
        self.driver.find_element(By.NAME, "sbtbutton").click()
        msg = get_msg()

        assert "账号不存在" in msg

    def setup(self):
        self.driver.refresh()

    def test_02(self):

        self.driver.find_element(By.NAME, "username").send_keys("13012345678")
        self.driver.find_element(By.NAME, "password").send_keys("123")
        self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
        self.driver.find_element(By.NAME, "sbtbutton").click()
        msg = get_msg()

        assert "密码错误" in msg

    def teardown_class(self):
        UtilsDriver.quit_driver()

V4.Po模式

把一个页面分为三层:对象库(封装定位元素方法),操作层(封装元素的操作),业务层(将一个或者多个业务组合起来)

  • 首先要知道用到哪些页面,页面里面用到哪些元素
    Pytest-PO模式

pagehome.py


from selenium.webdriver.common.by import By

from V4.utils import UtilsDriver

class PageHome:
    def __init__(self):

        self.driver = UtilsDriver.get_driver()
        self.login_btn = By.CSS_SELECTOR, ".red"

    def find_login_btn(self):
        return self.driver.find_element(self.login_btn[0], self.login_btn[1])

class HandleHome:
    def __init__(self):
        self.home_page = PageHome()

    def click_btn_login(self):
        self.home_page.find_login_btn().click()

class HomeProxy:
    def __init__(self):
        self.home_proxy = HandleHome()

    def go_login_page(self):
        self.home_proxy.click_btn_login()

pagelogin.py


from selenium.webdriver.common.by import By

from V4.utils import UtilsDriver

class PageLogin:
    def __init__(self):

        self.driver = UtilsDriver.get_driver()
        self.account_btn = By.NAME, "username"
        self.pwd_btn = By.NAME, "password"
        self.keys_btn = By.NAME, "verify_code"
        self.input_btn = By.NAME, "sbtbutton"

    def find_account_btn(self):
        return self.driver.find_element(self.account_btn[0], self.account_btn[1])

    def find_pwd_btn(self):
        return self.driver.find_element(self.pwd_btn[0], self.pwd_btn[1])

    def find_keys_btn(self):
        return self.driver.find_element(*self.keys_btn)

    def find_input_btn(self):
        return self.driver.find_element(*self.input_btn)

class HandleLogin:
    def __init__(self):
        self.login_page = PageLogin()

    def input_account(self, username):
        self.login_page.find_account_btn().clear()
        self.login_page.find_account_btn().send_keys(username)

    def input_pwd(self, pwd):
        self.login_page.find_pwd_btn().clear()
        self.login_page.find_pwd_btn().send_keys(pwd)

    def input_keys(self, keys):
        self.login_page.find_keys_btn().clear()
        self.login_page.find_keys_btn().send_keys(keys)

    def input_click(self):
        self.login_page.find_input_btn().click()

class LoginProxy:
    def __init__(self):
        self.login_proxy = HandleLogin()

    def login(self, username, pwd, keys):
        self.login_proxy.input_account(username)
        self.login_proxy.input_pwd(pwd)
        self.login_proxy.input_keys(keys)
        self.login_proxy.input_click()

V5.Po模式优化

Pytest-PO模式
优化显示等待和清除操作
base_page.py

from selenium.webdriver.support.wait import WebDriverWait

from V4.utils import UtilsDriver

class BasePage:
    def __init__(self):

        self.driver = UtilsDriver.get_driver()

    def get_element(self, location):
        wait = WebDriverWait(self.driver, 10, 1)
        element = wait.until(lambda x: x.find_element(*location))
        return element

class BaseHandler:

    def input_text(self, element, text):
        element.clear()
        element.send_keys(text)

page_home.py


from selenium.webdriver.common.by import By

from V4.base.base_page import BasePage, BaseHandler
from V4.utils import UtilsDriver

class PageHome(BasePage):
    def __init__(self):

        super().__init__()
        self.login_btn = By.CSS_SELECTOR, ".red"

    def find_login_btn(self):
        return self.get_element(self.login_btn)

class HandleHome(BaseHandler):
    def __init__(self):
        self.home_page = PageHome()

    def click_btn_login(self):
        self.home_page.find_login_btn().click()

class HomeProxy:
    def __init__(self):
        self.home_proxy = HandleHome()

    def go_login_page(self):
        self.home_proxy.click_btn_login()

page_login.py


from selenium.webdriver.common.by import By

from V4.base.base_page import BaseHandler, BasePage
from V4.utils import UtilsDriver

class PageLogin(BasePage):
    def __init__(self):

        super().__init__()
        self.account_btn = By.NAME, "username"
        self.pwd_btn = By.NAME, "password"
        self.keys_btn = By.NAME, "verify_code"
        self.input_btn = By.NAME, "sbtbutton"

    def find_account_btn(self):
        return self.get_element(self.account_btn)

    def find_pwd_btn(self):
        return self.get_element(self.pwd_btn)

    def find_keys_btn(self):
        return self.get_element(self.keys_btn)

    def find_input_btn(self):
        return self.get_element(self.input_btn)

class HandleLogin(BaseHandler):
    def __init__(self):
        self.login_page = PageLogin()

    def input_account(self, username):
        self.input_text(self.login_page.find_account_btn(), username)

    def input_pwd(self, pwd):
        self.input_text(self.login_page.find_pwd_btn(), pwd)

    def input_keys(self, keys):
        self.input_text(self.login_page.find_keys_btn(), keys)

    def input_click(self):
        self.login_page.find_input_btn().click()

class LoginProxy:
    def __init__(self):
        self.login_proxy = HandleLogin()

    def login(self, username, pwd, keys):
        self.login_proxy.input_account(username)
        self.login_proxy.input_pwd(pwd)
        self.login_proxy.input_keys(keys)
        self.login_proxy.input_click()

Pytest-PO模式

Original: https://blog.csdn.net/weixin_42693712/article/details/124761657
Author: highfish920
Title: Pytest-PO模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/772562/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

    其实代码没有问题,但我们忽略了一点,那就是在正常的开发中,我们一定会遇到这样的情况,我们频繁地有客户端链接,断了链接,我们需要统一管理,那么我们应该如何管理呢?事实上,在这个时候,…

    Python 2023年5月25日
    094
  • 人脸检测5种方法

    众所周知,人脸识别是计算机视觉应用的一个重大领域,在学习人脸识别之前,我们先来简单学习下人脸检测的几种用法。 常见的人脸检测方法大致有5种,Haar、Hog、CNN、SSD、MTC…

    Python 2023年9月28日
    051
  • 使用matplotlib绘制简单图表第二课

    一、绘制堆积面积图 1.使用 stackplot()绘制堆积面积图 使用pyplot的stackplot0函数可以快速绘制堆积面积图,stackplot(0 函数的语法格式如下所示…

    Python 2023年9月3日
    060
  • python 文件的基本操作

    * f1 = open(‘read.txt’, encoding=’utf-8′,mode=’r’) f1变量称为文件操作句柄,通常以f1、file_handler、f_h等约定俗…

    Python 2023年6月10日
    067
  • 理解MySQL事务

    事务是什么 百度百科是这么定义的: 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。在关系数据库中…

    Python 2023年10月14日
    034
  • 大数据技术技能分析大赛——第三章 数据预处理

    第三章 数据预处理 3.1熟悉数据 【例】餐饮企业的决策者想要了解影响餐厅销量的一些因素,如天气的好坏,促销活动是否能影响餐厅的销量,周末和非周末餐厅销量是否有大的差别。餐厅手机的…

    Python 2023年8月20日
    056
  • 超级详细的 Maven 教程(基础+高级)

    1. Maven 是什么 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供 构建和 依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约…

    Python 2023年9月26日
    052
  • python带你采集桌游、剧本杀游戏店数据信息~

    前言 嗨喽~大家好呀,这里是魔王呐 ! 又是学习的一天,让我们开始叭~ ; 环境使用: Python 3.8 Pycharm 模块使用: requests >>>…

    Python 2023年9月20日
    069
  • Python-pandas{缺失值处理}

    缺失值处理 缺失值 * 寻找空值数据 统计空缺值 丢弃缺失值 填充缺失值 – 固定值填充 上下文填充 博客文章内需要的文件:文件 pandas学习路线: Python-…

    Python 2023年8月9日
    051
  • 一文读懂机器学习分类全流程

    目录 前言 提出问题 一、介绍 1.分类简介 2.imblearn的安装 二、数据加载及预处理 1.加载并查看数据 ①导入Python第三方库 ②调用并查看数据 2.查看数据分布 …

    Python 2023年8月1日
    072
  • .stl 转ply

    import open3d as o3d mesh = o3d.io.read_triangle_mesh("80390865_shell_occlusion_l.stl…

    Python 2023年6月6日
    073
  • python matplotlib 下标的字体设置问题

    一、 python matplotlib 下标问题参考:The subscripts are not in times new roman using matplotlib [du…

    Python 2023年9月1日
    055
  • [python]pip安装包管理器的安装与使用 2022年最新版

    [python]pip安装包管理器的安装与使用 pip介绍 pip下载 * pip的安装 环境变量 pip基本用法 pip优化 date:2022.8.11 pip介绍 pip 是…

    Python 2023年8月23日
    070
  • 对数据集“Netflix电影电视剧及用户观影数据“的分析处理和可视化

    对数据集”Netflix电影电视剧及用户观影数据”的分析处理和可视化 一、寻找数据集 from kaggle:《Netflix Movies and TV …

    Python 2023年9月3日
    094
  • 爱前端公开课学习笔记——JS03 运算符

    运算符的概述和加减运算课程丢失 乘法* 除法/ 直接在控制台中演示 主要是不要省略乘号 字符串不能进行乘除法运算 布尔型可以进行乘除法运算 false: 0 true: 1 乘除法…

    Python 2023年6月12日
    080
  • JAVA的File对象

    文件 1.File对象 java封装的一个操作文件及文件夹(目录)的对象。可以操作磁盘上的任何一个文件和文件夹。 2.创建文件 方式一:根据路径构建一个File对象new File…

    Python 2023年10月16日
    042
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球