selenium

Selenium 文档

目录:

  • Introduction

    • Web应用自动化测试
    • 自动化测试和非自动化测试对比
    • Selenium简介
    • Selenium project 简述
    • Selenium的工具套件(suite)
    • 选择适合的Selenium工具
    • 支持的浏览器和平台(Platforms)
    • 扩展性和延伸性
    • 文档中有什么
    • 编写文档的团队介绍
  • Selenium-IDE

  • Selenium WebDriver

  • WebDriver:advanced Usage

  • Selenium 1(Selenium RC)

  • Test Design Considerations

  • Selenium-Grid

  • User-Extensions

Introduction

Web应用自动化测试

现今,越来越多的软件应用程序都是web端的应用程序运行在互联网浏览器中。公司和一些组织都在有效地测试这些应用程序。在高交互快速响应的世代,许多公司都在使用灵活,动态的表单方法,自动化测试对于软件工程来说需求越来越旺盛。
自动化测试着使用一些工具来测试这些需要被重复测试的application

自动化测试的优势有哪些?一些相关的重复性测试和快速的执行一些测试。有很多商业化或者开源的自动化工具,Selenium 可能是使用最为广泛地开源解决办法。文档说明告诉你Selenium的特色,使用经验,社区论坛

自动化测试如何提高长项目周期中团队的软件测试进程,具体的优势表现如下
自动化测试支持:
1. 频繁地回归性测试
2. 快速地回馈结果给开发者(如把把所有接口,快速跑一遍)
3. 虚拟无限制的迭代测试用例
4. 支持极端或者动态的开发策略
5. 严格遵守测试用例文档
6. 自定义缺陷报告
7. 找到手工测试中漏掉的bug

//主要还是回归性测试,冒烟测试,以及快速反馈(如通过报告体现,或者邮箱通知)

要不要进行自动化测试呢?

自动化一直都有利于项目么?我们何时进行自动化地跑测试用例呢?

根据经验而得,自动化测试并不总是那么方便。
有时,手工测试会更加地准确。比如,application 的UI接口 要考虑到某天突然改变,那相应的自动化测试用例也需要改变
再比如,项目周期短变动大,来不及组织自动化测试代码(此时,应该考虑是否可以封装一些高复用的function),此时手工测试会更加高效
tight deadline ,没有可复用的自动化接口可用,那只能提高手动测试的次数

Selenium简介

web自动化测试工具
Selenium有很多工具,学的工具多了,选择就多了。
比如有多种方法定位UI elements ,还有对比期望和实际结果,还有最重要的是可以在多个浏览器平台执行测试用例
//可以测试兼容性

Selenium project 简史

在2004出现,出现的原因么:可能就是想从一些枯燥重复的手工测试解脱 出来,
把时间放在重点问题上,而不是每一次代码改动都要回归一些重复性的测试
牛逼的他(代码能力),开发出了一个JavaScript库,可以驱动页面的交互,使他可以自动地在多个浏览器重跑他的用例,这就是Selenium的核心啦,
这些核心就是Remote Control(RC)和 Selenium IDE的基础
Selenium RC 是创新的(解决了兼容test的问题),因为没有谁会允许你随便的一种语言就可以控制它的浏览器
//同源策略--端口 协议

Selenium是一个能力巨大的工具,但是它也有缺点(缺点有时候会被无限放大),他是JavaScript写的,基于自动化引擎和浏览器对于JavaScript的安全限制,很多,很多当初没想到问题也在一一暴露出来,更糟的是,现在的Webapp功能越来越丰富,浏览器对于他的限制也会越来越严重

2006的时候,一个plucky(勇敢的)人 开始搞WebDriver。Google也在大量的使用Selenium,不过由于产品之间的限制,也是的工作难以高效,
既然产品之间的限制,就开始直接和底层交互,使用native方法,直接和浏览器交互,这样就可以避免JavaScript 环境沙箱的限制
WebDriver 就是为了解决Selenium的痛点

回到2008年,中国申奥成功,美国次贷危机爆发,国际经济变得不景气,笼罩着深深萧条景象。WebDriver和Selenium却迎来了发展合并,他们两家为什么合并呢?WebDriver的编写者的一封书信:

大意就是,我们都有不足,但又可以互相弥补,让我们更加的健壮
WebDriver:能绕过JS的sandbox,我们有丰富的APi,方法之间的互不干扰???
//js的沙箱限制是什么
Selenium:支持多个浏览器
//remote control的支持 ,解决同源策略

Selenium`s Tool Suite

Selenium 2

很有特色,很有聚合力的工具包
就是一些APi的调用

WebDriver API 和Selenium1的底层技术支持,
Selenium 2 始终在后台运行着Selenium1的RC接口----这是面试点吧

Selenium 1

Selenium RC 就是Selenium project中最主要的东西,也是再未何必之前,最有效力的工具

Selenium IDE

Selenium IDE(Integrated Development Environment)就是用来录制脚本原型的,是Firefox的一个插件,简单易用,有录制功能,录制用户的操作,然后生成一个脚本

Selenium——Grid

可以分布式的运行,就是可以在多个环境下运行
parallel 平行地
不同的tests可以在同一时间运行
主要就是把它分布到不同的远程机器上

这样做有什么好处呢?
1. test suite很多很多,或者一个很复杂运行很慢的suite,就可以分布开来
2. 比如你要把你的test suite运行在多个环境中(比如不同的浏览器),并要在同一时间段运行,你也可以采用分布式

选择你的Selenium 工具

IDE,简单易上手
选择一门语言调用WebDriver的API

Selenium-WebDriver API 是Selenium的未来方向,
Selenium 1 提供后台能力

Selenium 支持的浏览器和平台

WebDriver 和Selenium-RC

Selenium-WebDriver:
Google Chrome
Internet Explorer 7,9.。。
Firefox
Safari
Opera
HtmlUnit
phantomjs
Android(with Selendroid or appium)
IOS(with ios-driver or appium)

Selenium 1.0 和 Selenium-RC
.......

延展性

customization
开源 修改

接下来文档中述说的东西

chapter:
Selenium IDE

Selenium 2

Selenium 1
    通过Selenium RC API开展自动化
    安装配置Selenium RC
    
    
    
Test Design Considerations

Selenium-Grid

Selenium IDE

....省略 安装下载
Firefox

Selenium WebDriver

介绍WebDriver

Selenium 2 的特色:就是集成了 WebDriver的API
Webdriver 设计的初衷就是为了解决Selenium-RC API的限制缺陷,并且提供一个更加简洁明了的程序接口(更加的见名知意的API)
更加地支持动态页面,如动态元素改变,然而页面并没有变化的时候

WebDriver 如何driver 浏览器和Selenium-RC的区别

Selenium-WebDriver 直接调用浏览器 通过使用浏览器的native支持来实现自动化

不同的浏览器对这些直接调用的支持响应是不一样的,取决你使用的浏览器

“browser driver” --支持automation

WebDriver实现的和Selenium—RC非常的类似

Selenium-RC的也是使用相同的方式,它注入JavaScript脚本到浏览器(通过js操作浏览器)当浏览器加载好然后页面调用Selenium-CoreJS代码驱动AUT
WebDriver 不使用这个技术,
它是直接调用浏览器通过内置的 对自动化的支持-----这是面点

WebDriver 和 Selenium-Server

Selenium Server 何时启动(这也是C/S架构??)
取决于你需要如何使用Selenium-WebDriver
如果你一直一台机器上跑测试用例(浏览器和测试用例都在一台机器上)
你的自动化测试中只用到了WebDriver API ,这就不需要Selenium-Server

WebDriver会直接运行浏览器

以下是同时使用Selenium-Server和Selenium—WebDriver:

1. 使用Selenium-Grid(分布式),部署你的测试用例到不同机器上或者虚拟机上
2. 你需要连接远程服务器,可能是他有一个特定版本的浏览器,而你的机器上没有这个版本的浏览器
3. 你没有使用java、pythondeng然后又想使用HTMLUnit Driver

安装 Selenium-WebDriver project

java 

使用Maven (会自动绑定Selenium 2.0 java client libray)和它的依赖库


python 

pip install selenium

Selenium1.0 进行迁移

Selenium-WebDriver API 例子

WebDriver是一个工具,一些列的API
比Selenium-RC(1.0)的APi更加简洁
相当于一个客户端请求???

要调用哪个浏览器,就要下载响应的driver(因为每个浏览器对automation的支持不一样),否则无法运行浏览器
//这也是面试点

没有和任何测试框架绑定(和单元测试集成),所有可用有很好支持性

只是一个python库,调用其API即可
把各浏览器的driver集成进去

Selenium-WebDriver API 命令和操作

WebDriver调用会另外写一个说明

1. get调用URL
2. 定位UI元素(这块是面试点)
css 版本不同可能会有不同路径,css可能不work

Xpath 高级操作 native
但是有些不支持 原生的Xpath(native Xpath),Selenium提供会有自己的实现方法,但这样会有不可预期的行为出现,除非你知道这些Xpath 引擎的不同


在WebDriver中使用xpath时的经验法则是,您不应该期望能够匹配这些隐式属性。
//意思是,一些默认的属性可能无法匹配到?

 Note that this will only return the visible text displayed on the page.
 //隐式的属性存在很多的不确定性

Driver Specifics and Tradeoffs

Selenium-WebDriver`s Drivers

WebDriver 就是一系列key interface 来写你的test case,但是它还有其他的功能


HTmlUnit Driver

一个java实现的没有GUI的浏览器,这个就需要Selenium Server 啦(高级面试点)

很少使用到,以后再补充
----------=====--------

Alternative Back-Ends: Mixing WebDriver and RC Technologies

把WebDriver和RC结合起来
WebDriver-Backed Selenium-RC
java版本:
WebDriver 可以实现 Selenium-RC 的API
可以通过WebDriver调用Selenium-RC API
这是后端兼容性的体现
这样就可以让存在的test suites(已经使用Selenium-RC API)可以使用WebDriver
这样可以实现1到2的迁移
也可以同时使用这两种API

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl)

WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver()

selenium.stop()

pros:
1. 允许WebDriver和selenium api同时存在
2. 提供简单的迁移从Selenium RC API 到 WebDriver
3. 不需要脱机的运行 Selenium RC Server

cons
不能实现每个方法
很多方法不能使用
很多方法会变慢因为底层实现不一样了

Backing WebDriver with Selenium

WebDriver 不像Selenium-RC一样可以支持很多浏览器
所有为了获得这种支持可以使用此条命令:
SeleneseCommandExecutor

Safari:

但此种方式有很多限制,然后由于使用Selenium Core,就会有JavaScript的沙箱限制

脱机运行Selenium Server 通过使用RemoteDrivers

WebDriver: Advanced Usage

显示等待和隐式等待不可混用,否则会造成不可预知的错误

Explicit Waits

显式等待,设定等待时间,超时报错 或者在设定的时间内返回结果
WebDriverwait 默认没500ms就检查一遍是否出现,ExpectedCondition function 返回Boolean值true或者no-null object

理解:设定一个超时时间,在设定的时间内有可能1s或者2s就找到不必设定确定的时间点(sleep), 默认就会没500ms就查找一次,直到找到(设定时间内),否则报错

Implicit wait

隐式等待:在规定时间内轮询DOM树,直到找到元素
设置为0,就代表生命周期为WebDriver对象实例的生命周期

RemoteWebDrive

Browser Startup Manipulation(开始操作浏览器)

重新存储内存
改变Firefox 文件
运行浏览器插件


使用代理

    Capabablities object

Selenium 1(Selenium RC)

Introduction

在Selenium2出现前,1代是最有效的工具,现今它仍然在运作当中,提供了一些 Selenium 2 中无法实现的功能
//这些功能是什么呢?
支持多语言编码,支持几乎所有的浏览器

How Selenium RC works

RC 组成部分(components)

Selenium RC components:

1. Selenium Server: 运行或者关闭浏览器,翻译和运行 Selenese 命令(接收程序传递的命令)
充当HTTP代理,验证和解析http 信息(Web服务器端和代码客户端)


2. 客户端(客户端库接口),通过编写代码(各种编程语言),来连接 Selenium RC Server

------------------------
Selenium Core

    Application under test
------------------------
            |
            |
------------------------
        Remote Control Server
------------------------
            |
            |
------------------------
    machine boundary
    模拟客户端
    python Ruby java...
-------------------------

模拟客户端连接Server,传入Selenium Command,Server把这些命令传入浏览器(通过Selenium-Core JavaScript commands),
然后浏览器使用它自己js解析器,来解析执行这行Selenium命令

Selenium Server

Server端收到你请求的这些Selenium命令,解析他,然后提供给你这些test的结果

RC server 捆绑了Selenium Core 然后把它注入集成到浏览器中。
Selenium Core 注入浏览器是发生在当你的测试代码(客户端API)发出请求时。(给浏览器添加一些JS脚本)

Selenium-Core就是一堆JavaScript程序,一系列JS的方法,这些方法解释和执行Selenese命令通过浏览器内置的JavaScript解释器 (这可能是面试点)

Server 从客户端接收到Selenese命令
===也就是客户端Request(post/get)
这样说明你可以使用任何语言,只要他能实现Request请求

Client Libraries

客户端请求,就是把一些Selenium 命令发给服务器

调用客户端的API,写下你想搭配的Selenese命令,然后发给服务器(application under test --AUT)
接收服务端返回的结果
安装
安装Selenium,这种说法是不恰当的(misnomer)

安装 RC server :Java 
Client API

比如使用python

Adding Some Spice to Your Tests

为何需要使用RC(可能是面试点)
IDE不支持迭代和一些标准的条件语句,你需要加入JS作为Selenese的参数,还有一些异常的捕获,运行啊

verification power

还可以执行JS代码

Server options

改变Server的行为

............

代理设置

多窗口


此章节并未过多查看

Specifying the Firefox profile

Firefox不会同时运行两个实例
......

何时要用到profile

Specifying the Path to a Specific Browser

Selenium RC Architecture

理解点

Selenium RC 背后实现的逻辑,它是如何工作的,为什么要使用代理
//面试点
The same origin policy(同源策略)
同源策略是限制Selenium的一个主要因素
出于安全的考虑:比如某个站点的脚本不能控制另外一个站点内容
同源策略表明浏览器加载任何代码,生命周期都只能在同一个域名内的网站。不能操作另一个网站
//比如在baidu的域名内的脚本不能对Google网站进行任何操作,
//为什么不能呢,可以的话我访问一个网站,这个网站的js脚本来读取我另一个银行网站的账号密码并保存的话,后果不堪设想

这就是XSS (Cross-site Scripting)


处于对同源策略的考虑,并运用这种策略
Selenium-Core(开始利用JavaScript实现一些不可能的事情),当然Selenium也是只能在同样的URL下做一些事情
//same origin

自从Selenium-Core的出现就被同源策略的问题困扰着,
通过Selenium Server作为代理,以此来解决问题
就是告诉浏览器,浏览器正工作在一个伪装的站点上工作,Server提供了这个伪装的站点

Proxy Injection

使用此方法避免同源策略的问题
在这种模式下, Server端其实对于浏览器端是充当着客户端的角色,对浏览器发起请求。
HTTP Proxy:
1. proxy就是中间方,充当着一个web server的作用,传递AUT到浏览器,代理使得Selenium Server有着对AUT所访问的URL有欺骗的能力
2. 浏览器修改配置文件(设置localhost:4444作为http代理)然后运行。这就是为什么HTTP请求,会先发送到Selenium Server端,然后浏览器端返回也经过他,而不是真正的Server端
//通过代理,使得每一次访问都是来自localhost:4444这个端口,所以满足 host 域名 协议相同的同源策略(面试点)

然后使得AUT是在一个虚构的URL下工作(嵌入Selenium-Core和一系列的测试,然后传送他们,就像他们来自同一个源)

从你写client端代码到自动化的实现流程:

1. 客户端和RC server 建立连接


2. RC server 运行调用浏览器(或者已经使用过的)--URL,然后注入Selenium-Core中JS代码到已经打开的浏览器中

//Selenium-Core是操作浏览器的基础
但是这些jS脚本的源是你的localhost(这样就不能操控其他的domain),浏览器出于同源策略会阻止脚本的运行,
除非你把他注入到页面所在的远程服务器



3. client 开始发送 Selenese命令到server端 
//在没有使用代理前,你发送这些命令,Sele-Core是无法跨域操控的
//selenium-Core会解析你从客户端发来的命令,然后调用相应的JS代码操作页面---问题来了,是否可以直接操作页面呢
//就比如你点击页面元素,web服务器监听你的请求,然后做出相应的返回---也就是改变浏览器呈现的页面
//那浏览器就要判断你的这个改变是否满足同源(通过代理就是的selenium-Core就像是Web服务器返回的响应一样),是的化,允许操作,不是的话,拒绝XSS-----面试点?


4. 然后server端解析这些命令,然后触发相应的js代码,js对浏览器进行操作。
Selenese-Core指导浏览器的第一个动作,通常是打开AUT的首页面(访问url)


5. 浏览器接收到open的Request请求并访问站点内容--这些都是RC server请求的来获得的


6. RC server 和 Web服务器进行交互请求页面信息一旦获得页面,他发送这些页面到浏览器伪装成同源(都是从同一个代理端口返回的),
使得这些页面看起来像从Selenium-Core所在服务器来的 (这就是允许Selenium-Core执行同源策略)
//浏览器看到所有返回的页面都是来自同一个端口(满足同源),就可以调用js操作


7. 浏览器收到web 页面然后渲染他(已经打开的浏览器) 

//浏览器检测是从localhost:4444端口发起的请求,并从这个端口返回页面信息,满足同源从而渲染他
//浏览器认为selenium-Core 和 web 服务器是同源地,允许web服务器对页面进行操作(比如我像web服务器,请求信息,web服务器返回信息,并通过浏览器渲染出来)

理解:client API 连接 --》 RC server --》 注入Selenium-Core(通过这个来操作浏览器)_就要使得Core中js脚本像是从Web服务器来的---》 浏览器 《---- RC server《--》webserver

Heightened Privileges Browsers

和Proxy Injection差不多
但不同的是使用特殊的mode启动浏览器---Heightened Privilege 特权模式?
(可以XSS,填充文件上传,或者其他)
还可不通过RC server 直接读取客户端的请求

...................................

Test Design Considerations

什么部分,需要被测试呢?
取决于你的project,用户的期望,时间限制,领导安排等

领导决定,你来执行

测试静态元素

一般测试:
1. page title--验证link 跳转
2. 验证期望的图片是否出现(homepage)
3. 页面页脚这些东西是否存在(版权信息,公司信息等)
4. heading test 是否是<h1>tag等

这些东西,主要还是提高效率

测试links

link页面跳转是否正常

Function tests

基于用户的操作
Typical tests can be for login, registration to the site, user account operations, account settings changes, complex data retrieval operations, among others.

测试动态元素

测试Ajax

Only a portion of the page, or strictly the element itself is reloaded.

Validating Result

assert 和 Verify的区别

assert ,不一样即停止

verify,不停止 但定位更复杂

定位元素

1. id name 最好
2. xpath 花费时间长:浏览器需要运行它自己的xpath进程,尤其IE7对Xpath的支持最不好
3. link text 也很方便
如果text经常改变,定位<a>tag也不错

但是Xpath确实最能保证定位到元素的方法

可以在xpath中结合使用id、 name,内置函数也很丰富,也能定位元素属性等

定位ajax 
使用 waitFor()

安全操作:操作元素之前,检查元素是否存在

也可以只判断元素是否存在


可以将所有的定位器存储在一个地方,以便当元素路径发生修改时进行修改

元素定位封装到一py文件中
方便管理

页面对象设计模式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容