Robot Framework:Web自动化之-元素处理

普通元素
1 文本输入框
1.1 输入文本css

Wait Until Element Is Visible	xpath=//*[@id="username"]	5
Clear Element Text	xpath=//*[@id="username"]	
Input Text	xpath=//*[@id="username"]	${username}

  

1.2 获取文本html

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 普通buttonpython

3 普通linkchrome

或 click link数据库


4 label文本
能够直接用page should contain 校验windows

5 option选项框api

Ride中,按F5,搜索select 相关的关键字,能够找到option选项框的一些可使用的关键字;数组

6 复选框浏览器

Ride中,按F5,搜索checkbox,能够找到复选框的一些可使用的关键字;less


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变量的声明
一、变量标识符
使用变量标识符{变量名} 来进行表示, Scalar变量用 $ 做为标识符${x},List型变量用 @ 做为标识符,@{x} 
二、变量声明
由于RF底层是Python,变量不须要特定声明,只要有初始化赋值便可使用。
好比咱们能够在TestSuite上点右键或者在Edit区点Add Scalar或Add List来新增变量。

实际上也能够看作另外一种形式的变量赋值,通常至关于使用Set Variable进行初始化赋值。
 
三、变量赋值
1)Set 赋值
一般这种方式主要使用Set Variable或相似的使用了Set的关键字对变量进行赋值。例如:

2)Get 赋值
主要用于返回值上,包括系统关键字的返回值和用户关键字的返回值(从广义上说,Set那个也是返回值),例如:

3)运行时赋值
详见流程与数据分离最后一篇,使用小v 的argument。

好比以上的一个case,在ride的RUN页面中,在Arguments栏输入参数 -v testURL:http://www.baidu.com/ -v searchText:啦啦啦,接着运行,这个是运行时赋值;
特别注意:若是一个变量没有通过赋值,使用时会报错的。
 
四、变量的做用域
 一般状况下,每一个变量默认都是局部变量。
一个case里的变量,做用域在这个case内部;
一个userkeyword里的变量,做用域在这个userkeyword内部;
一个文件型suite里的变量,做用域在这个suite内部,全部下面的case也均可以使用。
一个目录型suite里的变量,做用域在这个目录内,他下面的文件型suite是没法使用的,因此通常在目录下新增变量没有太大意义。
做用域是能够修改的,即经过一些系统关键字,对变量进行做用域的设定,经常使用的关键字有:
Set Global Variable ——设定全局级变量
Set Suite Variable ——设定suite级变量
Set Test Variable ——设定case级变量
 
2.2.19.2 变量的使用
其实使用变量我以为不须要说太多了,变量的赋值能够看一下用户关键字的返回值部分,里面的单个返回值和多个返回值其实就是给单个变量赋值和多个变量赋值的例子了。
这里再列几种以前没有写过的例子吧。
一、在判断中使用

例如这样写,在第二行的判断中能够直接写判断条件,如今的条件成立,因而运行结果以下:

 
二、字符串使用
若是想把变量做为一个字符串的一部分,能够直接这样写

运行结果以下:

 
实际上默认状况下RF里的变量都是字符型的,而且两个字符串链接不要加什么符号,直接连起来就好了。
若是你写成aaa+${text}bbb,最终结果就是aaa+123bbb,他会把你写的任何内容都看成字符串的。
 
三、参与运算
看了上面的例子以后,可能有人说我想用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个例子。
一、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的例子:

 
二、IN:

IN的用法就比较自由了,你能够把IN后面的内容理解为一个LIST变量的所有元素,这个循环至关于遍历每一个元素。这里的元素能够是字符串,也能够是数值,随意。
因此你能够像我那样把元素直接写出来,也能够直接放一个@{}的LIST变量。好比下面这样:

运行结果以下:

 
具体使用IN仍是IN RANGE看具体须要,我只提供例子,你们自行选择具体方法。
好比你写IN  1  2  3  4  5  6 7 8 9 就不如直接用IN RANGE 1 10,效果都同样,像我这样的懒人确定愿意用后者。
 
三、双重循环
之前写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

相关文章
相关标签/搜索