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)
相关推荐
升职佳兴6 分钟前
C盘爆满自救:3步无损迁移应用数据到E盘(含回滚)
c语言·开发语言
ID_1800790547310 分钟前
除了 Python,还有哪些语言可以解析 JSON 数据?
开发语言·python·json
周末也要写八哥42 分钟前
多进程和多线程的特点和区别
java·开发语言·jvm
FreakStudio1 小时前
小作坊 GitHub 协作闭环:fork-sync-dev-pr-merge 实战指南
python·单片机·嵌入式·面向对象·电子diy
宁瑶琴2 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友2 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
小陈工2 小时前
2026年4月2日技术资讯洞察:数据库融合革命、端侧AI突破与脑机接口产业化
开发语言·前端·数据库·人工智能·python·安全
陈晓明start3 小时前
【python】豆包模型,自动生成测试用例初探索
python
Zarek枫煜3 小时前
C3 编程语言 - 现代 C 的进化之选
c语言·开发语言·青少年编程·rust·游戏引擎
阿kun要赚马内3 小时前
Python中元组和列表差异:底层结构分析
开发语言·python