当前位置:网站首页>RobotFramework 之 项目框架

RobotFramework 之 项目框架

2022-04-23 14:03:00 沉觞流年

项目框架结构

目录结构

在这里插入图片描述

项目封装

Python配置目录

pylib文件夹下用于放置Python配置文件,dirconfig.py文件用于配置路径,baseconfig.py文件用于配置自定义关键字的内容

dirconfig.py

import os
# 文件及文件夹管理

# 项目路径
base_dir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0]


# 浏览器默认下载目录
download_path = 'C:\\Users\Admin\Downloads'

# 上传目录
upload_path = os.path.join(base_dir,'filepath\\upload')
# 上传文件
file1 = os.path.join(upload_path,'test.xlsx')

baseconfig.py

import os
import time
from robot.api import logger
from pylib import dirconfig
from openpyxl import load_workbook
from openpyxl.worksheet.worksheet import Worksheet

# 去除金额中的逗号并转换成数字类型
def ReturnMoney(money):
    return int("".join(money.split(",")))

# 返回上传文件所在路径
def ReturnPath(userinput):
    if userinput == '测试':
        return dirconfig.file1

# 获取指定路径下的所有文件名称
def GetFileNames(filepath):
    for dirpath,dirnames,files in os.walk(filepath):
        return files    # 返回的是列表,可以有多个文件名称

# 清空指定文件夹下的文件
def CleanFile(filepath=dirconfig.download_path):
    filenames1 = GetFileNames(filepath)
    if 'desktop.ini' in filenames1:
        filenames1.remove('desktop.ini')
    elif filenames1 == []:
        return "文件夹下文件为空"
    else:
        for file in GetFileNames(filepath):
            filename =os.path.join(filepath,file)
            os.remove(filename)
        filenames2 = GetFileNames(filepath)
        if filenames2 == []:
            return "文件夹下文件为空"

# 返回当日日期
def ReturnTime():
    TimeToday = time.strftime("%Y-%m-%d", time.localtime())
    return TimeToday

# 下载的文件名称
def ReturnFilename(userinput):
    if userinput =="测试":
        filename = ReturnTime()+"测试.xlsx"
        return filename

# 校验文件名
def CheckFileName(userinput,download_path=dirconfig.download_path):
    download_filename = GetFileNames(download_path)
    filename = ReturnFilename(userinput)
    if download_filename == []:
        return "该文件夹下没有文件"
    elif 'desktop.ini' in download_filename:
        download_filename.remove('desktop.ini')

    if filename == download_filename[0]:
        logger.info("下载的{}文件名称为:{}".format(userinput, download_filename[0]))
        return "{}文件名称校验通".format(userinput)
    else:
        logger.info("下载的{}文件名称为:{}".format(userinput, download_filename[0]))
        return "{}文件名称校不验通".format(userinput,download_filename[0],)


# Excel文件处理
class ExcelHandler():
    ''' 操作Excel,读取Excel文件里的内容 '''

    def __init__(self, file):
        '''初始化函数'''
        self.file = file

    def open_sheet(self, sheet_name) -> Worksheet:
        '''打开表单'''
        wb = load_workbook(self.file)
        sheet = wb[sheet_name]
        return sheet

    def read_header1(self, sheet_name):
        '''获取表单的表头(第一行)'''
        sheet = self.open_sheet(sheet_name)
        headers = []
        for i in sheet[1]:
            headers.append(i.value)
        return headers

# 校验文件内容
def CheckFile(userinput):
    filename = ReturnFilename(userinput)
    file = os.path.join(dirconfig.download_path,filename)

    if userinput == "测试":
        header = ExcelHandler(file).read_header1("Sheet1")
        logger.info("下载的{}文件表头为:{}".format(userinput,header))
        if header == ['部门编号', '部门名称', '部门级别', '部门剩余金额']:
            return "{}文件表头校验通过".format(userinput)
        else:
            return "{}文件表头校验不通过".format(userinput)

RF配置目录

对于要使用的数据、元素定位等内容,则可以放到rflib目录下。新建一个common.robot文件,用于放置公共变量

common.robot

*** Variables ***

# 登录页面元素定位
@{
    网易邮箱地址}     https://mail.126.com/		https://mail.163.com/
${
    iframe}      xpath=//iframe[contains(@id,'iframe')]
${
    用户名输入框}       xpath=//*[@name="email"]
${
    密码输入框}      xpath=//*[@name="password"]
${
    登录按钮}      xpath=//*[@id="dologin"]

# 账号数据
${
    权限1账号}        用户名1
${
    权限1密码}        密码1
${
    权限2账号}        用户名2
${
    权限2密码}        密码2


# 邮箱页面元素定位
${
    首页按钮}        xpath=//div[3]
${
    写信按钮}        xpath=//span[contains(.,'写 信')]
${
    上传按钮}        xpath=//input[@type='file']
${
    文件名称-测试}        测试
${
    目录-下载}            下载

${
    收信按钮}          xpath=//span[contains(.,'收 信')]
${
    第一封邮件}        xpath=//div[4]/div[2]/div/div[2]/span
${
    查看附件按钮}        xpath=//a[contains(text(),'查看附件')]
${
    附件文件}        xpath=//td/div/img
${
    下载按钮}        xpath=//a[contains(text(),'下载')]

拓展:对于元素定位,使用相对路径,一般情况下,不使用绝对路径。元素定位写的规范,一般后续项目中,即使页面发生了改动,代码改动的内容也会比较少

比如这里 下载按钮 的元素定位,一般不推荐 使用 contains,假设这里还有个按钮,叫下载附件,那么这条 xpath 就会有两个定位到的元素。对于文本的定位,可准确一点 xpath=//a[text()='下载']

元素定位,不一定非要找 class、id这些属性。
比如这里如果根据 class属性去定位,就会有多个,而根据placeholder='开始日期'去定位,就会更加轻松xpath=//input[@placeholder='开始日期']

当然,麻烦一点也没问题,比如定位 结束日期xpath=(//input[@class='el-range-input'])[2],取第二个,就是结束日期,但页面被改动后,这样的定位,就可能找到的不是结束日期了。
在这里插入图片描述

关键字封装目录

WebKeyWord目录用于定义用户关键字,实现业务逻辑

业务关键字.robot

*** Settings ***
Library           Selenium2Library
Resource          rflib/common.robot
Library           pylib/baseconfig.py


*** Keywords ***
登录网易邮箱
	[Arguments]    ${
    账号}=${
    权限1账号}      ${
    密码}=${
    权限1密码}
	# 打开chrome浏览器访问163邮箱
	open browser    ${
    网易邮箱地址}[1]        chrome
	sleep    5
	maximize browser window
	# 切换到iframe
	select frame    ${
    iframe}
	# 用户名输入框中输入 用户名
	sleep    2
	input text    ${
    用户名输入框}      ${
    账号}
	sleep    2
	# 密码输入框中输入 密码
	input text    ${
    密码输入框}     ${
    密码}
	sleep    2
	# 点击登录按钮
	click element    ${
    登录按钮}
	sleep    10

关闭浏览器
	close browser


回到首页
	click element    ${
    首页按钮}
    sleep    10


进入写信页面
	click element    ${
    写信按钮}
    sleep    10

上传文件
    [Arguments]       ${
    上传至网页元素定位}     ${
    文件名称}
    ${
    文件路径}         ReturnPath      ${
    文件名称}
    sleep    1
    wait until page contains element        ${
    上传至网页元素定位}
    choose file     ${
    上传至网页元素定位}        ${
    文件路径}
    sleep    10

进入邮件
    click element      ${
    收信按钮}
    sleep    2
    click element      ${
    第一封邮件}
    sleep    2


下载文件
    [Arguments]          ${
    下载按钮元素定位}
    CleanFile
    sleep    4
    wait until page contains element        ${
    下载按钮元素定位}
    click element      ${
    下载按钮元素定位}
    sleep    10


验证文件名称
    sleep    5
    ${
    校验结果}         CheckFileName       测试
    log       ----------------------开始验证--------------------
    should be true      $校验结果=='测试文件名称校验通'



测试用例目录

TestSuit目录用于放置执行测试用例的robot文件

test.robot

*** Settings ***
Library           Selenium2Library
Library           pylib/baseconfig.py

Resource          WebKeyWord/业务关键字.robot
Resource          rflib/common.robot

Suite Setup       登录网易邮箱
Suite Teardown    关闭浏览器


*** Test Cases ***

测试上传文件
	进入写信页面
	上传文件            ${
    上传按钮}         ${
    文件名称-测试}
	[Teardown]         回到首页


测试下载文件
	进入邮件
	下载文件            ${
    下载按钮}
	验证文件名称
	[Teardown]         回到首页

执行命令

通过命令 robot -P . --name 自动化测试 -d result TestSuit
执行 TestSuit目录下的测试用例,并将测试报告内容文件输出到result文件夹下,测试报告命名为自动化测试

版权声明
本文为[沉觞流年]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_44614026/article/details/115607927