7.po 模式,v1,v2,v3,v4,

7.po 模式,v1,v2,v3,v4,,第1张

文章目录
    • PO模式
      • 案例:tpshop登录
      • v1
      • v2 —— 使用selenium
      • v3 业务层。


        页面层实现

      • v1 v2 v3 的缺陷
      • v4
      • PO
      • v4版本:

PO模式

版本:
v1:不采用任何模式(线性模型):就是不回溯
v2:采用测试框架 unittest 框架在测试中的应用
v3:业务代码和页面对象进行
v4:实际中的po模式编写

案例:tpshop登录
  1. 账号不存在
  2. 密码错误
v1

账号不存在
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: 代码冗余量太大

v4
# 导包
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

  1. base(基类):page页面一些公共的方法;
# Base类
			初始化方法
		    查找元素方法
			点击元素方法
			输入方法
			获取文本方法
			截图方法
		注意:
			1. 以上方法封装时候,解包只需1次,在查找元素解包;
			2. driver为虚拟,谁调用base时,谁传入,无需关注从哪里来;
			3. loc:真正使用loc的方法只有查找元素方法使用;
  1. page(页面对象):一个页面封装成一个对象;导包、调用、继承
    应用:继承base;

     实现:
     	1. 模块名:page+实际 *** 作模块名称  如:page_login.py 
     	2. 页面对象名:以大驼峰方法将模块名抄进来,有下划线去掉下划线
     	3. 方法:涉及元素,将每个元素 *** 作单独封装一个 *** 作方法;
     	4. 组装:根据需求组装以上 *** 作步骤;
    
  2. scripts(业务层):导包调用 page页面

	实现: 
		1. 模块:test+实际 *** 作模块名称 如:test_login.py 
		2. 测试业务名称:以大驼峰方法将模块名抄进来,有下划线去掉下划线
		3. 方法: 
			1. 初始化方法 setUp() 注:在unittest框架中不能使用def __init__()初始化方法;
				# 实例化 页面对象 
				# 前置 *** 作 如:打开等等
			2. 结束方法 teardown
				# 关闭驱动
			3. 测试方法
				# 根据要 *** 作的业务来实现
			
扩展:
	loc变量:类型为元组 ;*loc为解包;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/578041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存