PO模式+数据驱动

PO设计

PO设计结构

  • base: 存放所有Page页面公共方法
  • page: 将页面封装为对象
  • script: 测试脚本

base实现

存放所有⻚⾯公共⽅法。

python 复制代码
class Base:
def __init__(self, driver):
self.driver = driver
# 查找元素
def base_find(self, loc, timeout=10, poll_frequency=0.5):
# 显示等待 -> 查找元素 loc = (By.ID,"userA")
return WebDriverWait(self.driver, timeout,
poll_frequency).until(lambda x: x.find_element(loc[0], loc[1]))
# 输入方法
def base_input(self, loc, value):
# 1、获取元素
el = self.base_find(loc)
# 2、清空操作
el.clear()
# 3、输入内容
el.send_keys(value)

# 点击方法
def base_click(self, loc):
self.base_find(loc).click()

# 获取文本值方法
def base_get_text(self, loc):
return self.base_find(loc).text

page实现

基于⻚⾯或模块单独封装当前⻚⾯要操作的对象

python 复制代码
"""
模块名:page_模块单词
类名:大驼峰将模块移植进来,去掉下划线和数字。
方法:自动化测试当前页面要操作那些元素,就封装那些方法
"""
class PageLogin:
# 输入用户名
def __page_username(self):
pass
# 输入密码
def __page_pwd(self):
pass
# 输入验证码
def __page_verify_code(self):
pass
# 点击登录按钮
def __page_click_login_btn(self):
pass
# 获取昵称
def page_get_nickname(self):
pass
# 组合业务方法 (强调:测试业务成调用此方法,便捷。)
def page_login(self):
pass

script实现

脚本层+unittest 1

python 复制代码
import unittest

from selenium import webdriver

from page.page_login import PageLogin


class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
        self.login = PageLogin(self.driver)

    def tearDown(self) -> None:
        self.driver.quit()

    def test01_login(self,phone="13600001111",password="123456",code="8888"):
        # 调用登录业务
        self.login.page_login(phone,password,code)
        # 断言
        nickname = self.login.page_get_nickname()
        print("nickname:", nickname)

数据驱动

实际操作

步骤1、编写数据存储文件

口诀:

1、新建json文件,在文件中编写一个{}

2、有几个模块,写几个Key,值为列表

3、列表中参数化数据有几组,就写几个{}

3、每个{}中组成->说明+参数数据+预期结果

python 复制代码
{
"login": [
{
"desc":"登录成功",
"phone": "13600001111",
"password": "123456",
"code": "8888",
"expect_text": "13600001111"
}
]
}

步骤2、读取工具封装

python 复制代码
import json
# 读取json工具
import os


def read_json(filename, key):
    filepath = os.path.dirname(__file__) + os.sep + "data_01" + os.sep + filename
    arr = []
    with open(filepath, "r", encoding="utf-8") as f:
        for data in json.load(f).get(key):
            arr.append(tuple(data.values())[1:])
        return arr


if __name__ == '__main__':
    """
        [(),()]
    """
    print(read_json("login.json", "login"))

步骤3、参数化引用

python 复制代码
import unittest
from time import sleep

from selenium import webdriver
from parameterized import parameterized
from page.page_login import PageLogin
from util import read_json


class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("https://demo6.tp-shop.cn/")
        self.login = PageLogin(self.driver)

    def tearDown(self) -> None:
        sleep(3)
        self.driver.quit()

    @parameterized.expand(read_json("login.json", "login"))
    def test01_login(self, phone, password, code, expect_text):
        try:

            # 调用登录业务
            self.login.page_login(phone, password, code)
            # 断言
            nickname = self.login.page_get_nickname()
            print("nickname:", nickname)
            self.assertEqual(nickname, expect_text)
        except Exception as e:
            print("错误!", e)
相关推荐
蓝天智能14 分钟前
QT MVC中View的特点及使用注意事项
开发语言·qt·mvc
松果集23 分钟前
【1】数据类型2
python
且慢.58931 分钟前
命令行的学习使用技巧
python
木觞清33 分钟前
喜马拉雅音频链接逆向实战
开发语言·前端·javascript
海琴烟Sunshine1 小时前
leetcode 66.加一 python
python·算法·leetcode
wuxuanok1 小时前
苍穹外卖 —— 公共字段填充
java·开发语言·spring boot·spring·mybatis
偷光1 小时前
浏览器中的隐藏IDE: Console (控制台) 面板
开发语言·前端·ide·php
罗橙7号1 小时前
【pyTorch】关于PyTorch的高级索引机制理解
人工智能·pytorch·python
B站计算机毕业设计之家1 小时前
智能监控项目:Python 多目标检测系统 目标检测 目标跟踪(YOLOv8+ByteTrack 监控/交通 源码+文档)✅
python·yolo·目标检测·目标跟踪·智慧交通·交通·多目标检测
江上月5131 小时前
django与vue3的对接流程详解(下)
后端·python·django