*: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的使用


在开始这部分课程之前,我们需要一个附件网页用来演示以下操作:
请下载以下附件,保存到到电脑某个位置:

文件上传

如果我们按照用户的操作来上传文件,步骤会非常繁琐,而且操作系统的文件夹操作需要另一个库AutoItLibrary的支持,来对操作系统窗口定位和操作,非常麻烦。
这里我们有一个更好的选择,分析上传文件按键的html代码,它实质上是一个<input>元素。

那么我们可以直接对它input text,输入的文本就是文件的路径。

需要注意的是:在Python或Java中的路径表达式中,windows的\要被替换为\\或者/
因为Java或Python中,\是转义字符,单\毫无意义

alert警告框操作

我们在访问网站的时候,有时会突然弹出一个小窗口,上面写着一段提示信息文字。如果你不点击“确定”,就不能对网页做任何操作,这个小窗口就是使用alert实现的。
这个alert的弹出由前端的JS语句决定,但是弹出框本身却不是网页代码的一部分,而是由浏览器弹出,所以我们无法对这个弹出框进行定位和直接Click操作。

SeleniumLibrary这里可以使用Handle Alert关键字来处理

Handle Alert

作用:处理alert弹出框
参数:两个可选参数action和timeout,action默认为ACCEPT,timeout默认为None
ACCEPT:接受alert警告,相当于点击OK或确定
DISMISS:取消alert警告,相当于点击Cancel或取消
LEAVE:离开alert警告,保持alert为打开

timeout设置等待alert弹出的时间,如果不单独设置,会使用全局的timeout设置
此关键字是seleniumLibrary3.0新出现的,取代以前的Choose XXX On Next Confirmation
Alert弹出框有三种分别是alert(只有确定键),confirm(有确定和取消两个按键),prompt(除开两个按键还有一个输入框)

下拉菜单操作

下拉菜单在网页中是<select>元素

下拉菜单未展开的时候,菜单中的选项无法click,我们操作下拉菜单有两种方式:
一种是模拟用户的操作,先click下拉菜单,再click展开的菜单选项
另一种就是使用seleniumLibrary提供的关键字来操作下拉菜单:
Select From List By Index
-- index:<option>选项的index索引值,注意第一项从0开始
Select From List By Label
-- lable:<option>选项中对应文本值
Select From List By Value
-- value:<option>选项中对应value属性值

注意:如果是单选下拉菜单,多于一项有相同值时,最后一项将被选中
如果是多选下拉菜单,多于一项有相同值时,多项将被选中,但是可能之前选中的选项不会被清除

单选框RadioBox和复选框CheckBox操作

单选框RadioBox的操作比较简单,直接按照用户逻辑,要选哪项直接click就可以了

复选框CheckBox的操作稍微麻烦一点,麻烦不在点击动作本身,而是复选框是可以取消点击的。
第一次点击是选中,第二次点击是取消,所以在点击之前最好确定被点击的选项是否已经被选中。

模拟按键Press Key

在网页操作中有时会遇到需要翻页,或者发送键盘按键,这时就需要用到关键字:
Press Key
作用:对定位元素模拟用户按键
参数:两个必选参数locator定位符和key按键
key:按键可以是一个字母、或者\开始的按键的ASCII码值

如果是对整个网页模拟按键,建议使用根元素xpath:/html
\ue0f是python中pageDown下翻页按键码值的unicode编码,其它按键的编码参考下图:


网页内嵌网页frame/iframe切换

frame和iframe都是网页的内嵌网页,当我们遇到某些元素位于frame或者iframe时,如果不对操作的当前页面进行切换,讲无法操作这些元素。
例如这个网站: https://www.layui.com/admin/std/dist/views/

在这个页面中,如果我们要操作右侧的元素,必须先将内嵌的iframe切换为当前页面,否则无法点击。
这里我们需要用到一个关键字:

Select Frame

作用:切换定位符定位的页面为当前页面
参数:一个必选参数,frame的定位符

但是,如果这时我们又要操作左侧面板的元素,会发现又不能操作了,这是因为我们的操作当前页面是右侧页面,这时我们需要把当前页面切换回主页面

Unselect Frame

作用:切换主页面为当前页面
无参数

注意切换网页要分析网页结构,使用select frame只能往当前网页的下级页面切换,所以往上或者往平级的页面切换必须先unselect frame

浏览器窗口切换

当我们点击链接弹出一个新的浏览器窗口时,我们在新的浏览器窗口操作需要手动切换浏览器窗口。

Select Window

作用:切换浏览器窗口到定位符匹配的窗口
参数:一个参数locator默认为MAIN
返回值:前一个窗口的handle

如果定位的窗口被找到,所有随后的操作将基于这个新定位的窗口,直到这个关键字再次被调用。
如果定位的窗口找不到,这个关键字失败,前一个窗口的handle已被返回,可以用来返回前一个窗口。

窗口的定位策略:
- 默认情况下,窗口定位符匹配窗口的handle,name,title,URL,匹配会按照这个顺序匹配第一个符合的窗口。
- 窗口定位符可以具体使用显式的定位策略,使用格式: strategy:value (推荐) or strategy=value支持的策略有:name,title和URL
- 定位符为NEW,最后一个打开的窗口被切换。如果与当前窗口相同将会报错。
- 定位符为MAIN,主窗口被选中。
- 定位符为CURRENT,没什么作用,只是返回当前窗口的的handle。
- 定位符不是一个字符串时,必须是一个被排除的窗口handle list。这个list应该是之前使用Get Window Handles获取的。

这里使用http://news.baidu.com/,点击第一个到第四个新闻链接,来做一个切换窗口的演示。

strategy:value参数只在seleniumLibrary3.0或之后版本支持
之前版本支持的别名:None,Null和空字符串用来切换主窗口,和别名selft切换当前窗口,在3.0版本都过时了
在3.0之前版本匹配窗口的name,title和URL曾是大小写敏感的

RobotFramework_4.SeleniumLibrary操作(二)的更多相关文章

  1. {MySQL的库、表的详细操作}一 库操作 二 表操作 三 行操作

    MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf ...

  2. GIS基础软件及操作(二)

    原文 GIS基础软件及操作(二) 练习二.管理地理空间数据库 1.利用ArcCatalog 管理地理空间数据库 2.在ArcMap中编辑属性数据 第1步 启动 ArcCatalog 打开一个地理数据库 ...

  3. RobotFramework_3.SeleniumLibrary操作(一)

    RobotFramework_3.SeleniumLibrary操作(一) *:first-child { margin-top: 0 !important; } body>*:last-chi ...

  4. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询

    MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...

  5. PHP操作 二维数组模拟mysql函数

    PHP操作 二维数组模拟mysql函数<pre>public function monimysqltest(){ $testarray=array( array('ss'=>'1', ...

  6. JNI操作二维数组

    之前的文章讲解了有关JNI使用方法,这篇文章进阶一点,介绍下JNI操作二维数组的方法.有了之前文章的操作JNI的方法,这里直接上代码了. Java代码部分 package com.testjni; p ...

  7. RabbitMQ原理与相关操作(二)

    接着 上篇随笔 增加几个概念: RabbitMQ是一个在AMQP(高级消息队列协议)标准基础上完整的,可服用的企业消息系统. AMQP模型的功能组件图(上图摘自 Sophia_tj 的 第2章 AMQ ...

  8. 基于VC的声音文件操作(二)

    (二)VC的声音操作 操作声音文件,也就是将WAVE文件打开获取其中的声音数据,根据所需要的声音数据处理算法,进行相应的数学运算,然后将结果重新存储与WAVE格式的文件中去:可以使用CFILE类来实现 ...

  9. jQuery的dom操作(二)转

    addClass() 向匹配的元素添加指定的类名. after() 在匹配的元素之后插入内容. append() 向匹配的元素内部追加内容. appendTo() 向匹配的元素内部追加内容. attr ...

随机推荐

  1. 28个Java开发常用规范技巧总结

    1.类的命名使用驼峰式命名的规范. 例如:UserService,但是以下情景例外:DO / BO / PO / DTO / VO. 例如说:UserPO,StudentPO(PO,VO,DTO,等这 ...

  2. Solr 18 - 通过SolrJ局部更新Solr中的文档 (原子操作、非覆盖操作)

    目录 1 需求分析 2 需求实现 2.1 pom.xml依赖 2.2 Java代码示例 3 补充说明 3.1 关于文档中_version_的取值说明 3.2 store=true/false的区别 1 ...

  3. 解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

    由于TCP协议整个机制也非常复杂我只能尽可能的在某一条线上来说,不可能面面俱到,如果有疏漏或者对于内容有异议可以留言.谢谢大家. 查看服务器上各个状态的统计数量: netstat -ant | awk ...

  4. 跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh

    SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh Springboot: 2.1.6.RELEASE SpringCloud: Gre ...

  5. python面试题(-)可变数据类型与不可变数据类型

    python3中有六个标准的数据类型:number(数字型).string(字符串型).list(列表).type(元祖).dictionary(字典).set(集合),其中不可变类型三个:numbe ...

  6. 充气娃娃什么感觉?Python告诉你

    上期为大家介绍了requests库的基本信息以及使用requests库爬取某东的商品页,收到了很多同学的反馈说期待猪哥的更新,猪哥感到非常开心,今天就带大家来玩一把刺激的! 一.需求背景 在实际开发过 ...

  7. SpringBoot 的过滤器

    在Springboot里面读封装的一些常用的API,当然对过滤器也不类外了. 首先讲下Spring中的AOP的理解: AOP不是一种具体的技术,而是一种编程思想.在面向对象编程的过程中,我们很容易通过 ...

  8. NEST 6.X升级到7.X

    升级比对可访问 NEST 6.X升级到7.X 查看 ElasticClient-CreateIndex 升级前代码,NEST版本6.6.0 ICreateIndexResponse response ...

  9. js random获取随机数,获取任意范围内随机整数

     壹 ❀ 引 想着好久没做笔试题了,去GitHub找了面试相关的项目,结果被第一道题难住了.....说难其实也不难,而是我忘记了取范围随机整数怎么写了,不可否认如果当时是我在笔试,肯定也凉了,那么就由 ...

  10. Bzoj 1079 着色方案 题解

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2237  Solved: 1361[Submit][Stat ...