PageObject三层架构模式实现之数据驱动

接上一篇PageObject三层架构模式实现,发现我们的用户名和密码都是在代码中写死的,如果要测试不同用户名和密码的登录,那么每执行一次就要修改一次代码。这样效果非常不好。

因此本篇文章介绍如何实现数据驱动并且记录下每次操作的日志。

在上一篇文章的基础下,我们再增加两个文件夹,一个TestData文件夹用来存放测试数据,一个Logs文件夹用来存放执行过程中记录的日志信息。

1:先来简单看一下目录结构:

整体目录结果不变,增加了两个文件夹

PageObject三层架构模式实现之数据驱动_第1张图片

2:我们把需要用到的参数都放到excel文件中,再将excel文件放到TestData文件夹下,excel文件的内容如下(仅参考):

PageObject三层架构模式实现之数据驱动_第2张图片

接下来,就是把excel文件中的内容读取出来。

在Util文件夹下,创建一个excel_parse.py文件,用来读取excel中的内容,具体内容如下:

from openpyxl import load_workbook
from Setting.Config import Test_Data_Path


class ExcelParse:

    def __init__(self):
        self.workbook = None
        self.sheet = None

    def load_workbook(self, filename):
        '''加载文件'''
        try:
            self.workbook = load_workbook(filename)
        except Exception as e:
            raise e

    def get_sheet_by_name(self, sheetname):
        '''根据sheetname加载某一页'''
        try:
            self.sheet = self.workbook[sheetname]
        except Exception as e:
            raise e

    def get_row_num(self):
        '''返回行数'''
        return self.sheet.max_row

    def get_col_num(self):
        '''返回列数'''
        return self.sheet.max_column

    def get_cell_value(self, row, col):
        '''获取某一单元格的值'''
        try:
            cell_value = self.sheet.cell(row=row, column=col).value
            return cell_value
        except Exception as e:
            raise e

    def get_row_value(self, row):
        '''返回某一行的值'''
        try:
            cols = self.get_col_num()
            row_value = []
            for i in range(1, cols+1):
                # row_value.append(self.sheet.cell(row=row, column=i).value)
                row_value.append(self.get_cell_value(row, i))
            return row_value
        except Exception as e:
            raise e


if __name__ == '__main__':
    excel = ExcelParse()
    excel.load_workbook(Test_Data_Path)
    excel.get_sheet_by_name('login')
    res = excel.get_row_value(2)
    print(res)

3:接下来就可以修改pageobject三层架构的第三层,业务层test_login.py文件的内容,修改内容如下:

from Module.login import Login
from Util.excel_parse import ExcelParse
from Setting.Config import Test_Data_Path
from selenium import webdriver


def test_login():
    try:
        # 获取数据
        excel = ExcelParse()
        excel.load_workbook(Test_Data_Path)
        excel.get_sheet_by_name('login')

        rows = excel.get_row_num()
        row1_value = excel.get_row_value(1)
        # 遍历每一行数据
        for i in range(2, rows+1):
            tmp_row_value = excel.get_row_value(i)
            # 将表头与数据聚合成一个字典,方便调用
            tmp_dict = dict(zip(row1_value, tmp_row_value))
            print(tmp_dict)
            username = tmp_dict['用户名']
            password = tmp_dict['密码']

            driver = webdriver.Chrome()
            driver.get('https://mail.163.com/')
            login = Login()
            login.login(driver, username, password)

    except Exception as e:
        raise e

如此就实现了参数化,想传什么参数,直接修改excel文件即可。

4:最后是记录日志,记录日志用的是第三方库:loguru模块

首先先安装loguru模块(pip install loguru)

接下来创建一个Logs文件夹,用来存放日志文件。

在Util文件夹下创建一个日志工具类log_util.py文件,具体内容如下:

from loguru import logger
from Setting.Config import Log_Path


class Log:

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Log, cls).__new__(cls)
        return cls.instance

    def __init__(self):
        logger.add(Log_Path + '/runtime_{time}.log')       # 日志存放位置及日志名称

    def debug(self, message):
        logger.debug(message)

    def info(self, message):
        logger.info(message)

    def warning(self, message):
        logger.warning(message)

    def error(self, message):
        logger.error(message)

log = Log()

5:在pageobject的对象层(loginpage.py文件),导入log,并对操作进行记录,如下:

# 对象层
from selenium import webdriver
from Util.find_ele import find_element
from Util.read_ini import ParseConfigFile
from Util.log_util import log
 
 
class LoginPage:
 
    def __init__(self, driver):
        self.driver = driver
 
    def input_username(self, username):
        '''定位用户名输入控件,并输入用户名'''
        log.info('定位用户名输入框,并输入用户名')
        find_element(self.driver, 'name', 'email').send_keys(username)
        
    def input_password(self, password):
        '''定位密码输入控件,并输入密码'''
        log.info('定位密码输入框,并输入密码')
        find_element(self.driver, 'name', 'password').send_keys(password)
        
    def switch_frame(self):
        '''切换iframe'''
        log.info('切换iframe')
        frame = find_element(self.driver, 'tag name', 'iframe')
        self.driver.switch_to.frame(frame)
 
    def login_click(self):
        '''点击登录'''
        log.info('定位登录按钮,并点击登录')
        find_element(self.driver, 'id', 'dologin').click()
        
 
if __name__ == '__main__':
    driver = webdriver.Chrome()
 
    # 访问网址
    driver.get('https://mail.163.com/')
 
    login = LoginPage(driver)        # 初始化LoginPage类
    # 执行登录操作
    login.switch_frame()
    login.input_username('12345')
    login.input_password('123456')
    login.login_click()

如此,一个简单的pageobject框架就完成。其中呢还有一些可以优化的地方,这里就不再进行优化了,可以根据自己的想法对代码进行优化,这只是给自己刚学习使用pageobject三层架构的一个记录。

你可能感兴趣的:(UI自动化,selenium,python)