• 13
  • 13
分享

Cypress与Selenium/WebDriver

Selenium/WebDriver架构

它基于Client/Server架构设计,其架构图如下所示

1.png

Language Bindings/Client

也叫做ClientLibrary,它是Selenium框架的一系列jar文件,可以使用不同的编程语言编写,也正因为它的存在,才使得各个语言编写的测试代码能够被正确解析

浏览器驱动WebDriver

WebDriver用于管理和完全控制浏览器,根据不同的浏览器区分不同的Driver

HTTP传输的JSON Wire协议

JSON(JavaScript Object Notation)是一种在Web上的服务器端和客户端之间传输数据的开放标准
JSON Wire协议是一个抽象规范,定义了用户在自动化脚本里操作该如何映射到Selenium或HTTP请求和响应中,通过JSON Wire协议可以在HTTP服务器之间传输信息,Language Bindings和WebDriver就是通过HTTP协议传输JSON数据的

多浏览器

Selenium/WebDriver几乎支持所有主流浏览器,通过浏览器驱动实现对浏览器的控制

Selenium代码执行过程

from selenium import webdriver
driver = webdriver.Chrome()
dirver.get("http://www.baidu.com")

那么执行这段代码会发生哪些事情?


  • Selenium的Language Bindings首先与Selenium API(基于浏览器原生API封装的更加面向对象的Selenium WebDriver API,它可以直接操作浏览器页面里的元素)进行通信

  • Selenium API通过JSON Wire协议把代码交由Language Bindings转换成一个JSON Payloads发送到浏览器驱动程序

  • 浏览器驱动程序有一个内置的HTTP Server来接收HTTP请求,当这个HTTP Server获取到了发送来的JSON Payloads后,就会被浏览器驱动转换成HTTP请求,然后再通过HTTP协议发送给真正的浏览器执行

  • Selenium脚本中的命令在浏览器上执行后,再将执行结果通过HTTP请求返回给浏览器驱动

  • 浏览器驱动再通过JSON Wire协议把结果返回给IDE,从而我们能够看到执行结果


Selenium/WebDriver执行慢

从代码的执行过程不难看出,代码进行多次转换并通过网络进行传输,即便代码在本地运行,WebDriver和浏览器的通信也要通过网络传输,在这种情况下,所有的请求会发送给本地主机,其后是环回接口(环回接口用来查错和运行本机内部的网络服务),网络通信会从OSI模型的第三层即网络层开始,遗传经过传输层、会话层、表示层到达应用层,只有物理层和数据链路层被略过,对于浏览器来说一个请求从本地主机到环回接口返回需要花费的时间决定了代码执行的效率,这就是Selenium/WebDriver执行慢根本原因

Cypress与Selenium/WebDriver比较

驱动浏览器方式

与Selenium/WebDriver通过运行在浏览器以外的命令进行Remote Call方式驱动浏览器的方式不同,Cypress命令跟被测应用程序运行在同一个浏览器实例当中

测试范围

与Selenium/WebDriver只能测试UI层不同,Cypress可以测试UI层/接口层/单元测试,对于测试金字塔而言,越往上投入越大收益越低

2.png

完备的测试框架与测试Library

Cypress具有完备的测试框架,而Selenium/WebDriver仅是一个Library,详细比较如下表所示:

对比维度CypressSelenium/WebDriver
完备的框架YesNo,Only Library
ALL IN ONEYes No  
自带断言库Yes No  
自带MockYesNo  
自带测试运行器Yes No 
运行速度 相对慢    
元素查找时等待自动等待 不支持  
Headless模式支持 支持 
运行时截图支持 支持 
运行时录屏支持 不支持 
回放测试执行情况 支持 不支持 
并发测试支持(收费) 支持 
程执行测试不支持  Selenium Grid支持    
脚本编写语言JavaScript  多种语言支持   
多浏览器支持 支持支持
社区  内容完善一般般   

Cypress是一个完备的测试框架,自带了测试运行器(Test Runner),单元测试框架(Mocha),断言库(Chai-jQuery),唯一需要做的就是编写测试代码,ALL IN ONE,从对比结果中发现Cypress不支持并发运行,但是它提供了跨虚拟机并行运行测试脚本并手机测试结果的能力;脚本语言目前只支持JavaScript或许这也是使用范围不佳的原因之一,而在Cypress4.0之前仅支持Chromium内核的浏览器,比如Chrome,Electron等浏览器,从4.0开始支持了Firefox和Microsoft Edge

Cypress与Karma比较

// 安装Karma
npm install karma --save-dev
// 安装插件
npm install karma-jasmine karma-chrome-launcher jasmine-core --save-dev
// 运行Karma
./node_modules/karma/bin/karma start
对比维度CypressKarma
完备的框架YesNo,Only Test Runner    
ALL IN ONEYesNo 
自带断言库YesNo 
自带MockYesNo 
自带测试运行器YesNo 

Cypress与Nightwatch比较

// 安装Node.js
// 安装Nightwatch
npm install nightwatch --save-dev
// 安装WebDriver
npm install geckodriver --save-dev
npm install chromedriver --save-dev
npm install safaridriver --save-dev
safaridriver --enable
npm install selenium-standalone --dave-dev
// 配置nightwatch.json,nightwatch.conf.js等参考
//https://nightwatchjs.org/gettingstarted//configuration
对比维度CypressNightwatch
完备的框架 YesYes
ALL IN ONEYesYes(安装和配置比较麻烦)    
底层框架自主研发,运行速度快基于WebDriver运行速度慢   
适用范围  UI、API、UnitTest UI  
脚本维护简单难维护  
回访测试执行情况YesNo  
多浏览器支持  YesYes

Cypress与Protractor比较

// 全局安装Protractor
npm install -g protractor
// 这将安装两个命令行工具protractor和webdriver-manager
// 验证安装
protractor --version
// 下载必要的binaries
webdriver-manager update
// 启动Selenium Server
webdriver-manager start
// 编写好测试用例,例如文件名为test.js,然后将其配置到配置文件conf.js中
exports.config={
     seleniumAddress:'http://localhost:4444/wd/hub',
     specs:['test.js']
};
// 运行测试
protractor conf.js
对比维度CypressProtractor
完备的框架Yes Yes 
ALL IN ONEYes Yes 
底层框架自主研发,运行速度快基于WebDriverJS运行速度慢 
单元测试框架底层使用Mocha,不可替换默认使用Jasmine,允许替换  
适用范围多种语言开发的程序均可进行测试 主要用于Angular的程序  
回访测试执行情况Yes No   
多浏览器支持Yes Yes 
// 以下代码打开helloqa.com并验证title
// 网站不是基于Angular开发,因此代码需要做如下修改
// browser.waitForAngularEnabled(false);
describe('Protractor Demo App', function(){
    it('should have a title', function(){
          browser.waitForAngularEnabled(false);
          browser.get('http://helloqa.com');
          expect(browser.getTitle()).to.have.string('davieyang');;
    });
});

Cypress与TestCafe比较

// 确定本机安装了Node.js和npm后
npm install testcafe --save-dev
npm install -g testcafe
// 运行测试
testcafe chrome{path-to-testfile/}testfile
对比维度CypressTestCafe
完备的框架 YesYes
ALL IN ONEYesYes
底层框架 自主研发,运行速度快自主研发,通过Proxy Server工作 
测试用例组织便捷度基于Mocha,组织和编写简单测试用例写法异于常规fixture,学习成本高    
自带测试运行器 YesYes,But Only TestRunner   
回访测试执行情况YesYes
多浏览器支持YesYes
测试运行测试运行在浏览器中测试运行在node.js中,便于设置和清除数据库fixtures  

Cypress和Puppeteer比较

npm i puppeteer
yarn add puppeteer
// 编写测试,访问helloqa站点并截图
const puppeteer=require('puppeteer');
     (async()=>{
          const browser = await puppeteer.launch();
          const page = await browser.newPage();
          await page.goto('https://www.helloqa.com');
          await page.screenshot({'path:testtExample.png'});
          await browser.close();
})();// 运行测试
node testExample.js
对比维度CypressTestCafe
完备的框架 Yes Yes 
是有有IDE Yes No 
适用范围e2e的完美解决方案主要用于爬虫和开展快速测试 
自带断言库Yes No
回访测试执行情况Yes No
多浏览器支持 Yes Yes 

Cypress的局限性

  • 不建议使用Cypress用于网站爬虫或性能测试

  • Cypress不支持多标签测试

  • Cypress不支持同时打开两个及以上的浏览器

  • 每个Cypress测试用例应遵守同源策略即协议相同,域名相同,端口相同,否则自动报错

  • 目前只支持Chrome、Firefox、Microsoft Edge和Electron

  • 不支持移动端

  • 对于iframe的支持有限

  • 不能在window.fetch上使用cy.route()

  • 没有影子DOM支持


作者:Davieyang.D.Y

原文链接:https://davieyang.blog.csdn.net/article/details/109911583


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • h5能在手机端浏览器、PC端浏览器、app内打开。需要注意在不同客户端内打开时的登录、分享、支付功能是否能正常使用。比如在浏览器打开时需要登录,在客户端内打开时,若客户端已登录,是否需要重新登录,数据展示是否正常。客户端未登录,能否拉取授权直接登录等。具体的测试点如下:功能测试功能逻辑业务逻辑页面返回不出现死逻辑登录授权分享页面刷新功能界面测试页面美观性界面是否符合需求界面横竖屏切换展示是否正常兼容性测试不同APP内正常打开链接不同分辨率屏幕和尺寸的手机界面展示不同浏览器打开不同操作系统版本测试-IOS、Android2G、3G、4G、5G下网络测试不同客户端打开链接时登录的调用交互测试涉及支...
            0 0 885
            分享
          • 前几天推送《简历中千万不要出现的 3 个问题》后,不少朋友告诉我,这几个提醒太关键太及时太有用了,但是,这么做只是避免简历被轻易涮掉,并没有提高简历通过率呀。确实是这样,那怎样才能增加简历通过率呢?今天我就从筛简历的角度聊聊,简历中突出哪些软技能时,更有可能赢得面试机会。我大概总结了一下,可以突出如下 3 点:突出自己的主动性;突出自己解决问题的能力;突出自己的学习能力;下面我就每一点分别展开说一下。一、突出自己的主动性《现代汉语词典》中解释,「主动」就是「不待外力推动而行动」,那么「主动性」就是这种主动行动的具体体现。举个例子。张三在他的「专业技能」一栏写了:自学 Python 半年,目前为...
            2 6 3007
            分享
          • 经典接口面试题与答案整理首先,非常感谢咱们松勤软件测试学员的面试题分享,最近小明老师把问题的答案整理了一下,分享出来给大家,希望能够帮助大家在面试过程中少踩坑,提高面试通过率。本文持续更新,后期有新的问题会同步分享给大家。有需要其他方面的知识资料的,可以私信我。大家如果对以下问题有什么更好的解答思路,也欢迎讨论区留言1、什么是HTTP协议无状态协议?怎么解决HTTP协议无状态协议是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。解决方案:通过cookie和session来...
            1 1 1885
            分享
          • 在有限的测试资源和时间的情况下,尽早尽快在测试对象查找出尽可能多的缺陷很大程度上是由如何制定测试用例优先级决定的,因此测试用例优先级在一个测试项目中至关重要。一、测试优先级的划分1.测试时间和资源有限,可能无法执行所有的测试用例,穷尽测试是不可能的。2.首先执行最重要的测试用例,尽早尽快的发现尽可能多的缺陷,或者优先测试用户最需要的功能3.测试用例优先级的划分和测试执行顺序的确定,取决于项目的特征,应用领域和客户的要求。4.即使测试过早结束,也能保证在该时刻测试工作能达到最好的效果。5.最重要的测试用将首先被执行,这样可以保证尽早发现最重要的问题。二测试优先级划分准则1.使用频率或失效的概率:...
            0 0 1392
            分享
          •   QQ、微信聊天框的主要功能就是发送消息和接收别人发过来的消息。  消息内容类型:  ·纯文字  · 纯图片  · 纯表情  · 文字+表情  · 文件  发送键:  · 点击“发送”发送  · 使用快捷键发送(针对电脑端)  用户在线状态:  · 在线状态  · 离线状态  网络情况:  · 网络正常  · 网络异常  群聊情况:  · @功能 :   @个人、@多个人、@全部  · 提醒功能     - 被@到时,进入群聊是否提示“有人@”  &nb...
            0 0 990
            分享
      • 51testing软件测试圈微信