当前位置:网站首页>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
边栏推荐
- Choreographer全解析
- org.apache.parquet.schema.InvalidSchemaException: A group type can not be empty. Parquet does not su
- Nifi 快速安装及文件同步操作
- 使用Postman进行Mock测试
- Elmo (bilstm-crf + Elmo) (conll-2003 named entity recognition NER)
- Quartus prime hardware experimental development (de2-115 board) experiment II function adjustable comprehensive timer design
- Windos中安装labellmg教程
- pthread_self()为何重复了
- [code analysis (7)] communication efficient learning of deep networks from decentralized data
- 微信小程序与低功耗蓝牙通信-往硬件端发送数据(三)
猜你喜欢
基于CM管理的CDH6.3.2集群集成Atlas2.1.0
浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证
[VMware] address of VMware Tools
微信小程序获取登录用户信息、openid和access_token
PySide2
Choreographer full resolution
Business case | how to promote the activity of sports and health app users? It is enough to do these points well
What is the difference between blue-green publishing, rolling publishing and gray publishing?
基础知识学习记录
趣谈网络协议
随机推荐
使用Postman进行Mock测试
33 million IOPs, 39 microsecond delay, carbon footprint certification, who is serious?
JS brain burning interview question reward
JDBC入门
Interesting talk about network protocol
FBS(fman build system)打包
腾讯根据ip解析地址
Elmo (bilstm-crf + Elmo) (conll-2003 named entity recognition NER)
Quartus Prime硬件实验开发(DE2-115板)实验二功能可调综合计时器设计
Oracle告警日志alert.log和跟踪trace文件中文乱码显示
Autumn recruitment in 2021, salary ranking No
Un modèle universel pour la construction d'un modèle d'apprentissage scikit
快捷键(多行)
Redis docker 安装
Choreographer全解析
Jenkins construction and use
微信小程序的订阅号开发(消息推送)
How does redis solve the problems of cache avalanche, cache breakdown and cache penetration
Pytorch 经典卷积神经网络 LeNet
nodejs通过require读取本地json文件出现Unexpected token / in JSON at position