一、简介

Protractor是一个Node.js程序,需要安装Node.js才可运行。Protractor默认使用Jasmine测试框架。Protractor是基于WebDriverJS作了封装。

·Selenium Server

SeleniumServer介于测试脚本(用WebDriver API所写)和浏览器Driver(由WebDriver协议控制)之间,充当代理角色。

Server端转发来自测试脚本的命令给driver,并返回来自driver端的应答给测试脚本。Server端可处理不同语言的测试脚本,也可启动并管理不同版本的多个浏览器。

示意图如下:

[Test Scripts] < ------------> [Selenium Server] < ------------ > [Browser Drivers]

注:当测试Chrome浏览器时,SeleniumServer是可选的,通过配置chromeOnly:true or false来实现。

·浏览器支持

Protractor支持Chrome、FireFox、Safari和IE的最近两个版本,下表是其浏览器支持情况和已知BUG。

Driver

Support

Known Issues

ChromeDriver

Yes

FirefoxDriver

Yes

#480 clicking options doesn't update the model

SafariDriver

Yes

#481 minus key doesn't work, SafariDriver does not support modals, #1051 We see occasional page loading timeouts

IEDriver

Yes

#778, can be slow, #1052 often times out waiting for page load

OperaDriver

No

ios-Driver

No

Appium- iOS/Safari

Yes*

drag and drop not supported (session/:sessionid/buttondown unimplemented)

Appium- Android/Chrome

Yes*

Selendroid

Yes*

*These driversare not yet in the Protractor smoke tests.

·测试框架支持

Protractor支持三种行为驱动开发(BDD)测试框架:Jasmine、Mocha和Cucumber。这些框架基于JavaScript和Node.js,提供语法、脚手架和报告工具便于你编写和管理你的测试脚本。Protractor默认使用Jasmine框架。

二、工作原理

Protractor结合Selenium提供了一个自动化测试基础设施,用以模拟在浏览器或移动设备上运行的Angular应用中的用户交互。

当使用Protractor时,注意这几点:

l  Protractor基于WebDriverJS作了封装,其中WebDriverJS是Selenium WebDriver API的JavaScript语言实现;

l  WebDriver命令是异步的。他们被安排在一个控制流中,返回promises,而非原始值;

l  测试脚本发送命令给SeleniumServer,按次序跟浏览器Driver通信。

一个使用SeleniumWebDriver的测试涉及三块:测试脚本、Server端和浏览器,三者之间的通信过程如下图:

SeleniumServer关注来自测试脚本的解释命令,将其转发给一个或多个浏览器。Server端和浏览器之间使用WebDriver Wire Protocol,一种JSON协议。转发命令再被浏览器Driver解释。

对于Protractor,测试脚本使用Node.js运行。为确保被测的应用已经稳定,Protractor在浏览器响应操作之前会执行一个额外的命令。举例如下:

element(by.css('button.myclass')).click();

这句测试脚本将会产生三个命令,发送给浏览器Driver:

l  /session/:sessionId/execute_async:首先,Protractor告诉浏览器将执行一段JavaScript代码。这是个定制的命令,当应用处理完延时和异步请求,可继续执行测试时,该命令用于要求Angular对此作出应答。

l  /session/:sessionId/element:然后,发送定位元素的命令

l  /session/:sessionId/element/:id/click:最后发送执行点击操作的命令

三、特性简介

·测试脚本

         Protractor运行需要两个文件,测试脚本文件 (spec file)和配置文件

简单的测试文件如下,其中describe函数和it函数是Jasmine框架中的语法,describe定义一个测试案例集,it为单个测试案例。

// spec.js
describe('angularjs homepage', function() {
  it('should add one and two', function() {
    browser.get('http://juliemr.github.io/protractor-demo/');
    element(by.model('first')).sendKeys(1);
    element(by.model('second')).sendKeys(2);
    element(by.id('gobutton')).click();
    expect(element(by.binding('latest')).getText()).
        toEqual('5');// This is wrong!
  });
});

配置文件如下

// conf.js
exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['spec.js'],
  multiCapabilities: [{
    browserName: 'firefox'
  }, {
    browserName: 'chrome'
  }]
}

·元素定位

Protractor提供一个全局函数element,使用一个Locator作为参数,返回一个ElementFinder。通过element.all函数可以操作多个元素。其中,ElementFinder有一组action方法,例如click(),getText()和sendKeys()。在Protractor中,所有的action操作都是异步的。

·Locators

一个定位器(locator)告诉Protractor如何找到一个特定的DOM元素,Protractor通过全局对象by来定位。例子如下:

// find an element using a css selector

by.css('.myclass')

// find an element with the given id

by.id('myid')

// find an element with a certain ng-model

by.model('name')

// find an element bound to the given variable

by.binding('bindingname')

locator再作为参数传给element函数,如下:

element(by.css('some-css'));

element(by.model('item.name'));

element(by.binding('item.name'));

·actions

element()函数返回一个ElementFinder对象。ElementFinder对象知道如何使用locator定位DOM元素,但实际还未执行定位。只有等定位元素涉及action方法调用时才会执行。

注:WebElement上任何在WebDriverJS中可执行的action方法在ElementFinder上也可执行。

常用的action方法如下:

var el = element(locator);
// Click on the element
el.click();
// Send keys to the element (usually an input)
el.sendKeys('my text');
// Clear the text in an element (usually an input)
el.clear();
// Get the value of an attribute, for example, get the value of an input
el.getAttribute('value');

既然所有的actions是异步的,所有action方法会返回一个promise。所以,如果要获取一个元素的文本并记录,可以这样实现:

var el = element(locator);
el.getText().then(function(text) {
  console.log(text);
});

·定位多个元素

处理多个DOM元素时,使用element.all函数。示例如下:

// Number of elements.
element.all(locator).count();
// Get my index (starting at 0).
element.all(locator).get(index);
// First and last.
element.all(locator).first();
element.all(locator).last();

reference:

l  https://github.com/angular/protractor/blob/master/docs/toc.md

l  http://ramonvictor.github.io/protractor/slides/#/

l  Protractor API:https://github.com/angular/protractor/blob/master/docs/api.md

Protractor小结相关推荐

  1. 【阶段小结】协同开发——这学期的Git使用小结

    [阶段小结]协同开发--这学期的Git使用小结 一.Git简介 1. Git简单介绍 2. Git工作流程以及各个区域 3. Git文件状态变化 二.Git安装&Git基本配置 三.个人踩坑 ...

  2. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  3. php中$_REQUEST、$_POST、$_GET的区别和联系小结

    php中$_REQUEST.$_POST.$_GET的区别和联系小结 作者: 字体:[增加 减小] 类型:转载 php中有$_request与$_post.$_get用于接受表单数据,当时他们有何种区 ...

  4. c cin.get()的用法小结_c语言中static 用法

    static在c里面可以用来修饰变量,也可以用来修饰函数. 先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混. int a ; int ...

  5. linux 压缩文件夹格式,Linux下常见文件格式的压缩、解压小结

    Linux下常见文件格式的压缩.解压小结 .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ...

  6. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  7. flash 入门课知识小结

    一. 几种类型帧的小结:(关键帧.空白关键帧.普通帧) 1. 特点   帧--是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以 ...

  8. Eigen/Matlab 使用小结

    文章目录 [Eigen Matlab使用小结](https://www.cnblogs.com/rainbow70626/p/8819119.html) Eigen初始化 0.[官网资料](http: ...

  9. MATLAB【十三】————仿真函数记录以及matlab变成小结

    part one:matlab 编程小结. 1.char 与string的区别,char使用的单引号 '' ,string使用的是双引号"". 2.一般标题中的输出一定要通过 nu ...

  10. oracle @spool,Oracle spool 用法小结

    Oracle spool 用法小结 转自:http://wallimn.javaeye.com/blog/472182 对于SPOOL 数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句 ...

最新文章

  1. VS2017源代码版本管理
  2. Python基础概念_12_编程风格
  3. rocketmq怎么保证数据不会重复_rocketmq如何保证消息不丢失
  4. Qt中为自己的程序建立一个消息循环
  5. MATLAB保存当前窗口图像
  6. fft之后求模值和相位_如何利用相位噪声测量表征时钟抖动来加速设计验证过程...
  7. 04_Spring中使用Quartz
  8. 苹果官网再度开售iPhone SE:这是在为新品清库存了?
  9. 使用github找资源
  10. Python+PyCharm+PyQt5抓取链家二手房信息
  11. 从智能交通案例看物联网成功的关键
  12. Excel的统计字符数
  13. Latex常用数学公式整理——导数
  14. HTML两张图片翻转,canvas实现图片镜像翻转的2种方式
  15. 978_使用emacs lisp安装emacs插件
  16. spry菜单栏(一)
  17. [自考总结]考的全没背,背的全没考是一种什么体验
  18. Office VBA开发经典-中级进阶卷(75元包邮)
  19. oh-my-posh安装过程问题及注意事项
  20. RK3399平台开发系列讲解(内核入门篇)1.2、如何高效的阅读Linux内核设备驱动

热门文章

  1. hdu2639(01背包变形-第k大背包)
  2. 一年级课程表(3月14日-3月18日)
  3. Windows下运行Makefile
  4. 大数据调度平台Airflow版本升级方案文档(1.X升级到2.X)
  5. 怎么区分zh和ch_怎样区分zh,ch,sh与z,c,s
  6. 国务院公布《关键信息基础设施安全保护条例》
  7. IPV6地址数据库导出
  8. Unity Debug.Log输出带颜色的日志,告别黑白冷色
  9. 中国25张金融牌照大全
  10. 大神f1 刷原生android,兼容多种ROM包 酷派大神F1堪称刷机神器