普通元素
1 文本输入框
1.1 输入文本
Wait Until Element Is Visible xpath=//*[@id="username"] 5 Clear Element Text xpath=//*[@id="username"] Input Text xpath=//*[@id="username"] ${username}
1.2 获取文本
Wait Until Element Is Visible css=.salus-form-explain-outside 5 ${return_value} Get Text css=.salus-form-explain-outside Return From Keyword ${return_value}
2 普通button
3 普通link
或 click link
4 label文本
可以直接用page should contain 校验
5 option选项框
Ride中,按F5,搜索select 相关的关键字,可以找到option选项框的一些可以使用的关键字;
6 复选框
Ride中,按F5,搜索checkbox,可以找到复选框的一些可以使用的关键字;
7 单选按钮
Ride中,按F5,搜索Radio,可以找到复选框的一些可以使用的关键字;
8 位置选择
直接click element
9 alert处理
Dismiss alert
Get Alert Message
等
Ride中,按F5,搜索alert,可以找到alert的一些可以使用的关键字;
10 提示框处理
Get text 获取提示信息
Choose Ok on next confirmation
11 确认框处理
Get text 获取提示信息
click element 确定或取消按钮,关闭确认框
特殊元素
1 点击下拉 li菜单
先click 上级菜单
然后 wait untl page contains element 下级菜单链接
然后click element下级菜单的链接
2 悬停下拉li菜单
先 Mouse over 上级菜单
然后 focus 下级菜单
然后 Mouse Over 下级菜单
然后 click element 下级菜单(chrome用execute Javascript $(‘下级菜单css定位’).click())
3 悬停下拉li动态选项框
步骤1:点击展开下拉选择框;
步骤2:根选择指定的区域;
4 日期选择输入框
上面这种日期选择框,可以直接用input text来输入起止日期;
今天——近30天,则都是link,可以直接click element来操作;
5 点击弹出选择窗口
上述这种选择窗口,直接点击清除,然后定位筛选输入框,输入查询的选项,然后select checkbox 定位到要选择的那个选项,或直接click element定位到复选框,最后点击窗口外面的空白处,完成输入;
6 control slider滑块
使用Drag And Drop By Offset (locator,xoffset,yoffset)
其中locater定位到滑块元素(可拖动的那个小块),xoffset为滑块横向偏移像素单位,正整数向右移动,负整数向左移动,yoffset为上下纵向偏移像素单位,正整数向上,负整数向下;
当想要移动到最右端或最左端,查看滑条的总长度,不要忘记扣掉拖动的小块的长度,如滑条轨道长度为213,小滑块长度为3,则210即可滑动到最右边;
7 带链接的动态列表各值获取
页面代码如上的一个鼠标悬停后展示下拉菜单,下拉菜单的选项个数的获取
可以通过
execute javescript return $("#mc-main-inner > div.main-content.wcs-main-content.wcs-space > div.account-nav.clearfix > div > div.account-item > ul > li").length;
这里为了验证下拉菜单各选项是否正确,且反正要从数据库查选项ID;直接从数据库查询了选项的个数、选项名称、选项ID;
处理思路:
首先,从数据库查询数据选项个数、选项名称、选项ID,三元组,保存在@{Ln}中;
然后,等待页面中的选项框展示,FOR循环,比对要选择的选项名称,找到选项在数组中的下标,从而找到选项ID值所在数组下标;
接着,鼠标mouse over悬停到选项框上级菜单,展示下拉菜单,然后evaluate 将选项ID值转换为整型;
最后,执行 execute Javascript reload(${选项名称对应的ID}),等待加载后,检查选项框应显示选中的选项名称;
2.2.10 上传文件
使用AutoIt的相关关键字,可实现上传文件窗口的操作
处理流程:
首先,点击上传文件按钮,打开了window的打开文件窗口;
然后,win wait等待打开文件窗口展现,Win Active,将操作焦点转移到打开文件窗口
sleep 2秒,等待焦点转移完成,
Control Focus 到打开窗口的编辑框
Control set text,在打开的编辑框Edit1中输入要上传的文件路径
sleep 2秒,等待输入完成
Control Focus 到打开按钮,control click点击打开
sleep 2 秒,等待打开上传文件完成,
最后,Win close 关闭打开文件窗口,完成上传操作
如何定位打开文件的窗口呢?使用AutoItV3中的 AutoIt Window Info(x86)工具,如下图,打开工具;
点击 Finder Tools,按住,拖动到,打开文件窗口的文件名输入框,会自动获取该窗口的信息;Title,编辑框的control值:Edit1;
拖动到“打开”按钮,则可以获取它的信息button1
2.2.11 下载文件
处理流程:
(1)找到要下载的文件的链接,右键点击链接;
(2)等待右键菜单出现后,模拟键盘输入K(快捷键:另存为)
(3)Win wait 等待另存为窗口出现,然后Win Active 激活窗口,输入要下载保存的路径
(4)点击保存按钮,完成下载操作,关闭另存为窗口;
(5)等待文件下载,检查文件已下载到指定目录,Operating System库中的 should exist关键字
(6)Operating System库中的 Remove File,删除刚刚下载的文件,方便下次运行本条用例,不用改参数;
2.2.12 浏览器打开新页签和地址
2.2.13 浏览器切换窗口
按F5,查询该关键字,获取更多使用方法的介绍;
2.2.14 翻页操作
${nPage}= 选择每页显示记录数 ${pagesize} #返回页面中获取的总页数
${forNumber}= Evaluate int(${nPage}-1)
Run Keyword If ${nPage}>1 循环检查点击下一页 ${forNumber} ${nPage} ELSE IF ${nPage}==1 LOG 总页数为1不可点击下一页 ELSE LOG 获取总页数错误
Run Keyword If ${nPage}>1 点击首页
Run Keyword If ${nPage}>1 循环检查点击上一页 ${forNumber} ${nPage} ELSE IF ${nPage}==1 LOG 总页数为1不可点击上一页 ELSE LOG 获取总页数错误
Run Keyword If ${nPage}>1 点击尾页 ${nPage}
Sleep 3
输入跳转页数跳转 ${pageN} ${nPage}
以上是翻页的流程模板,里面还有自定义关键字:
(1)选择每页显示记录数
(1)_1 根据记录总数计算总页数
${r}= 获取记录总数
${n}= Evaluate math.ceil(int(${r})/int(${pagesize})) math
${N}= Convert To Integer ${n}
${pages}= Convert To Integer ${pagesize}
${R}= Convert To Integer ${r}
${calc_np}= Run Keyword If ${R}<=${pages} Set Variable 1 ELSE IF ${R}>${pages} and (${R}-${N}*${pages})>0 Evaluate int(${N}+1) ELSE IF ${R}>${pages} and int(${R}-${N}*${pages})==0 Evaluate int(${N}) ELSE LOG 页数计算错误
(1)_1_1 获取记录总数
(1)_2 获取页面中总页数
(2)循环检查点击下一页
(2)_1点击下一页
(2)_1_1 检查当前页面记录数
(2)_1_1_1获取当前页面pageSize
(2)_1_1_2统计当前页面列表记录数
(2)_1_2获取当前为第几页
(3)点击首页
(4)循环检查点击上一页
(5)点击尾页
(5)_1 计算尾页应该显示的记录数
(6)输入跳转页数跳转
2.2.15 模拟键盘输入
Press key 关键字,可以模拟键盘向某个元素输入内容,输入参数为ACSII码
如果是windows接收输入,则使用win32api模块的 win32api.keybd_event(),第一个参数为输入的字符的ASCII码;
百度ASCII码表
2.2.16 鼠标右键点击
其中 Right Click Element 为自定义lib中的函数
2.2.17 evaluate 的一些使用方法
(1)用于计算,见关键字说明,导入python的某个模块,调用模块中的某个方法进行计算的操作
例如,导入math,使用math.ceil(),来做向上取整计算;
(2)执行简单python语句
2.2.18 Convert to 转换数据类型
输入 convert,按 ctrl+alt+space,补充查询出相关的关键字;
2.2.19 变量的声明赋值、使用(参考齐涛-道长博客)
2.2.19.1变量的声明
1、变量标识符
使用变量标识符{变量名} 来进行表示, Scalar变量用 $ 作为标识符${x},List型变量用 @ 作为标识符,@{x}
2、变量声明
因为RF底层是Python,变量不需要特定声明,只要有初始化赋值即可使用。
比如我们可以在TestSuite上点右键或者在Edit区点Add Scalar或Add List来新增变量。
实际上也可以看做另一种形式的变量赋值,一般相当于使用Set Variable进行初始化赋值。
3、变量赋值
1)Set 赋值
通常这种方式主要使用Set Variable或类似的使用了Set的关键字对变量进行赋值。例如:
2)Get 赋值
主要用于返回值上,包括系统关键字的返回值和用户关键字的返回值(从广义上说,Set那个也是返回值),例如:
3)运行时赋值
详见流程与数据分离最后一篇,使用小v 的argument。
比如以上的一个case,在ride的RUN页面中,在Arguments栏输入参数 -v testURL:http://www.baidu.com/ -v searchText:啦啦啦,接着运行,这个是运行时赋值;
特别注意:如果一个变量没有经过赋值,使用时会报错的。
4、变量的作用域
通常情况下,每个变量默认都是局部变量。
一个case里的变量,作用域在这个case内部;
一个userkeyword里的变量,作用域在这个userkeyword内部;
一个文件型suite里的变量,作用域在这个suite内部,所有下面的case也都可以使用。
一个目录型suite里的变量,作用域在这个目录内,他下面的文件型suite是无法使用的,所以一般在目录下新增变量没有太大意义。
作用域是可以修改的,即通过一些系统关键字,对变量进行作用域的设定,常用的关键字有:
Set Global Variable ——设定全局级变量
Set Suite Variable ——设定suite级变量
Set Test Variable ——设定case级变量
2.2.19.2 变量的使用
其实使用变量我觉得不需要说太多了,变量的赋值可以看一下用户关键字的返回值部分,里面的单个返回值和多个返回值其实就是给单个变量赋值和多个变量赋值的例子了。
这里再列几种之前没有写过的例子吧。
1、在判断中使用
例如这样写,在第二行的判断中可以直接写判断条件,现在的条件成立,于是运行结果如下:
2、字符串使用
如果想把变量作为一个字符串的一部分,可以直接这样写
运行结果如下:
实际上默认情况下RF里的变量都是字符型的,并且两个字符串连接不要加什么符号,直接连起来就行了。
如果你写成aaa+${text}bbb,最终结果就是aaa+123bbb,他会把你写的任何内容都当作字符串的。
3、参与运算
看了上面的例子之后,可能有人说我想用123作为数值进行计算该怎么用。
这里要用到一个关键字Evaluate。先看个例子:
运行结果如下:
他的作用是可以让你加载Python的一些库,依赖于Python的语法,相当于直接运行对应的Python语句得到结果。
像上面的例子没有加载库,因为加减乘除这些是Python基本库就有的。下面放一个加载Python库的,如下图,他加载了random和sys两个库,并使用相应的语句生成一个随机数。
运行结果:
具体可以参考一下RF的userguide文档中BuiltIn部分。
2.2.20 Run Keyword If 条件分支
判断条件,分支执行,经常用到
里面的 condition会用python语法进行判断,相当于执行了evaluate(下一讲会讲到)。那么具体的可以在http://docs.python.org/lib/truth.html.查到。
常用的贴几个:
Operation Result Notes
x or y if x is false, then y, else x (1)
x and y if x is false, then x, else y (2)
not x if x is false, then True, else False (3)
Operation Meaning Notes
< strictly less than
<= less than or equal
> strictly greater than
>= greater than or equal
== equal
!= not equal
is object identity
is not negated object identity
!=也可用<>,但是建议都用!=
条件里加上数学运算也可以,我就不一一列举了。
2.2.20 For循环(参考齐涛-道长博客)
这个功能一直就在系统里支持,只是FOR的写法有点特殊,要在前面加上冒号。直接在F5的关键字搜索里是找不到的,但是关键字搜索里能找到的是EXIT FOR LOOP,当时看到这个关键字就想到了应该是有FOR循环的,否则也不会有一个退出循环的关键字了。
FOR循环结构如下:
:FOR 循环变量 IN RANGE end
:FOR 循环变量 IN RANGE start end step
循环体为接下来的缩进代码
或
:FOR 循环变量 IN a <b,c,...>
循环体为接下来的缩进代码
还是先贴上2个例子。
1、IN RANGE:
IN RANGE主要是用一个整数序列做循环的计数器,如图的IN RANGE 10,运行时就是从0到9,如果写IN RANGE 1 10,那就是从1-9。
需要注意的就是RANGE里不会执行到最后那个数字,也就是10是不执行的,到9就结束了。如果你想执行到10,那就写IN RANGE 11。
如果IN RANGE后面只写一个数字N,那么就是从0到N-1的整数序列。
当然既然是序列也可以加step步进,即序列的间隔。如果要加step,就必须把起始和结束的数字都写上,然后在后面写上step,可以是正数也可以是负数,如下图就是一个负数step的例子:
2、IN:
IN的用法就比较自由了,你可以把IN后面的内容理解为一个LIST变量的全部元素,这个循环相当于遍历每个元素。这里的元素可以是字符串,也可以是数值,随意。
所以你可以像我那样把元素直接写出来,也可以直接放一个@{}的LIST变量。比如下面这样:
运行结果如下:
具体使用IN还是IN RANGE看具体需要,我只提供例子,大家自行选择具体方法。
比如你写IN 1 2 3 4 5 6 7 8 9 就不如直接用IN RANGE 1 10,效果都一样,像我这样的懒人肯定愿意用后者。
3、双重循环
以前写vbs的FOR循环可以这样写:
FOR i=1 to 10
FOR J=1 to 8
do something
next J
next i
但是目前RF这里的FOR循环无法直接支持这样做,只能间接的做。
首先另外新增一个user keyword,比如我下面这个forJ
然后在前面那个for循环里调用这个forJ,这样就实现出了上面那种效果了。
运行结果,太长了,只贴最后的部分吧。
如果要在forJ里使用变量${i}的值,可以把forJ加上一个入参,把${i}传过去就好了
2.2.21 日期计算
用get time