Robot Framework + Selenium2Lib
Robot Framework + Selenium2Lib
最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写、数据驱动管理、测试用例执行管理等一系列工具软件的研发工作,积累了一些经验,在此与大家做一下分享,也算是做一个总结吧,希望能给大家带来启发和帮助。
由于业界没有成熟的解决方案可供参考,本人在研究过程中也是摸着石头过河,纰漏之处在所难免,如果大家有更好的方案,敬请不吝赐教。
分布式并行执行用例需求背景 公司的产品属于web app,采用的是Robot Framework + Selenium2Library 作为自动化测试的框架。
脚本开发完毕,在推广试用的过程中,测试人员反馈了一个问题:当case数量很多的时候,需要执行很长的时间才能跑完,这往往无法跟上产品发布迭代的节奏。他们的要求是:100个case要求在一个小时之内跑完(平均一个case需要3到5分钟)。经过对比和研究,最终决定利用Selenium Grid来将这些case分散到多台机器去执行,通过分布式并行执行的方式,压缩执行时间。
关于Selenium Grid的介绍、运行原理、安装部署等细节,请参考 http://blog.csdn.net/five3/article/details/9428655,在此不作详述。
分布式并行执行用例管理工具一览 为了更好的贴合公司实际需求,我开发了一个winform应用程序来管理case的执行过程。
主要功能包括:
支持本机执行和分布式并行执行这两种执行方式
由于环境和框架本身的不稳定性,需要在脚本出错的情况下(包括case fail掉了或者是robot framework框架出错),能自动对出错的case做一定的重试,以此消除环境的不稳定因素对执行过程的影响。
支持有条件的并行(有条件并行的概念将在后面介绍)。
工具界面如下(左侧是case选择界面,右侧是选项面板和执行结果信息): Robot Framework 与 Selenium Grid 之间的桥梁 Selenium Grid安装好之后,是一个独立的系统,与外界没有任何联系,它不会自动获取case、自动分发请求。所以,要利用Selenium Grid,首先要研究如何把case执行请求发送给Grid。
网上有不少介绍Selenium Grid的文章,多以webdriver的API作为与Selenium Grid交互的途径,典型代码如下:
DesiredCapabilities dc = DesiredCapabilities.firefox(); WebDriver dr = new RemoteWebDriver(new URL("http://192.168.40.67:5555/wd/hub"),dc); dr.get("http://www.baidu.com"); 但是Robot Framework如何与Selenium Grid进行交互呢?我们知道,Robot Framework只是一个自动化测试框架而已,它之所以能够测试各种类型的应用程序,是因为它可以挂接不同的库,比如,挂接Selenium2Library,就可以测试web app,最终执行测试的动作还是由相应的库来完成的。 Selenium2Library对selenium类库做了一下包装,形成了相应的python类,与selenium相关的关键字就是调用这些类的方法,比如:关键字 “open browser” 就是调用的_BrowserManagementKeywords这个类的open_browser方法(python文件路径为C:\Python27\Lib\site-packages\Selenium2Library\keywords\_browsermanagement.py,安装方式不同,路径会略有不同)。
研究这个方法的代码可以知道,参数remote_url的作用与上面RemoteWebDriver类构造方法的第一个参数的作用是类似的。于是,我们可以考虑在这个参数上做文章。那么,我们是否需要修改所有case的脚本,如下图所示加上这个参数呢? 显然,这种方式不好。
两个原因:1. 需要大量的修改现有的脚本;2. 参数是写死的,无法与工具选项设置关联起来。 所以,在不修改脚本的情况下,要同时支持在本地和分布式执行用例,最直接的方法就是修改_BrowserManagementKeywords类的open_browser方法,因为不管是哪种执行方式,这个方法都会被调用。
另外,工具选项面板上的执行方式选项如何通知给这个方法呢?我的办法是通过一个全局桥梁文件来作为彼此通信的纽带,工具依据选项设置生成或者删除桥梁文件;open_browser方法判断文件是否存在并读取文件内容作为remote_url参数的值。
工具选项设置代码片段: //Hub URL存放文件 private const string SeleniumGridHubUrlFilePath = "c:\\SeleniumGridHubUrl.txt"; //生成、删除remote url参数文件 if (this.radioButton1.Checked) { File.Delete(SeleniumGridHubUrlFilePath); } else { File.WriteAllText(SeleniumGridHubUrlFilePath,string.Format("http://{0}:4444/wd/hub",this.textBox3.Text.Trim())); } py文件方法修改: Robot Framework 命令行介绍 打通了Robot Framework与Selenium Grid之间的联系之后,我们开始研究如何通过工具执行case。 在脚本开发调试过程中,一般用的RIDE集成环境,但是如果用工具来管理执行过程的话,就无法再使用RIDE了,只能想别的办法。如果仔细观察过RIDE的一些窗口输出信息的话,一定能注意到它会把本次执行对应的DOS command打印出来,如下图所示: 其实,RIDE就是调用这个命令行来执行用例的,所以我们也可以通过调用命令行的方式来执行用例。由于工具会涉及到执行用例、错误用例重试、合并报告这三种功能,所以这里就简单介绍一下这三个命令。更多命令,可以通过在dos命令行里面输入 pybot --help 查询。 1. 执行用例 --test : 指定要执行的case名称(全路径) --outputdir : log存放路径 --argumentfile : 选项文件路径 参数1 : 要执行的suite路径 示例: 2. 重试用例 -R : 表示要重试错误用例 -d : 本次执行log存放路径 参数一 : 需要执行重试的output.xml文件路径 参数二 : suite路径 示例: pybot -R D:\logs\2014-09-05-18-40-42\remote_1\tag__batch_0\output.xml -d D:\logs\2014-09-05-18-40-42\remote_2\tag__batch_0 D:\自动化测试111\成本系统 3. 合并报告(使用rebot指令,详细说明可以通过 rebot --help 查看) -N : 重命名报告 -d :产生的新log的存放路径 参数一 : 需要合并的log路径(支持通配符) 示例: rebot -N 第1次执行 -d D:\logs\2014-09-05-18-40-42\1 D:\logs\2014-09-05-18-40-42\remote_1\*\output.xml 工具就是通过调用上述三个命令并辅以一定的流程控制逻辑来完成执行、重试、合并报告的功能。 代码片段:首先生成一个批处理文件,然后启动一个DOS命令行窗口执行这个bat文件 //生成参数文件 string argFilePath = @"c:\RFSCommandLine\" + batchTime + "_argfile.txt"; string argFileContent = "--outputdir\r\n" + Path.Combine(logFolder, "1") + "\r\n" + BuildTestCaseCommandOption(selectedCases); File.WriteAllText(argFilePath, argFileContent, Encoding.GetEncoding("utf-8")); //生成批处理文件 batchFilePath = @"c:\RFSCommandLine\" + batchTime + "_1.bat"; content = string.Format(@"pybot.bat --argumentfile {0} {1}", argFilePath, currentProjectPath); File.WriteAllText(batchFilePath, content, Encoding.GetEncoding("gb2312")); //调用批处理文件try{ Process p = new Process(); p.StartInfo.FileName = batchFilePath; p.Start(); p.WaitForExit();} 工具设计思路分析 一. 基本概念介绍 1. hub分发请求的粒度 刚开始研究Selenium Grid的时候,以为只要把所有选中的case放到一个批处理文件里面,然后运行该批处理,这样就可以把执行请求发送给hub,hub就会自动分发请求到各个空闲节点。但事
Robot Framework + Selenium2Lib的更多相关文章
- Robot Framework selenium2library 常用关键字
Selenium Library SeleniumLibrary is a Robot Framework test library that uses the popular Selenium we ...
- Robot Framework用户手册 (版本:3.0)
版权信息:诺基亚网络和解决中心 本翻译尊重原协议,仅用于个人学习使用 1.开始: 1.1 介绍: Robot Framework是一个基于Python的,为终端测试和验收驱动开发(ATDD)的可扩展的 ...
- RIDE -- Robot Framework setup
RobotFramework 是一款基于python 的可以实现关键字驱动和数据驱动并能够生成比较漂亮的测试报告的一款测试框架 这里使用的环境是 python-2.7.10.amd64.msi RID ...
- Robot Framework自动化测试 ---视频与教程免费分享
当我第一次使用Robot Framework时,我是拒绝的.我跟老大说,我拒绝其实对于习惯了代码的自由,所以讨厌这种“填表格”式的脚本.老大说,Robot Framework使用简单,类库丰富,还可以 ...
- Robot Framework 的安装和配置(转载)
Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...
- 解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题
最新的jenkins打开jenkins robot framework报告会提示如下 Verify that you have JavaScript enabled in your browser. ...
- 在centos7中安装Robot Framework
安装前景介绍: 最初,我们是在Windows环境下搭建Robot Framework来对我们的服务进行接口测试的(想知道如何在Windows下安装Robot Framework,可以参考我同事的博客h ...
- 移动端自动化环境搭建-Robot Framework的安装
A.安装依赖 RF框架,robotframework本身. B.安装过程 可以通过下载 exe 程序进行安装,Robot Framework 分别提供了,win-amd64.exe 和 win32.e ...
- robot framework 安装配置
robot framework 是一款专门用作自动化测试的框架,提供了丰富的内置库,与第三方库,也支持用户自己编写的库,robot framework +library 可以 用来做ui的自动化测试, ...
随机推荐
- laravel调试神器tinker
一直以来,想调试框架中的某些东西,如想知道 Elpquent 的 create 方法返回值是个什么东西, 以前的话,应该就是在 create 方法调用之后,使用 dd 或者 var_dump 之类的函 ...
- windows如何要查看IIS连接数
1.运行,输入,perfmon.msc 2.在系统监视器,区域点击,添加计数器. 3.在“添加计数器”窗口,“性能对象”选择Web Service,“从列表选择计数器”选中Current Connec ...
- BFC 块级元素格式化上下文
Block Formatting Contexts: 块级元素格式化上下文块级元素如何对它的内容(子元素:也是一个块元素)进行布局,以及与其它元素(与内容同级别)的关系和相互作用 普通文档流的布局规则 ...
- [DeeplearningAI笔记]卷积神经网络1.6-1.7构造多通道卷积神经网络
4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.6多通道卷积 原理 对于一个多通道的卷积操作,可以将卷积核设置为一个立方体,则其从左上角开始向右移动然后向下移动,这里设 ...
- 很好的脑洞题:dfs+暴力 Gym - 101128A Promotions
http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次 ...
- hbase性能调优案例
hbase性能调优案例 1.人员-角色 人员有多个角色 角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 ...
- Google guava 中的Monitor
synchronized 自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码.Java提供了同步关键字synchronized来实 ...
- 【BZOJ】1576 [Usaco2009 Jan]安全路经Travel
[算法]最短路树+(树链剖分+线段树)||最短路树+并查集 [题解] 两种方法的思想是一样的,首先题目限制了最短路树唯一. 那么建出最短路树后,就是询问对于每个点断掉父边后重新找路径的最小值,其它路径 ...
- SDUT 3918
Description 这一天希酱又补了一卦,没想到每个人都发到了一张印有整数的牌,现在希酱想要继续占卜的话需要知道每个人手里拿的牌的整数具体是多少,但是她们却打起了哑谜. 穗乃果:我拿到的是 2 ...
- HDU 5995 Kblack loves flag (模拟)
题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...