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()函 ...
随机推荐
- vue-cli3.x npm create projectName 报错: Unexpected end of JSON input while parsing near......
npm 版本与node版本还有webpack版本之间的问题 清理缓存,“ npm cache clean --force " 一切OK
- .NET开发框架(一)-框架介绍与视频演示
本文主要介绍一套基于.NET CORE的SPA高并发.高可用的开发框架. 我们暂且称它为:(让你懂.NET)开发框架. 以此为主线,陆续编写教程,讲述如何构建高并发.高可用的框架. (欢迎转载与分享) ...
- Kafka 学习之路(四)—— Kafka消费者详解
一.消费者和消费者群组 在Kafka中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka之所以要引入消费者群组这个概念是因为Kafka消费者经常会做一些 ...
- php中使用trait设计单例
trait Singleton { private static $instace = null; private function __construct() { } private functio ...
- Java学习笔记——设计模式之六.原型模式(浅克隆和深克隆)
That there's some good in this world, Mr. Frodo. And it's worth fighting for. 原型模式(prototype),用原型实例指 ...
- 微信小程序地图开发总结
最近在做一个微信小程序地图插件,通过传入起始位置名称和经纬度信息,就可以跳转到路线规划插件页面中,在该页面中,可以根据起始位置查询自驾,公共交通,步行等方式的路线信息,并且在地图上显示路线信息,在这个 ...
- MediatR一个.net中简单好用的中介者模式实现方案
MediatRGit地址:https://github.com/jbogard/MediatR 1.安装妞盖特包 一般来说只需要安装一个MediatR就行了,.net core程序需要再安装一个Med ...
- Programming In Lua 第一章
1,Lua可以嵌入其他应用程序(如CGILua或IUPLua). 2,lua代码的语句,分号是可以省略的.同一行可以有多条lua语句,最好用分号隔开(当然也可以不隔开) 3,外壳与lua解释器的区别. ...
- 关于Lombok和自动生成get set方法
在Java开发的项目里面免不了要用很多的get set 以及toString之类的方法,有时候确实是很繁琐而且做着重复共同工作,我们有没有办法来简化这个过程呢,当然有. Lombok就可以很好的解决这 ...
- Java基础介绍运行机制笔记
1. 基础知识点图解 编程语言核心结构:变量.基本语法.分支.循环.数组.…… Java面向对象的核心逻辑:OOP.封装.继承.多态.接口…… 开发Java SE高级应用程序:异常.集合.I/O.多线 ...