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)
相关推荐
许野平23 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨26 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar35 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
Tassel_YUE36 分钟前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
聪明的墨菲特i43 分钟前
Python爬虫学习
爬虫·python·学习
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧1 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射
Troc_wangpeng2 小时前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习