项目框架结构
目录结构
项目封装
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
文件夹下,测试报告命名为自动化测试