RobotFramework_3.SeleniumLibrary操作(一)
RobotFramework_3.SeleniumLibrary操作(一)
*:first-child {
margin-top: 0 !important;
}
body>*:last-child {
margin-bottom: 0 !important;
}
/* BLOCKS
=============================================================================*/
p, blockquote, ul, ol, dl, table, pre {
margin: 15px 0;
}
/* HEADERS
=============================================================================*/
h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
}
h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
font-size: inherit;
}
h1 {
font-size: 28px;
color: #000;
}
h2 {
font-size: 24px;
border-bottom: 1px solid #ccc;
color: #000;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
color: #777;
font-size: 14px;
}
body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}
/* LINKS
=============================================================================*/
a {
color: #4183C4;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* LISTS
=============================================================================*/
ul, ol {
padding-left: 30px;
}
ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}
ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}
dl {
padding: 0;
}
dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}
dl dt:first-child {
padding: 0;
}
dl dt>:first-child {
margin-top: 0px;
}
dl dt>:last-child {
margin-bottom: 0px;
}
dl dd {
margin: 0 0 15px;
padding: 0 15px;
}
dl dd>:first-child {
margin-top: 0px;
}
dl dd>:last-child {
margin-bottom: 0px;
}
/* CODE
=============================================================================*/
pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}
pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre code, pre tt {
background-color: transparent;
border: none;
}
kbd {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
background-color: #DDDDDD;
background-image: linear-gradient(#F1F1F1, #DDDDDD);
background-repeat: repeat-x;
border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
border-image: none;
border-radius: 2px 2px 2px 2px;
border-style: solid;
border-width: 1px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
line-height: 10px;
padding: 1px 4px;
}
/* QUOTES
=============================================================================*/
blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}
blockquote>:first-child {
margin-top: 0px;
}
blockquote>:last-child {
margin-bottom: 0px;
}
/* HORIZONTAL RULES
=============================================================================*/
hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}
/* TABLES
=============================================================================*/
table th {
font-weight: bold;
}
table th, table td {
border: 1px solid #ccc;
padding: 6px 13px;
}
table tr {
border-top: 1px solid #ccc;
background-color: #fff;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
/* IMAGES
=============================================================================*/
img {
max-width: 100%
}
-->
SeleniumLibrary的使用
页面的元素的定位
我们在操作页面的元素,比如一个按键、输入框之前首先要做的是对页面元素进行定位。
在自动化测试中,页面元素的定位是否准确对用例的执行成功与否起到了关键的作用。
SeleniumLibrary支持几乎所有主流的网页元素定位,比如id、name、xpath表达式、css选择器等
SeleniumLibrary支持两种定位策略,隐式的和显式的
隐式定位
不用指明定位的方式,操作的关键字会调用默认的定位方式,如下图:
使用Click Element点击元素时,使用隐式的定位不指明定位方式,会默认example为元素的id或name属性
不推荐使用这种定位策略
显式定位
显式定位方式要使用:定位方式:对应元素值的方式
如下图:
第一行,点击元素name属性值为foo的元素
SeleniumLibrary支持的元素定位方式如下图:
推荐使用其中的id,name,link,xpath这四种定位方式
使用sizzle或者别名为jquery的定位方式需要Robotframework安装jQuery library
以百度首页的百度搜索输入框为例:
定位这个输入框可以用以下几种方式:
id:kw
name:wd
xpath://[@id="kw"]或//[@id="kw"]
注意定位某个元素时,请确保使用这种定位方式只能定位到唯一一个元素,否则,会定位到相同值的元素在代码顺序中的第一个
SeleniumLibrary3.0之后xpath://[@id="kw"]可简写为//[@id="kw"]
Link这种定位只能用于超链接元素<a>
,例如首页上的“新闻”链接:<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>
输入文本Input Text
将指定文本输入定位的输入框
两个参数:[ locator | text ]
前者是定位符,后者是要输入的文本
只能对
<input>
输入框元素Input Text,否则程序会报错
为了确保输入框在输入前被清空,可以先使用Clear Element Text来清除定位输入框的内容
点击元素
推荐使用:Click Element关键字
Click Button,Click Image,Click Link也可以用于点击按键,图片和链接
但是以上都是元素,所以都可以用Click Element来替代
两个参数:[ locator | modifier=False ]locator定位符为必选参数,modifier为可选参数
modifier为点击时同时按下的按键操作,多个按键使用+号连接
如果要点击某个元素的某个坐标可以使用Click Element At Coordinates
三个参数:定位符,x坐标,y坐标。x、y坐标为距离元素中心点开始计算的值
注释
写代码时添加注释是一个好习惯,有助于执行的人理解代码的执行逻辑,也方便过后修改代码
可以在代码行之后的空列用#来注释,也可以用#注释一行
等待,超时和延迟
在测试用例执行时,就算执行逻辑、定位方式都OK还是有很大概率会执行失败。
这是因为在执行用例时,必须考虑页面显示和页面操作的同步问题,或者说我们必须确保在操作页面元素前,相应的元素已经显示,否则会出现元素找不到的问题。
这个问题在网络延迟高,加载内容较多的页面,或者服务器排队严重时尤其严重。
所以我们必须设置合理的超时时间,等待页面加载或者在演示用例、debug时降低代码运行速度。
显式等待wait ...
显示等待是我们最常用的等待方式,可以根据需要,设置主动的等待时间。
Selenium有很多具体的等待方式,如下图:
我们最常用的显式等待方式是:Wait Until Element Is Visible
作用:等待直到定位的元素可见
参数:[ locator | timeout=None | error=None ]三个参数,一个locator定位符必选,timeout超时时间和error错误为可选
当时间超出超时时间,元素仍不可见会执行失败
error用于覆盖默认的error message
timeout超时时间设置详见下方,Selenium的默认超时时间为timeout=5.0
针对某些JS弹出的窗口,或者AJAX的弹出式菜单,使用Wait Until Page Contains Element来替代Wait Until Element Is Visible
Timeout
在使用Wait...关键字或者与Alert警告框相关关键字时,会使用Timeout超时时间设置。
可以使用Set Selenium Timeout关键字来设置超时时间
参数只有一个:设置的超时时间值,但该关键字有返回值,可以声明一个变量来存
时间格式:只写数字默认单位为秒,例如:0.5 or 42,或者使用Robotframework的时间格式,加上时间单位:1.5 seconds or 1 min 30 s
隐式等待implict wait
隐式等待主要用于打开浏览器时。
可以通过Set Selenium Implicit Wait关键字来设置最大的隐式等待时间
时间单位和上面Timeout格式一样
如果只设置修改当前浏览器窗口的隐式等待时间使用Set Browser Implicit Wait关键字
selenium speed
可以使用Set Selenium speed来延迟Selenium的全局执行速度。
一个参数:每个Selenium命令执行后等待时间值
|Set Selenium Speed|0.5 seconds|
该关键字用于演示用例,或者调试代码时,不要用于保证元素出现或者页面加载!
SeleniumLibrary默认值:timeout=5.0, implicit_wait=0.0,selenium speed=0.0
获取网页元素信息
获取网页元素文本Get Text
作用:获取定位元素的文本
一个必选参数:locator定位符
在使用时一般要用一个变量来存获取到的文本,例如获取百度主页右上角的链接文本:
获取网页元素属性Get Element Attribute
作用:获取定位元素的对应属性值
两个必选参数:locator和属性名
继续用上图作为例子,获取新闻链接的href跳转url属性值:
获取网页元素标题Get Title
作用:获取当前网页标题
没有参数,一般需要变量存放获取的值
获取网页url地址Get Location
作用:获取当前网页url地址
没有参数,一般需要变量存放获取的值
Get locations:获取所有浏览器窗口的url地址
比较预期与实际结果
在自动化测试用例中,对预期和实际结果比较非常重要,单纯的执行操作不失败只能说明功能没有大问题。
通常我们还需要对页面的元素属性、文本值或者网页标题、url进行对比,判断是否是我们想要的结果。
比较常用的判断关键字是:
Should Be Equal
作用:比较预期值和实际值是否一致。
当两个值不一致,语句执行会出错,脚本中断执行。
继续用上面百度主页做例子,获取网页标题和url来判断,打开页面是否是百度主页:
RobotFramework_3.SeleniumLibrary操作(一)的更多相关文章
- RobotFramework_4.SeleniumLibrary操作(二)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- RobotFramework_2.新建项目、新建用例、运行用例和查看测试报告
RobotFramework的使用 新建一个项目 Robotframework-ride的界面 分了四个区域:菜单栏.工具栏.案例及资源区.工作区,如下图: 创建项目 首先,点击File-New Pr ...
- 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化
前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...
- Robot Framework操作
Robot Framework 介绍 RobotFramework是一款基于python的开源自动化测试框架,遵守Apache License 2.0协议,在此协议下所有人都可以免费开发和使用.因为R ...
- robotframework框架 - seleniumLibrary 关键字解读-全攻略
在robotframework当中,要实现web自动化,则需要使用SeleniumLibrary这个库. 目前版本中,有180+关键字.随着版本的更新,关键字的个数和名字也会有所变动. 在网上没有找到 ...
- robot_framewok自动化测试--(8)SeleniumLibrary 库(selenium、元素定位、关键字和分层设计)
SeleniumLibrary 库 一.selenium 1.1.Selenium 介绍 Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试,但并不只局限于此,同时支持所有基 ...
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
随机推荐
- T4生成实体和简单的CRUD操作
主要跟大家交流下T4,我这里针对的是mysql,我本人比较喜欢用mysql,所以语法针对mysql,所以你要准备mysql的DLL了,同理sqlserver差不多,有兴趣可以自己写写,首先网上找了一个 ...
- docker命令总结
用 docker pull 拉取镜像 root@lishichao-virtual-machine:~# docker pull hello-world Using default tag: late ...
- CSS3文本与字体
一.CSS3 换行 1.word-break(规定自动换行的处理方法) word-break: normal / break-all / keep-all; /* normal:使用浏览器默认的换行规 ...
- 不懂数据库索引的底层原理?那是因为你心里没点b树
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 前几天下班回到家后正在处理一个白天没解决的bug,厕所突然传来对象的声音: ...
- 使用JavaScript带你体验V8引擎解析字符串过程
AST模块其实要写的话,100篇都写不完,我将一些简单知识点翻译成JavaScript代码来进行讲解(v8内部的复杂性永远都能超出我的意料,现在看到万行的源码都已经没感觉了),如果谁想看C++源码,就 ...
- 数字IC后端布局阶段对Tie-high和Tie-low Net的处理
本文转自:自己的微信公众号<集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众平台 ...
- c++学习书籍推荐《C++ Primer Plus中文版(第6版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 一本经久不衰的C++畅销经典教程:一本支持C++11新标准的程序设计图书. 它被誉为“开发人员学习C++的教程,没有之一”! Amazon网站“Langua ...
- 广告过滤器 Adguard Pre v6.4.1814 Lite V2 简约绿色版
下载地址:点我 基本介绍 当你在浏览网页的时候总是弹出广告是不是非常的不爽,小编为伙伴们提供了Adguard Pre简约绿色版,一款专业的广告过滤器.Adguard Pre简约绿色版可以帮助伙伴们完美 ...
- 剑指offer第二版-8.二叉树的下一个节点
描述:给定一棵二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中应定义指向左节点.右节点.父节点的三个变量. 思路: 1.如果输入的当前节点有右孩子,则它的下一个节点即为该右孩子为根节点的子树 ...
- 剑指offer第二版-7.重建二叉树
描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树.假设前序遍历或中序遍历的结果中无重复的数字. 思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍 ...