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)