引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面。
( @齐涛-道长 新浪微博)
这一讲我们重点来介绍一下一个常用的关键字evaluate。
我觉得这个关键字在RF里几乎是无所不能,只要你略懂python语法,evaluate能让你直接运行python脚本。这样可以在Library没有给你提供你想要的方法时,直接用python脚本来实现你想要的方法。
下面我们列举一些常用的用法,这只是我演示的例子,实际的用途还有更多,欢迎大家自行研究。不熟悉python语法的就去查查python的帮助文档。
1、生成随机数
首先在第一个用法的同时,介绍一下这个关键字。
Evaluate有2个参数,一个是表达式,一个是模块。如图中弹出的窗口,里面有样例。他既可以进行逻辑运算,得到True或False的结果,如例1;也可以调用python的基础函数,如例2,;还可以调用特定的库,如例3;也可以调用多几个库,如例子4。
但是因为evaluate只能处理一行代码(个人理解),所以如果是很复杂的代码还是放到测试库里去实现比较好。
接下来说第一个,生成随机数,整数。其实和样例一样很简单,没用很复杂的,大家可以根据需要自己修改随机数的范围。
运行结果为:
2、字符串
主要是通过看python帮助找到了一些字符串的集合。
上面主要是列举了一下string里的常量,相当于不同字符的集合吧,有什么用处呢?在第二行可以看到一个简单的应用。看看运行结果:
每个都是所属字符的集合,英文大家自己找一下翻译吧。
PS:上面的像乱码一样的东东我也不知道是啥哈。。。
3、生成随机字符串
刚才说了,第2个里面那么多常量有什么用呢?下面来结合一下。
我先选定一个string的常量,然后判断他的长度,设定要生成多少位长度的字符串,然后使用循环生成我需要的随机字符串。实际上该方法在我的QTLibrary里有实现,只不过想试一下,在RF里也可以实现同样的方法。
放一下我的QTLibrary里面类似的方法如何实现的,核心代码差不多,实际代码略有差异。虽然RF里实现略复杂,但也能实现出来,不得不感叹一下RF的强大,之前有人问过我RF的特点,我的理解是:”像写案例一样写代码,像写代码一样写案例“。
好了,还是运行一下RF里面的案例吧,中间加了很多log,只截一下前面和最后的运行结果:
4、去除字符两边的空格,及其他一些字符操作。
第2行是去掉字符串空格的操作,第3行是替换字符的操作。
第7、11行是用来处理一些中文显示的,以后有机会细说中文处理的吧,虽然python本身就处理中文不是很好,有时候还是会有些问题,但第11行还是能把一些中文的unicode编码转成中文显示出来的(很奇怪个别同事的电脑上配置和我一样,但是在某些中文处理总报错)。
第12行是计算字符串里的”行“字的个数。
最后几行是一个字符串连接和字符串替换。
其他的行可能是之前写的多余的代码没有去处理,可跳过。这是以前就写在一起了,懒得分开了,大家将就着看吧。
好了,对照一下前面列的几个点来看运行结果:
可以看到,一开始aaa是两边都有空格的,处理后没有空格了。剩下的对照一下脚本看结果吧:
5、日期加减
其实昨天在群里讨论到日期的地方,我整理了一下大概有三种:
a、如果对日期无要求的,直接写死就好了。这个我就不列了,应该不难吧,有需要的再联系我。
b、需要用当前的日期进行加减的,可以直接用get time这个关键字,后面可以跟上你需要返回的值,以及日期的加减,如第一行就是加一天。
c、需要用一个指定日期进行加减的,指定日期可能是从页面获取的。从第2行到第7行可以解决这个问题,当然我现在这是举例,偷懒一下就用系统日期了;如果是从页面获取,那就是把第2行和第3行换成你的日期获取的脚本即可。
有的命令比较长的,显示不出完整的,我写在下面。
第7行的代码:
datetime.date(int('${year}'),int('${month}'),int('${day}'))+datetime.timedelta(days=int('${addDays}'))
${addDays}是用来进行加减的,也可以写成-2,后面运算时就会减2天,如果你想加减其他的,比如时分秒,就修改timedelta里面的days=这个参数,具体哪些可以用的查一下python帮助文档。
顺便说一下为什么写成这样带引号的,首先datetime.date的几个参数都要用int类型的,所以我用int了一下变量,但是后来发现,在int时,有时候会出现一些报错,我不记得报错原因了,但是有的机器报错,有的不报,然后就给变量上加了引号来解决这个问题。欢迎各位自己尝试一下。
第9行的代码:
time.strftime("%Y-%m-%d-%H-%M-%S")
这个是格式化时间显示的,你可以根据自己的需要来处理。下面看看运行结果:
6、执行dos命令
RF里也可以执行dos命令,很神奇么?
我先在D盘SVN目录下准备了一个qt目录,然后执行rd来删除他,最后用个dir命令来打印结果到D盘的test.txt文件里。
先运行一下看看:
看到结果很奇怪吧,这是啥意思呢?我之前根据结果,只知道0是成功,不成功的有1啊,2啊之类的。后来找度娘查了一下:
因此我们的第一个删除目录的命令肯定是失败了,为啥呢?其实我是在目录里放了个文件,用过dos的rd命令的都知道,这个命令删除目录需要目录为空,除非你带/s的参数,就算带了/s还要有个确认的过程,所以还要带上/q。
虽然第一个失败了,但是第二个还是成功了的,因为他返回了0,所以我们看一下第二个的结果:
大家可以看到,我直接用的dir,他当前的目录实际上是测试脚本所在的目录。
然后我修改了一下脚本,先删除一下那个文件,当然你也可以按我前面说的直接加上 /s /q 的参数。
再执行一次,看看结果:
7、打印系统值
这是顺着前不久群里的朋友问的问题顺手做了一个。
这几个值的结果还略有不同,大家根据自己的需要选择使用吧:
总结一下,Evaluate这个方法非常有用,你可以发挥你的想象,尽情的使用他吧。不过切记开头说的,如果特别复杂的逻辑,还是用test library来实现吧。希望本篇对大家有所帮助。
个人感觉基础篇其实差不多了,我后续的更新计划主要有介绍不同的测试库、修改现有的RF库S2L库、自己动手写测试库等,大家觉得还有什么需要了解的可以提前反馈给我,我可以适当调整顺序。