前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不知道的Cypress系列(7) -- 当iFrame遇见弹出框

你不知道的Cypress系列(7) -- 当iFrame遇见弹出框

作者头像
iTesting
发布于 2021-04-25 08:07:19
发布于 2021-04-25 08:07:19
2.8K00
代码可运行
举报
文章被收录于专栏:iTestingiTesting
运行总次数:0
代码可运行

iTesting,爱测试,爱分享

转眼之间,你不知道的Cypress系列已经到第7篇了。在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸(买了书的同学们,公众号回复你的微信号,拉你到Cypress中国群)。

今天是你不知道的Cypress系列(7) -- 当iFrame遇见弹出框

自从Cypress出现后,Cypress就在吊打一切Web端测试框架。虽然Cypress这么优秀,但它也有一些妥协和倔强,除了第6节的多Tab外,还包括这么一条:

  • iframes not supported

这是多么的简单直接!于是,出现了这么一幕,很多同学悄咪咪的问我:“蔡老师,Cypress不支持iframe啊,iframe都不支持,你怎么还敢推广它?”

一般这种情况我会说,不支持不代表不可以测试啊!只是使用Cypress测试iFrame不那么方便罢了。

什么是iFrame

iFrame是Inline Frame的缩写。百度百科说它的作用是文档中的文档,或者浮动的框架(FRAME),iFrame元素会创建包含另外一个文档的内联框架(即行内框架)。

我相信你看了这个定义会跟我跟我一样丈二和尚摸不着头脑,我们用人话重新说一遍:

iFrame是HTML元素的组件,iFrame元素允许你在你的网站中包含来自其他网站的内容。例如,你在各种网站上看到的内嵌的视频,就是iFrame在起作用。

它的用法也很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<iframe src="https://www.youu.com/embed/dXBohfjc4WA" width="680" height="480" allowfullscreen></iframe>

使用iFrame的好处是它可以将你的用户尽可能的保留在你自己的网站中。但是,过多的使用iFrame会出现安全性方面的问题,并且如果iFrame内容加载缓慢,也会影响到你页面的加载速度。

iFrame其实是个上古的前端技术,当前的Web应用程序很少使用iFrame了(所以那位说自己的应用程序很多iFrame的同学,你可以考虑换工作了 )。

iFrame较多,不建议用Cypress

原因如下:

  1. Cypress当前没有提供原生的命令来访问iFrame。
  2. iFrame的快照不会显示在TestRunner里,导致使用Cypress调试包含iFrame的代码非常不方便。

弹出框

弹出框也是自动化测试,特别是We吧端自动化测试的一个难道, 弹出框一般包括如下几种:

alert

confirm

prompt

我出道题,特别简单

好了,现在我有个需求,需要你测试下这个页面:

你点击下“运行代码”,然后再点击试一试,这个时候会出现一个警告框,你把警告框关掉。

先不要看解决方案,你先自己写下代码看, 网址如下(在Cypress中国群某个群里说过这个问题,结果很酸爽):

https://www.w3school.com.cn/tiy/t.asp?f=js_alert

Cypress操作iFrame和弹出框

有的同学说了,我用了Cypress后,再也不想用Selenium/Webdriver了。但是我的应用程序包含Cypress,我该怎么办?

不废话了,看Cypress如何处理这种情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    it('测试alert', () => {
        cy.visit('https://www.w3school.com.cn/tiy/t.asp?f=js_alert')
        cy.get('iframe').then(($iframe) => {
        const $body = $iframe.contents().find('body')
        cy.log('iTesting is good!',$body[1])
        const $win = $iframe[1].contentWindow
        cy.stub($win, 'alert').as('windowAlert')
        cy.wrap($body[1])
            .contains('试一').click().should(function () {
                expect(this.windowAlert).to.be.calledWith('我是一个警告框!')
            })
        })
    })

注意如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    cy.get('iframe')
    cy.stub($win, 'alert').as('windowAlert')

这两个代码是关键,建议好好查查,实在不行,群里问问。

课后作业

我知道你一定会问,所以我偷偷的给你准备了一个简单的题目,超级简单哦:

请访问如下页面,然后试着测试下这里的超链接。我相信,你一定会回来找我的:)

https://www.w3school.com.cn/tiy/t.asp?f=js_confirm

https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_prompt


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
锦囊篇|一文摸懂SharedPreferences和MMKV
不论是单线程还是多线程,MMKV的读写能力都远远的甩开了SharedPreferences&SQLite&SQLite+Transacion,但是MMKV到底是如何做到如此快的进行读写操作的?这就是下面会通过源码分析完成的事情了。
ClericYi
2020/07/07
1K0
锦囊篇|一文摸懂SharedPreferences和MMKV(二)
因为到这里的话直接通过三方库的导入已经不能满足查看了,所以直接去下载MMKV的开源库源码查看比较合适。
ClericYi
2020/07/04
7170
Android之MMKV介绍
MMKV——基于 mmap 的高性能通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。
李小白是一只喵
2021/12/06
12.9K0
你真的懂SharedPreferences么
1.SharedPreferences首次创建,实际类型是SharedPreferencesImpl,系统会将每个 SharedPreferences 文件对应的操作对象(实际为 SharedPreferencesImpl)进行缓存,SharedPreferencesImpl和sp文件路径file映射关系存放在Arraymap中,api28以后,之前是HashMap
老马的编程之旅
2022/06/22
4920
Android内存篇(一)---使用JVMTI监控应用
一般产品或项目前期都是以快速实现,上线的方式来完成,在生产环境中再开始进行优化,而Android的APP优化,比较重点的还是内存优化,因为每个APP都分配的最大内存,像内存泄露,内存抖动等慢慢都会让APP出来OOM崩溃的情况,最近也是一直在学习和研究内存优化这块,也是在实践中记录笔记。
Vaccae
2022/05/25
2.6K0
Android内存篇(一)---使用JVMTI监控应用
MMKV为什么可以替换SharedPreferences
MMKV——基于 mmap 的高性能通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。 https://github.com/Tencent/MMKV/blob/master/readme_cn.md
马上就说
2020/11/11
2.5K0
MMKV为什么可以替换SharedPreferences
MMKV--基于 mmap 的 iOS 高性能通用 key-value 组件
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。
微信终端开发团队
2018/03/20
8.3K1
MMKV--基于 mmap 的 iOS 高性能通用 key-value 组件
微信MMKV团队:SharedPreferences替代方案的6个核心指标
大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴
AntDream
2025/03/07
1330
微信MMKV团队:SharedPreferences替代方案的6个核心指标
开源|携程机票 App KMM 跨端 KV 存储库 MMKV-Kotlin
作者简介 禹昂,携程移动端资深工程师,专注于 Kotlin 移动端跨平台领域,Kotlin 中文社区核心成员,图书《Kotlin 编程实践》译者。 一、背景 携程机票移动端研发团队自 2021 年始就一直在移动端实践 Kotlin Multiplatform 技术(请见参考链接 1)。由于目前 Kotlin Multiplatform 生态尚处于起步阶段,大部分 Kotlin 开源库都是 JVM only 的,因此在我们团队的日常开发过程中迫切需要一些能够支持 KMM(Kotlin Multiplatf
携程技术
2022/06/17
1.9K0
开源|携程机票 App KMM 跨端 KV 存储库 MMKV-Kotlin
SharedPreferences VS MMKV
SharedPreferences 作为轻量级存储在 Android 应用中是必不可少的,但依旧存在较大的优化空间,和尚在做性能优化时尝试了新的利器 腾讯 MMKV,和尚今天按如下脑图顺序尝试学习和简单分析一下;
阿策小和尚
2020/09/30
5200
SharedPreferences VS MMKV
SharedPreferences VS MMKV
SharedPreferences 作为轻量级存储在 Android 应用中是必不可少的,但依旧存在较大的优化空间,小菜在做性能优化时尝试了新的利器 腾讯 MMKV,小菜今天按如下脑图顺序尝试学习和简单分析一下;
阿策小和尚
2020/09/22
9720
SharedPreferences VS MMKV
细数 SharedPreferences 的那些槽点
最近在处理一个历史遗留项目的时候饱受其害,主要表现为偶发性的 SharedPreferences 配置文件数据错乱,甚至丢失。经过排查发现是多进程的问题。项目中有两个不同进程,且会频繁的读写 SharedPreferences 文件,所以导致了数据错乱和丢失。趁此机会,精读了一遍 SharedPreferences 源码,下面就来说说 SharedPreferences 都有哪些槽点。
曾高飞
2022/08/15
5160
微信团队分享:iOS版微信的高性能通用key-value组件技术实践
本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称MMKV)。
JackJiang
2018/08/29
1.9K1
锦囊篇|一文摸懂SharedPreferences和MMKV(一)
不论是单线程还是多线程,MMKV的读写能力都远远的甩开了SharedPreferences&SQLite&SQLite+Transacion。不过下面一句话仅代表了我的个人意见,也是为什么我只写SharedPreferences和MMKV两者比较的原因,因为我个人认为SQLite和他们不太属于同一类产品,所以比较的意义上来说就趋于普通。
ClericYi
2020/07/02
1.2K0
微信自用高性能通用key-value组件MMKV已开源!
腾讯微信团队于2018年9月底宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性。近期也已移植到 Android 平台,一并对外开源。
JackJiang
2018/09/22
1.2K0
Boltdb 源码导读(一):Boltdb 数据组织
boltdb 是市面上为数不多的纯 go 语言开发的、单机 KV 库。boltdb 基于 Howard Chu'sLMDB 项目 ,实现的比较清爽,去掉单元测试和适配代码,核心代码大概四千多行。简单的 API、简约的实现,也是作者的意图所在。由于作者精力所限,原 boltdb 已经封版,不再更新。若想改进,提交新的 pr,建议去 etcd 维护的 fork 版本 bbolt。
木鸟杂记
2021/09/26
1.2K0
再见SharedPreferences,你好MMKV!
SharedPreferences是谷歌提供的轻量级存储方案,使用起来比较方便,可以直接进行数据存储,不必另起线程。
用户9239674
2022/01/20
6600
SharedPreferences三问—bilibili真题
作为一个轻量级的存储方式,SharedPreferences一直用来保存简单的配置信息,今天我们就来一起深入了解下它:
码上积木
2020/10/29
1.2K0
自底向上分析boltdb源码之精简版
boltdb是一个纯go编写的磁盘型kv数据库、支持事务,底层采用b+树来组织数据。目前主要的用途是做分布式组件的wal,或者单机磁盘型数据存储。对数据库感兴趣的小伙伴,非常值得一读boltdb的源码。代码量不大只有3k~4k,但功能很强大,从中可以学到不少知识。boltdb项目还是蛮出名的,现在由etcd团队在维护,etcd维护的组件叫bbolt,从boltdb fork而来,此外还有其他的一些知名的开源项目在生产环境使用boltdb。本文最初是本着好奇心和兴趣的驱使,最后通过一种自底向上的方式对boltdb内部实现一探究竟。
jaydenwen123
2021/07/19
9340
自底向上分析boltdb源码之精简版
SharedPreferences解析
说明:SharedPreferences与Editor只是两个接口,SharedPreferencesImpl和EditorImp分别实现了对应的接口。另外,ContextImpl记录着SharedPreferences的重要数据,如下:
用户1205080
2019/05/06
7180
SharedPreferences解析
推荐阅读
相关推荐
锦囊篇|一文摸懂SharedPreferences和MMKV
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验