- PO模式
- 案例:tpshop登录
- v1
- v2 —— 使用selenium
- v3 业务层。
页面层实现
- v1 v2 v3 的缺陷
- v4
- PO
- v4版本:
版本:
v1:不采用任何模式(线性模型):就是不回溯
v2:采用测试框架 unittest 框架在测试中的应用
v3:业务代码和页面对象进行
v4:实际中的po模式编写
- 账号不存在
- 密码错误
账号不存在
test_login_username_not_exist
# 导包
from selenium import webdriver
# 获取driver对象
driver = webdriver.Chrome()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
driver.get("http://localhost")
# 点击登录连接
driver.find_element_by_partial_link_text("登录").click()
# 输入用户名
driver.find_element_by_css_selector("#username").send_keys("13011112222")
# 输入密码
driver.find_element_by_css_selector("#password").send_keys("123456")
# 输入验证码
driver.find_element_by_css_selector("#verify_code").send_keys("8888")
# 点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
# 获取错误提示信息 获取文本值 .text
msg = driver.find_element_by_css_selector(".layui-layer-content").text
print("msg:", msg)
# 断言
assert msg == "账号不存在!"
# 点击提示框确定按钮
driver.find_element_by_css_selector(".layui-layer-btn0").click()
# 关闭
driver.quit()
密码错误
test_login_password_err
# 导包
from selenium import webdriver
# 获取driver对象
driver = webdriver.Chrome()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
driver.get("http://localhost")
# 点击登录连接
driver.find_element_by_partial_link_text("登录").click()
# 输入用户名
driver.find_element_by_css_selector("#username").send_keys("13800001111")
# 输入密码
driver.find_element_by_css_selector("#password").send_keys("123123")
# 输入验证码
driver.find_element_by_css_selector("#verify_code").send_keys("8888")
# 点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
# 获取错误提示信息
msg = driver.find_element_by_css_selector(".layui-layer-content").text
print("msg:", msg)
# 断言
assert msg == "密码错误!"
# 点击提示框确定按钮
driver.find_element_by_css_selector(".layui-layer-btn0").click()
# 关闭
driver.quit()
v2 —— 使用selenium
v2 代码的冗余量太大了
test_login 函数实现
断言一般放在 try 里面 ,try 是用来捕获异常的
# 导包
import unittest
from selenium import webdriver
# 新建测试类 并继承
class TestLogin(unittest.TestCase):
# 初始化 setUp
def setUp(self):
# 获取driver对象
self.driver = webdriver.Chrome()
# 最大化浏览器
self.driver.maximize_window()
# 隐式等待
self.driver.implicitly_wait(30)
# 打开url
self.driver.get("http://localhost")
# 点击登录连接
self.driver.find_element_by_partial_link_text("登录").click()
# 结束 tearDown
def tearDown(self):
# 关闭浏览器
self.driver.quit()
# 新建测试方法 用户名不存在
def test_login_username_not_exist(self):
driver = self.driver
# 输入用户名
driver.find_element_by_css_selector("#username").send_keys("13011112222")
# 输入密码
driver.find_element_by_css_selector("#password").send_keys("123456")
# 输入验证码
driver.find_element_by_css_selector("#verify_code").send_keys("8888")
# 点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
# 获取错误提示信息
msg = driver.find_element_by_css_selector(".layui-layer-content").text
print("msg:", msg)
try:
# 断言
self.assertEqual(msg, "账号不存在!")
# 点击提示框确定按钮
driver.find_element_by_css_selector(".layui-layer-btn0").click()
except AssertionError:
# 截图
driver.get_screenshot_as_file("../image/fail.png")
# 新建测试方法 密码错误
def test_login_password_err(self):
driver = self.driver
# 输入用户名
driver.find_element_by_css_selector("#username").send_keys("13800001111")
# 输入密码
driver.find_element_by_css_selector("#password").send_keys("123123")
# 输入验证码
driver.find_element_by_css_selector("#verify_code").send_keys("8888")
# 点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
# 获取错误提示信息
msg = driver.find_element_by_css_selector(".layui-layer-content").text
print("msg:", msg)
try:
# 断言
self.assertEqual(msg, "密码!")
# 点击提示框确定按钮
driver.find_element_by_css_selector(".layui-layer-btn0").click()
except AssertionError:
# 截图
driver.get_screenshot_as_file("../image/fail.png")
test_login 类实现
类比 函数 使用的多
# 导包
import unittest
from time import sleep
from selenium import webdriver
# 新建测试类 并继承
class TestLogin(unittest.TestCase):
driver = None # 因为是类方法,所以需要定义一下
# 初始化 setUp
@classmethod
def setUpClass(cls):
# 获取driver对象
cls.driver = webdriver.Chrome()
# 最大化浏览器
cls.driver.maximize_window()
# 隐式等待
cls.driver.implicitly_wait(30)
# 打开url
cls.driver.get("http://localhost")
# 点击登录连接
cls.driver.find_element_by_partial_link_text("登录").click()
# 结束 tearDown
@classmethod
def tearDownClass(cls):
# 关闭浏览器
cls.driver.quit()
# 新建测试方法 用户名不存在
def test_login_username_not_exist(self):
driver = self.driver
# 输入用户名
username = driver.find_element_by_css_selector("#username")
username.clear()
username.send_keys("13011112222")
# 输入密码
pwd = driver.find_element_by_css_selector("#password")
pwd.clear()
pwd.send_keys("123456")
# 输入验证码
code = driver.find_element_by_css_selector("#verify_code")
code.clear()
code.send_keys("8888")
# sleep(2)
# 点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
# sleep(2)
# 获取错误提示信息
msg = driver.find_element_by_css_selector(".layui-layer-content").text
print("msg:", msg)
try:
# 断言
self.assertEqual(msg, "账号不存在!")
# 点击提示框确定按钮
driver.find_element_by_css_selector(".layui-layer-btn0").click()
except AssertionError:
# 截图
driver.get_screenshot_as_file("../image/fail.png")
# 新建测试方法 密码错误
def test_login_password_err(self):
driver = self.driver
# 输入用户名
username = driver.find_element_by_css_selector("#username")
username.clear()
username.send_keys("13800001111")
# 输入密码
pwd = driver.find_element_by_css_selector("#password")
pwd.clear()
pwd.send_keys("123123")
# 输入验证码
code = driver.find_element_by_css_selector("#verify_code")
code.clear()
code.send_keys("8888")
# sleep(2)
# 点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
# sleep(2)
# 获取错误提示信息
msg = driver.find_element_by_css_selector(".layui-layer-content").text
print("msg:", msg)
try:
# 断言
self.assertEqual(msg, "密码错误!")
# 点击提示框确定按钮
driver.find_element_by_css_selector(".layui-layer-btn0").click()
except AssertionError:
# 截图
driver.get_screenshot_as_file("../image/fail.png")
v3 业务层。页面层实现
page_login :大驼峰命名
"""
页面对象层:
页面对象编写技巧:
类名:使用大驼峰将模块名称抄进来,有下滑线去掉下划线
方法:根据业务需求每个 *** 作步骤单独封装一个方法
方法名 page_XXX
"""
from selenium import webdriver
class PageLogin:
def __init__(self):
# 获取driver对象
self.driver = webdriver.Chrome()
# 最大化浏览器
self.driver.maximize_window()
# 隐式等待
self.driver.implicitly_wait(30)
# 打开url
self.driver.get("http://localhost")
# 点击登录 连接
def page_click_login_link(self):
self.driver.find_element_by_partial_link_text("登录").click()
# 输入用户名
def page_input_username(self, username):
self.driver.find_element_by_css_selector("#username").send_keys(username)
# 输入密码
def page_input_pwd(self, pwd):
self.driver.find_element_by_css_selector("#password").send_keys(pwd)
# 输入验证码
def page_input_verify_code(self, code):
self.driver.find_element_by_css_selector("#verify_code").send_keys(code)
# 点击登录按钮
def page_click_login_btn(self):
self.driver.find_element_by_css_selector(".J-login-submit").click()
# 获取异常提示信息
# 获取的信息需要返回
def page_get_text(self):
return self.driver.find_element_by_css_selector(".layui-layer-content").text
# 点击提示框确定按钮
def page_click_err_btn_ok(self):
self.driver.find_element_by_css_selector(".layui-layer-btn0").click()
# 组装登录业务方法 给业务层调用
def page_login(self, usrename, pwd, code):
self.page_click_login_link()
self.page_input_username(usrename)
self.page_input_pwd(pwd)
self.page_input_verify_code(code)
self.page_click_login_btn()
业务层 test_login
在业务层实现必须以 test 开头
# 导包
import unittest
from parameterized import parameterized
from v3.page.page_login import PageLogin
# 新建测试类
class TestLogin(unittest.TestCase):
# 初始化方法
def setUp(self):
# 获取登录页面对象
self.login = PageLogin()
# 结束方法
def tearDown(self):
# 关闭驱动对象
# self.login 里面有 driver 所以这样写
self.login.driver.quit()
# 新建测试方法
@parameterized.expand([("13822223333","123456","8888","账号不存在!"), ("13800001111","123123","8888","密码错误!")])
def test_login(self, username, pwd, code, expect):
# 调用测试登录方法
self.login.page_login(username, pwd, code)
# 获取登录后的信息
msg = self.login.page_get_text()
try:
# 断言
self.assertEqual(msg, expect)
# 点击确定
self.login.page_click_err_btn_ok()
except AssertionError:
# 截图
pass
v1 v2 v3 的缺陷
v1:无法批量运行
v2: 业务脚本与页面对象没有分开
v3: 代码冗余量太大
# 导包
import unittest
from v4.page.page_login import PageLogin
from parameterized import parameterized
def get_data():
return [("13822223333", "123456", "8888", "账号不存在!"),
("13800001111", "123123", "8888", "密码错误!")]
# 新建测试类 并 继承
class TestLogin(unittest.TestCase):
login = None
# setUp
@classmethod
def setUpClass(cls):
# 实例化 获取页面对象 PageLogin
cls.login = PageLogin()
# 点击登录连接
cls.login.page_click_login_link()
# tearDown
@classmethod
def tearDownClass(cls):
# 关闭 driver驱动对象
cls.login.driver.quit()
# 登录测试方法
@parameterized.expand(get_data())
def test_login(self, username, pwd, code, expect_result):
# 调用登录方法
self.login.page_login(username, pwd, code)
# 获取登录提示信息
msg = self.login.page_get_error_info()
try:
# 断言
self.assertEqual(msg, expect_result)
except AssertionError:
# 截图
self.login.page_get_img()
PO
PO: page(页面) object(对象)
v4版本:结构:base、page、script
- base(基类):page页面一些公共的方法;
# Base类
初始化方法
查找元素方法
点击元素方法
输入方法
获取文本方法
截图方法
注意:
1. 以上方法封装时候,解包只需1次,在查找元素解包;
2. driver为虚拟,谁调用base时,谁传入,无需关注从哪里来;
3. loc:真正使用loc的方法只有查找元素方法使用;
-
page(页面对象):一个页面封装成一个对象;导包、调用、继承
应用:继承base;实现: 1. 模块名:page+实际 *** 作模块名称 如:page_login.py 2. 页面对象名:以大驼峰方法将模块名抄进来,有下划线去掉下划线 3. 方法:涉及元素,将每个元素 *** 作单独封装一个 *** 作方法; 4. 组装:根据需求组装以上 *** 作步骤;
-
scripts(业务层):导包调用 page页面
实现:
1. 模块:test+实际 *** 作模块名称 如:test_login.py
2. 测试业务名称:以大驼峰方法将模块名抄进来,有下划线去掉下划线
3. 方法:
1. 初始化方法 setUp() 注:在unittest框架中不能使用def __init__()初始化方法;
# 实例化 页面对象
# 前置 *** 作 如:打开等等
2. 结束方法 teardown
# 关闭驱动
3. 测试方法
# 根据要 *** 作的业务来实现
扩展:
loc变量:类型为元组 ;*loc为解包;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)