Cypress与元素交互
测试的核心是模拟用户操作,比如点击按钮、输入文本、选择下拉框等。Cypress对元素交互的支持非常灵活,这一章咱们就详细聊聊怎么用Cypress操作页面元素,避开那些容易踩的坑。
一、元素定位:怎么精准"找到"元素?
定位元素就像找人------得有唯一的"特征"。Cypress推荐几种靠谱的定位方式,按优先级排序:
-
数据属性定位(最推荐) :用
data-cy
、data-test
、data-testid
这类专门为测试设计的属性。比如给登录按钮加data-cy="login-btn"
,测试时用cy.get('[data-cy=login-btn]')
定位,就算页面样式变了,测试也不会受影响。html<button data-cy="login-btn">登录</button>
javascript// 定位并点击登录按钮 cy.get('[data-cy=login-btn]').click()
-
ID或类名定位 :如果元素有唯一ID(比如
id="username"
),用cy.get('#username')
;类名(class="submit-btn"
)用cy.get('.submit-btn')
,但要注意类名可能重复,尽量配合其他条件。 -
属性定位 :通过元素的其他属性定位,比如
name
、type
。登录输入框可以用cy.get('input[name=username]')
,表单提交按钮用cy.get('button[type=submit]')
。 -
文本定位 :用
cy.contains('文本内容')
直接找包含指定文本的元素,比如cy.contains('忘记密码')
定位"忘记密码"链接,适合文本固定的元素。
二、常用交互操作:模拟用户行为
Cypress的命令基本能覆盖所有用户操作,语法直观,一看就懂:
-
输入文本 :
type()
命令,比如输入用户名:javascriptcy.get('input[name=username]').type('jane.lane')
还能输入特殊字符,比如按回车(
{enter}
)、删除({backspace}
):javascriptcy.get('input[name=search]').type('手机{enter}') // 输入"手机"并回车
-
点击元素 :
click()
命令,点击按钮、链接都能用:javascriptcy.get('[data-cy=login-btn]').click() // 点击登录按钮 cy.contains('首页').click() // 点击"首页"链接
可以指定点击位置(比如左上角
topLeft
、中心center
):javascriptcy.get('.dropdown').click('bottomRight') // 点击下拉框右下角展开选项
-
清除输入 :
clear()
命令清空输入框内容:javascriptcy.get('input[name=password]').clear() // 清空密码框
-
选择选项 :下拉框用
select()
,单选/复选框用check()
/uncheck()
:javascript// 选择下拉框中的"北京"选项 cy.get('select[name=city]').select('北京') // 勾选"同意协议"复选框 cy.get('input[type=checkbox][name=agree]').check() // 取消勾选"记住密码" cy.get('input[type=checkbox][name=remember]').uncheck()
-
上传文件 :
attachFile()
命令(需要安装cypress-file-upload
插件),模拟文件选择:javascript// 上传本地的test.png文件 cy.get('input[type=file]').attachFile('test.png')
三、进阶交互:处理复杂场景
实际测试中会遇到一些特殊情况,比如元素被遮挡、需要滚动到可见区域等,Cypress也有对应的解决办法:
-
强制操作 :元素被遮挡时,加
{force: true}
强制执行,比如被弹窗遮挡的按钮:javascriptcy.get('.submit-btn').click({ force: true }) // 强制点击被遮挡的按钮
-
滚动到元素 :元素不在可视区域时,用
scrollIntoView()
滚动到可见:javascript// 滚动到页面底部的"确定"按钮 cy.get('#confirm-btn').scrollIntoView().click()
-
处理iframe:iframe里的元素需要先获取iframe,再在里面定位:
javascript// 获取iframe并在里面点击"提交"按钮 cy.get('iframe[name=formFrame]') .then($iframe => { const $body = $iframe.contents().find('body') // 进入iframe内部 cy.wrap($body).find('button[type=submit]').click() })
-
模拟键盘快捷键 :比如按住
Shift
点击、Ctrl+C
复制,用type()
配合修饰键:javascript// 按住Shift点击第一个和第三个选项(模拟多选) cy.get('body').type('{shift}') // 按住Shift cy.get('li').eq(0).click() cy.get('li').eq(2).click() cy.get('body').type('{shift}') // 松开Shift
四、交互中的"坑"与避坑技巧
-
不要用箭头函数定义用例 :如果用
it('测试', () => { ... })
,里面的this
会指向全局,无法使用this.skip()
等方法,建议用function()
定义:javascriptit('正确的写法', function() { // 用function而不是箭头函数 if (someCondition) { this.skip() // 可以正常跳过用例 } })
-
避免链式操作过长 :虽然Cypress支持链式命令(比如
cy.get(...).type(...).click()
),但太长会影响可读性,适当拆分:javascript// 推荐写法 const usernameInput = cy.get('input[name=username]') usernameInput.clear() usernameInput.type('jane')
-
不要手动加等待 :Cypress会自动等待元素可操作(比如输入框加载完成),不用写
cy.wait(1000)
,否则可能导致测试不稳定。