六、Cypress与元素交互

Cypress与元素交互

测试的核心是模拟用户操作,比如点击按钮、输入文本、选择下拉框等。Cypress对元素交互的支持非常灵活,这一章咱们就详细聊聊怎么用Cypress操作页面元素,避开那些容易踩的坑。

一、元素定位:怎么精准"找到"元素?

定位元素就像找人------得有唯一的"特征"。Cypress推荐几种靠谱的定位方式,按优先级排序:

  • 数据属性定位(最推荐) :用data-cydata-testdata-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'),但要注意类名可能重复,尽量配合其他条件。

  • 属性定位 :通过元素的其他属性定位,比如nametype。登录输入框可以用cy.get('input[name=username]'),表单提交按钮用cy.get('button[type=submit]')

  • 文本定位 :用cy.contains('文本内容')直接找包含指定文本的元素,比如cy.contains('忘记密码')定位"忘记密码"链接,适合文本固定的元素。

二、常用交互操作:模拟用户行为

Cypress的命令基本能覆盖所有用户操作,语法直观,一看就懂:

  • 输入文本type()命令,比如输入用户名:

    javascript 复制代码
    cy.get('input[name=username]').type('jane.lane')

    还能输入特殊字符,比如按回车({enter})、删除({backspace}):

    javascript 复制代码
    cy.get('input[name=search]').type('手机{enter}') // 输入"手机"并回车
  • 点击元素click()命令,点击按钮、链接都能用:

    javascript 复制代码
    cy.get('[data-cy=login-btn]').click() // 点击登录按钮
    cy.contains('首页').click() // 点击"首页"链接

    可以指定点击位置(比如左上角topLeft、中心center):

    javascript 复制代码
    cy.get('.dropdown').click('bottomRight') // 点击下拉框右下角展开选项
  • 清除输入clear()命令清空输入框内容:

    javascript 复制代码
    cy.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}强制执行,比如被弹窗遮挡的按钮:

    javascript 复制代码
    cy.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()定义:

    javascript 复制代码
    it('正确的写法', 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),否则可能导致测试不稳定。

相关推荐
hnlucky3 分钟前
《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》
java·linux·服务器·前端·nginx·tomcat·web
huihuihuanhuan.xin6 分钟前
前端八股-promise
前端·javascript
星语卿27 分钟前
浏览器重绘与重排
前端·浏览器
小小小小宇42 分钟前
前端实现合并两个已排序链表
前端
yngsqq1 小时前
netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)
java·前端·c#
mrsk1 小时前
🧙‍♂️ CSS中的结界术:BFC如何拯救你的布局混乱?
前端·css·面试
jonssonyan1 小时前
我自建服务器部署了 Next.js 全栈项目
前端
A了LONE1 小时前
h5的底部导航栏模板
java·前端·javascript
专注VB编程开发20年1 小时前
各版本操作系统对.NET支持情况(250707更新)
开发语言·前端·ide·vscode·.net
Zsnoin能1 小时前
AI + TailwindCSS快速搭建一个属于自己的TailwindCSS学习网站
前端·css