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操作(一)的更多相关文章

  1. RobotFramework_4.SeleniumLibrary操作(二)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. RobotFramework_2.新建项目、新建用例、运行用例和查看测试报告

    RobotFramework的使用 新建一个项目 Robotframework-ride的界面 分了四个区域:菜单栏.工具栏.案例及资源区.工作区,如下图: 创建项目 首先,点击File-New Pr ...

  3. 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化

    前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...

  4. Robot Framework操作

    Robot Framework 介绍 RobotFramework是一款基于python的开源自动化测试框架,遵守Apache License 2.0协议,在此协议下所有人都可以免费开发和使用.因为R ...

  5. robotframework框架 - seleniumLibrary 关键字解读-全攻略

    在robotframework当中,要实现web自动化,则需要使用SeleniumLibrary这个库. 目前版本中,有180+关键字.随着版本的更新,关键字的个数和名字也会有所变动. 在网上没有找到 ...

  6. robot_framewok自动化测试--(8)SeleniumLibrary 库(selenium、元素定位、关键字和分层设计)

    SeleniumLibrary 库 一.selenium 1.1.Selenium 介绍 Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试,但并不只局限于此,同时支持所有基 ...

  7. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  8. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

  9. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

随机推荐

  1. 关于Git 的管理凭据操作

    1.桌面-->2.我的电脑-->3.右击选择属性-->4.控制面板主页-->5.在用户账户和家庭安全下,选择添加或删除用户账户-->转到“主用户账户”页面-->6. ...

  2. Spring Bean的3种装配方式

    Bean常用的装配方式有3种: 基于xml的装配 基于Annotation(注解)的装配 基于Java类的装配 基于xml的装配 在xml文件中配置Bean. 如果依赖很多,xml配置文件会很臃肿,后 ...

  3. Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  4. (1)Linux文件系统的目录组成

    记忆秘诀:BBDEH OPRLM TLSUV 宝贝的恩惠 欧派入联盟 偷了suv,19   目录 英文释义 简写 详解 1 /   根目录 整个文件系统的唯一根目录 2 /bin Binary 普通命 ...

  5. JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  6. Requests方法 -- 项目实现自动发送邮件

    """1.discover方法里面有三个参数:-case_dir:这个是待执行用例的目录.-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开 ...

  7. c++学习书籍推荐《C++编程思想第一卷》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++编程思想>(第1卷)(第2版)第1版荣获"软件开发"杂志评选的1996年度 图书震撼大奖,中文版自2000年推出以来, ...

  8. Java项目案例之---计算公司员工的工资(面向对象复习)

    计算公司员工的工资(面向对象复习) 某公司的雇员分为以下若干类: Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份.方法:double getSalary(int month) ...

  9. zimg服务器图片数据迁移后,图片404异常的问题解决

    由于zimg特殊的图片存储结构及图片命名规则,其迁移数据应该当相当简单的,仅把对应的存储图片数据的文件夹复制即可.往往简单的东西总会有一些成本在里面,下面是我简单的迁移测试过程中遇到的一些问题,仅供参 ...

  10. 关于红黑树(R-B tree)原理,看这篇如何

    学过数据数据结构都知道二叉树的概念,而又有多种比较常见的二叉树类型,比如完全二叉树.满二叉树.二叉搜索树.均衡二叉树.完美二叉树等:今天我们要说的红黑树就是就是一颗非严格均衡的二叉树,均衡二叉树又是在 ...