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)
相关推荐
LyaJpunov3 分钟前
C++中move和forword的区别
开发语言·c++
程序猿练习生8 分钟前
C++速通LeetCode中等第9题-合并区间
开发语言·c++·leetcode
一名路过的小码农18 分钟前
C/C++动态库函数导出 windows
c语言·开发语言·c++
m0_6312704020 分钟前
标准c语言(一)
c语言·开发语言·算法
万河归海42821 分钟前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
Messiah___26 分钟前
【论文阅读】Slim Fly: A Cost Effective Low-Diameter Network Topology 一种经济高效的小直径网络拓扑
开发语言·php
农民小飞侠1 小时前
python AutoGen接入开源模型xLAM-7b-fc-r,测试function calling的功能
开发语言·python
指尖流烟1 小时前
C#调用图表的使用方法
开发语言·c#
战神刘玉栋1 小时前
《程序猿之设计模式实战 · 观察者模式》
python·观察者模式·设计模式
敲代码不忘补水1 小时前
Python 项目实践:简单的计算器
开发语言·python·json·项目实践