Cypress与元素交互
测试的核心是模拟用户操作,比如点击按钮、输入文本、选择下拉框等。Cypress对元素交互的支持非常灵活,这一章咱们就详细聊聊怎么用Cypress操作页面元素,避开那些容易踩的坑。
一、元素定位:怎么精准“找到”元素?
定位元素就像找人——得有唯一的“特征”。Cypress推荐几种靠谱的定位方式,按优先级排序:
-
数据属性定位(最推荐):用
data-cy、data-test、data-testid这类专门为测试设计的属性。比如给登录按钮加data-cy="login-btn",测试时用cy.get('[data-cy=login-btn]')定位,就算页面样式变了,测试也不会受影响。<button data-cy="login-btn">登录</button>// 定位并点击登录按钮 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()命令,比如输入用户名:cy.get('input[name=username]').type('jane.lane')还能输入特殊字符,比如按回车(
{enter})、删除({backspace}):cy.get('input[name=search]').type('手机{enter}') // 输入“手机”并回车 -
点击元素:
click()命令,点击按钮、链接都能用:cy.get('[data-cy=login-btn]').click() // 点击登录按钮 cy.contains('首页').click() // 点击“首页”链接可以指定点击位置(比如左上角
topLeft、中心center):cy.get('.dropdown').click('bottomRight') // 点击下拉框右下角展开选项 -
清除输入:
clear()命令清空输入框内容:cy.get('input[name=password]').clear() // 清空密码框 -
选择选项:下拉框用
select(),单选/复选框用check()/uncheck():// 选择下拉框中的“北京”选项 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插件),模拟文件选择:// 上传本地的test.png文件 cy.get('input[type=file]').attachFile('test.png')
三、进阶交互:处理复杂场景
实际测试中会遇到一些特殊情况,比如元素被遮挡、需要滚动到可见区域等,Cypress也有对应的解决办法:
-
强制操作:元素被遮挡时,加
{force: true}强制执行,比如被弹窗遮挡的按钮:cy.get('.submit-btn').click({ force: true }) // 强制点击被遮挡的按钮 -
滚动到元素:元素不在可视区域时,用
scrollIntoView()滚动到可见:// 滚动到页面底部的“确定”按钮 cy.get('#confirm-btn').scrollIntoView().click() -
处理iframe:iframe里的元素需要先获取iframe,再在里面定位:
// 获取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()配合修饰键:// 按住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()定义:it('正确的写法', function() { // 用function而不是箭头函数 if (someCondition) { this.skip() // 可以正常跳过用例 } }) -
避免链式操作过长:虽然Cypress支持链式命令(比如
cy.get(...).type(...).click()),但太长会影响可读性,适当拆分:// 推荐写法 const usernameInput = cy.get('input[name=username]') usernameInput.clear() usernameInput.type('jane') -
不要手动加等待:Cypress会自动等待元素可操作(比如输入框加载完成),不用写
cy.wait(1000),否则可能导致测试不稳定。