惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

晚花行乐

马克卡尼在2026年达沃斯论坛上的讲话(阅读材料) | 晚花行乐 鸡娃如何用力才是恰到好处 | 晚花行乐 读万卷书,行万里路的辩证关系 | 晚花行乐 反对培训机构掐尖招生 | 晚花行乐 小泽和建国会谈最后10分钟全文(阅读材料) | 晚花行乐 来看看 DeepSeek 怎么鸡娃 | 晚花行乐 谈谈基本功 | 晚花行乐 惠普 ProDesk SFF PC 各系列参数对比 | 晚花行乐 解决瘦客户机上安装 Debian 12 启动失败问题 | 晚花行乐 意拾喻言:老外写的文言文 | 晚花行乐 笠翁对韵中的典故(十三元) | 晚花行乐 谈谈中考取消四小门 | 晚花行乐 亚马逊云科技产品免费试用攻略(3) - 对象存储服务 | 晚花行乐 在 Windows 10 LTSC 版本上安装 WSL2 | 晚花行乐 Debian 12 的常用配置项 | 晚花行乐 在 Debian 12 上安装 Nvidia 显卡驱动程序 | 晚花行乐 解决 Debian 12 关机失败问题 | 晚花行乐 解决 VS Code 自动更新版本后卡在连接界面 | 晚花行乐 观看巴黎奥运会有感 | 晚花行乐 在 Windows10 上安装惠普旧打印机驱动程序 | 晚花行乐 欢迎关注公众号:晚花行乐 | 晚花行乐 如何编写拼写检查器 | 晚花行乐 亚马逊云科技产品免费试用攻略(2) - 云服务器 | 晚花行乐 Pandas 中 axis 参数的理解(附实例) | 晚花行乐 我打算命个名,叫什么什么 Manager | 晚花行乐 上海武康路历史建筑一览 | 晚花行乐 Python 实现简单的数学表达式解析并处理 | 晚花行乐 观看马拉松的感悟 | 晚花行乐 Python 保存 Cookies 到文件并再次读取 | 晚花行乐 如何为 Hugo 静态网站添加评论功能 | 晚花行乐
Cypress 和 Seleium、Puppeteer、TestCafe 使用对比 | 晚花行乐
2020-09-27 · via 晚花行乐

同为 Web UI 的测试框架,本文将 Selenium 、TestCafe 和 Puppeteer 与 Cypress 作了一番对比。

三篇相关文章

对比一览

从多个维度指标做对比见下表:

指标SeleniumPuppeteerTestCafeCypress
语言多种语言:Java、Python、RubyJavaScriptJavaScriptJavaScript
实现原理Json wire 协议chrome CDP 协议JS注入页面JS注入页面
等待方式阻塞等待异步异步异步
支持的浏览器IE、Firefox、Chrome等仅ChromeIE、Firefox、Chrome等Chrome、Edge、Electron、Firefox
测试断言库内含 Mocha/Chai
用途测试广泛测试测试

Selenium 已明显过时,TestCafe 和 Puppeteer 更多是一款工具,具体的用法则跟随使用者的习惯。Cypress 则提供了一套相对完整的系统,并提供了Cypress 的指导思想和最佳实践最佳实践

下面我们通过一些场景的实现,读者可自行对比异同。

场景1:登录

最常见的场景:用户名、密码两个文本框+提交按钮

比如上图中,用户名的输入框的 id#username , 而密码输入框的 id#password,提交按钮的 id#submit ,希望用代码实现登录的过程。

Selenium 实现(略)

Puppeteer 实现

async login(user){
    await (await this.page.waitForSelector('#username')).type(user.name)
    await (await this.page.waitForSelector('#password')).type(user.password)
    await (await this.page.$('#submit')).click()
    await this.page.waitForNavigation()
}

TestCafe 实现

async login(user){
    await t
        .typeText(Selector('#username'), user.name)
        .typeText(Selector('#password'), user.password)
        .click(Selector('#submit'))
}

Cypress 实现

login(user){
    cy.visit('/')
        .get('#username')
        .type(user.name)
        .get('#password')
        .type(user.password)
        .get('#submit')
        .click()
}

场景2:寻找包含某文字的链接并点击

找到并点击包含特定文字的元素

比如上图中希望找到 “百度一下"的按钮,并点击

Selenium 实现(略)

Puppeteer 实现

let button= await page.$x('//button[contains(text(),"百度一下")]')
if(button){
    button[0].click()
}

TestCafe 实现

Selector('button').withExactText("百度一下").click()

Cypress 实现

cy.contains('button', "百度一下").click()

场景3:获取页面某个元素的样式

场景描述:希望找到某一元素后,检查样式表的某项信息是否满足要求。

比如上图中希望核对 logo 的宽度和长度分别为 272 和 92

Puppeteer 实现

参照 用 Puppeteer 获取页面元素的样式 这篇文章的做法

async function () {
let logoStyle = await page.$eval('img.lnXdpd', 
    (elem) => {
         return JSON.parse(JSON.stringify(window.getComputedStyle(elem)))
    })
    expect(logoStyle.width).to.equal('272px')
    expect(logoStyle.height).to.equal('92px')
}

这里的 expect 使用了 chai 提供的断言库。

TestCafe 实现

test('logo has exact dimensions', async t => {
    let logo = await Selector('img.lnXdpd')

    await t
        .expect(logo.clientWidth).eql(272)
        .expect(logo.clientHeight).eql(92)
})

这里使用了 test cafe 自带的 expect 方法

Cypress 实现

cy.get('img.lnXdpd')
  .should('have.css', 'width')
  .and('eq','272px')

各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

精彩评论