PO模式登录测试

发布于:2024-07-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

项目实践

登陆项目测试

get_driver

import page
from selenium import webdriver


class GetDriver:
    driver = None

    @classmethod
    def get_driver(cls):
        if cls.driver is None:
            cls.driver = webdriver.Edge()
            cls.driver.maximize_window()
            cls.driver.get(page.url)

        return cls.driver

    @classmethod
    def quit_driver(cls):
        if cls.driver:
            cls.driver.quit()
            cls.driver = None

get_logger

import logging.handlers


class GetLogger:
    logger = None

    @classmethod
    def get_logger(cls):
        if cls.logger is None:
            cls.logger = logging.getLogger()

            cls.logger.setLevel(logging.INFO)

            sh = logging.StreamHandler()

            th = logging.handlers.TimedRotatingFileHandler(filename="../log/login.log",
                                                           when="midnight",
                                                           interval=1,
                                                           backupCount=3,
                                                           encoding="utf-8")

            fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
            fm = logging.Formatter(fmt)

            sh.setFormatter(fm)
            th.setFormatter(fm)

            cls.logger.addHandler(sh)
            cls.logger.addHandler(th)

        return cls.logger

base

from selenium.webdriver.support.wait import WebDriverWait
import time

from base.get_logger import GetLogger


log = GetLogger().get_logger()


class Base:
    def __init__(self, driver):
        log.info("正在初始化driver{}".format(driver))
        self.driver = driver

    def base_find_element(self, loc, timeout=30, poll=0.5):
        log.info("正在查找元素{}".format(loc))
        return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).until(lambda x: x.find_element(*loc))

    def base_click(self, loc):
        log.info("正在点击元素{}".format(loc))
        self.base_find_element(loc).click()

    def base_input(self, loc, value):
        log.info("正在给元素输入内容{}".format(loc))
        el = self.base_find_element(loc)
        # 清空
        log.info("正在给元素{}清空".format(loc))
        el.clear()
        # 输入
        log.info("正在给元素{}输入内容".format(loc))
        el.send_keys(value)

    def base_get_text(self, loc):
        # 注意:一定要返回元素的文本信息
        log.info("正在获取元素{}文本".format(loc))
        return self.base_find_element(loc).text

    # 截图
    def base_get_screen_shot(self):
        self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))

    # 封装判断元素是否存在
    def base_if_exist(self, loc):
        try:
            self.base_find_element(loc, timeout=2)
            log.info("元素{}存在".format(loc))

            return True
        except:
            log.info("元素{}不存在".format(loc))
            return False

__init__

from selenium.webdriver.common.by import By

"""项目配置地址"""
url = "https://demo5.tp-shop.cn/"

"""以下为登录页面元素配置信息"""

# 用户名
login_username = By.ID, "username"
# 密码
login_pwd = By.ID, "password"
# 验证码
login_verify_code = By.ID, "verify_code"
# 登录按钮
login_btn = By.CSS_SELECTOR, ".J-login-submit"
# 获取异常文本信息
login_err_info = By.CSS_SELECTOR, ".layui-layer-content"
# 点击异常提示框 按钮
login_err_btn_ok = By.CSS_SELECTOR, ".layui-layer-btn0"
# 安全退出
login_logout = By.PARTIAL_LINK_TEXT, "安全退出"

# 登录链接
login_link = By.PARTIAL_LINK_TEXT, "登录"

page_login 继承Base

from base.base import Base
import page


class PageLogin(Base):
    # 点击登录链接
    def page_click_login_link(self):
        self.base_click(page.login_link)

    # 输入用户名
    def page_input_username(self, username):
        self.base_input(page.login_username, username)

    # 输入密码
    def page_input_password(self, pwd):
        self.base_input(page.login_pwd, pwd)

    # 输入验证
    def page_input_verify_code(self, code):
        self.base_input(page.login_verify_code, code)

    # 点击登录按钮
    def page_click_login_btn(self):
        self.base_click(page.login_btn)

    # 获取异常提示信息
    def page_get_error_info(self):
        return self.base_get_text(page.login_err_info)

    # 点击异常信息框 确定
    def page_click_err_btn_ok(self):
        self.base_click(page.login_err_btn_ok)

    # 截图
    def page_get_img(self):
        self.base_get_screen_shot()

    # 点击 安全退出 --》退出使用
    def page_click_logout(self):
        self.base_click(page.login_logout)

    # 判断是否登录成功
    def page_is_login_success(self):
        return self.base_if_exist(page.login_logout)

    # 判断是否退出成功
    def page_is_logout_success(self):
        return self.base_if_exist(page.login_link)

    # 组合业务方法
    def page_login(self, username, pwd,code):
        self.page_input_username(username)
        self.page_input_password(pwd)
        self.page_input_verify_code(code)
        self.page_click_login_btn()

数据准备

json:

{
    "login_001":{"username":"138000011112",
               "password":"123456",
               "verify_code":"8888",
               "expect_result":"账号不存在!",
                "success": false},
    "login_002":{"username":"13800001111",
               "password":"1234567",
               "verify_code":"8888",
               "expect_result":"密码错误!",
                "success": false},
    "login_003":{"username":"",
               "password":"123456",
               "verify_code":"8888",
               "expect_result":"用户名不能为空!",
                "success": false},
    "login_004":{"username":"13800001111",
               "password":"",
               "verify_code":"8888",
               "expect_result":"密码不能为空!",
                "success": false},
    "login_005":{"username":"13800001111",
               "password":"123456",
               "verify_code":"",
               "expect_result":"验证码不能为空!",
                "success": false},
    "login_006":{"username":"13800001111",
               "password":"123456",
               "verify_code":"8888",
               "expect_result":"安全退出",
                "success": true}
}

txt:

138000011112,123456,8888,账号不存在!,false
13800001111,1234567,8888,密码错误!,false
,123456,8888,用户名不能为空!,false
13800001111,,8888,密码不能为空!,false
13800001111,123456,,验证码不能为空!,false
13800001111,123456,8888,安全退出,true

数据驱动方法

json:

# 导包
import json


def read_json(filename):
    filepath = "../data/" + filename
    # 打开文件并调用 load方法
    with open(filepath, "r", encoding="utf-8")as f:
        return json.load(f)

txt:

def read_txt(filename):
    filepath = "../data/" + filename
    with open(filepath, "r", encoding="utf-8")as f:
        return f.readlines()


业务层

# 导包
import unittest
from time import sleep

from base.get_driver import GetDriver
from page.page_login import PageLogin
from parameterized import parameterized
from tool.read_json import read_json
from tool.read_txt import read_txt
from base.get_logger import GetLogger


log = GetLogger().get_logger()


def get_data():
    arr = []
    for data in read_json("login.json").values():
        arr.append((data.get("username"),
                    data.get("password"),
                    data.get("verify_code"),
                    data.get("expect_result"),
                    data.get("success")))
    return arr  # 注意:必须进行return 返回

# def get_data():
#     arr = []
#     for data in read_txt("login.txt"):
#         arr.append(tuple(data.strip().split(",")))
#     return arr


# 新建测试类
class TestLogin(unittest.TestCase):
    login = None

    @classmethod
    def setUpClass(cls):
        try:
            # 实例化 获取页面对象 PageLogin
            cls.login = PageLogin(GetDriver().get_driver())
            # 点击登录连接
            cls.login.page_click_login_link()
        except Exception as e:
            log.error(e)

    # tearDown
    @classmethod
    def tearDownClass(cls):
        sleep(3)
        # 关闭 driver驱动对象
        GetDriver().quit_driver()

    def tearDown(self):
        self.login.driver.refresh()

    # 登录测试方法
    @parameterized.expand(get_data())
    def test_login(self, username, pwd, code, expect_result, success):
        # 调用登录方法
        self.login.page_login(username, pwd, code)
        if success:
            try:
                # 判断安全退出是否存在
                self.assertTrue(self.login.page_is_login_success())
                # 点击退出
                self.login.page_click_logout()
                try:
                    # 判断登录是否存在
                    self.assertTrue(self.login.page_is_logout_success)
                except:
                    # 截图
                    self.login.page_get_img()
                # 点击登录连接
                self.login.page_click_login_link()
            except Exception as e:
                # 截图
                self.login.page_get_img()
                log.error(e)
        else:
            # 获取登录提示信息
            msg = self.login.page_get_error_info()
            try:
                # 断言
                self.assertEqual(msg, expect_result)

            except AssertionError:
                # 截图
                self.login.page_get_img()
            # 点击 确认框
            self.login.page_click_err_btn_ok()

生成测试报告 

from tool.HTMLTestRunner import HTMLTestRunner
import unittest

suite = unittest.defaultTestLoader.discover("./", "test_login.py")
# 网页要wb
with open("../report/report_html.html", "wb") as f:
    HTMLTestRunner(stream=f).run(suite)