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()函 ...
随机推荐
- 深入V8引擎-AST(1)
没办法了,开坑吧,接下来的几篇会讲述JavaScript字符串源码在v8中转换成AST(抽象语法树)的过程. JS代码在V8的解析只有简单的几步,其中第一步就是将源字符串转换为抽象语法树,非常类似于v ...
- spring 5.x 系列第11篇 —— 整合memcached (xml配置方式)
文章目录 一.说明 1.1 XMemcached客户端说明 1.2 项目结构说明 1.3 依赖说明 二.spring 整合 memcached 2.1 单机配置 2.2 集群配置 2.3 存储基本类型 ...
- 继承Comparable接口来实现排序
1.java代码里进行排序(若sql能排序,就不要用代码排序) 可以继承Comparable接口来实现,若是在类中,可以声明Comparator对象,来进行比较 List<Map> map ...
- git的基本指令
更多详情请看廖雪峰官方网站 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1.删 ...
- vscode解决同步设置插件连接不上git
vscode有一款比较好用的插件,就是设置同步.可以在一台电脑上同步另一台电脑的所有配置及插件! Settings Sync 但是在公司电脑有个奇葩问题,就是连接不上git. 解决:配置代理 &quo ...
- django-haystack+whoosh+jieba实现中文全文搜索
先上效果图 附上个人网站:https://liyuankun.cn 安装依赖库 注意:这里我们不安装django-haystack,因为要添加中文分词的功能很麻烦,所以我直接集成了一个中文的djang ...
- c# 开发ActiveX控件,添加事件,QT调用事件
c# 开发 ActiveX 的过程参考我的另一篇文章 : https://www.cnblogs.com/baqifanye/p/10414004.html 本篇讲如何 在C# 开发的ActiveX ...
- iOS组件化开发一使用source管理远端库升级(四)
一.克隆远端库代码到本地选择master分支 1.克隆 2.代码会显示出你所有版本的tag 二.可以在Example目录下验证代码的正确行: cd 到库的文件夹然后 pod install comma ...
- 使用@Transactional注意的问题
@Transactional 基本原理概述 在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@ ...
- IDEA永久使用
IDEA永久使用 一.在https://www.cnblogs.com/zyx110/p/10799387.html中下载下面图片中箭头所指的部分 下载完成后双击打开,除了以下图片提示内容,一路下一步 ...