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)
相关推荐
Swift社区20 分钟前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht21 分钟前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht24 分钟前
Swift闭包的本质
开发语言·ios·swift
wjs202427 分钟前
Swift 数组
开发语言
stm 学习ing1 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc2 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe3 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin3 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python