Cypress与元素交互

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-02-26

Cypress 元素定位选择器

// id
cy.get('#main').click();

// class
cy.get('.btn').click();

// attributes
cy.get('button[id="main"]').click();

// :nth-child(n) 选择器
cy.get('li:nth-child(1)').click();

// Cypress.$ = jQuery
Cypress.$('#main');

查找页面元素

.get()

// get
cy.get(seletor);

cy.get(alias); // 别名 将会在之后的章节介绍

.find()

// find
cy.get('ul').find('#main');

cy.find('#main'); // 错误,不能直接由 cy 调用

.contains()

// contains 用来获取包含文本的DOM元素
.contains(selector, content);
cy.contains('li', 'this is Cypress');

.children()

// children
cy.get('ul').children(); // 所有子元素

cy.get('ul').children('#main'); //指定子元素

.parents() & .parent()

cy.get('#main').parents(); // 获取所有父元素

cy.get('#main').parent(); // 获取向上一个级别的父元素

.siblings()

cy.get('#main').siblings(); // 获取所有同级元素

.first() & .last()

cy.get('ul').first(); // 匹配给定DOM对象集的第一个元素

cy.get('ul').last(); // 匹配给定DOM对象集的最后一个元素

.next() & .prev()

cy.get('ul').next(); // 匹配给定DOM对象紧跟着的下一个同级元素

cy.get('ul').prev(); // 匹配给定DOM对象紧跟着的上一个同级元素

.nextAll() & .prevAll()

cy.get('ul').nextAll(); // 匹配给定DOM对象之后的所有同级元素

cy.get('ul').prevAll(); // 匹配给定DOM对象之前的所有同级元素

.nextUntil() & .prevUntil()

// .nextUntil(selector)
cy.get('ul').nextUntil('#main'); // 匹配给定DOM对象之后的所有同级元素知道遇上 Until 里定义的元素为止

cy.get('ul').prevUntil('#main'); // 匹配给定DOM对象之前的所有同级元素知道遇上 Until 里定义的元素为止

.each()

// .each() 用来遍历数组及其类似结构
cy.get('ul').each(($li) => {
  cy.log($li.text());
})

.eq()

// .eq() 用来在元素或者数组中的特定索引处获取DOM元素
cy.get('ul').eq(0); // 获取ul的第一个子元素

可操作类型

.click()

cy.get('li').click();

// 强制单击 li 元素
cy.get('li').click({ force: true });

// 单击所有 li 元素
cy.get('li').click({ multiple: true });

// 针对具体位置单击 
// topRight/topLeft/top/left/center/right/bottom/bottomLeft/bottomRight
cy.get('li').click({ 'topRight' })

// 接受键值组合 例如 shift+click
// { release: false } 表明长按 shift 键
cy.get('body').type('{shift}', { release: false });
cy.get('li:first').click();

// 还支持 {alt} {ctrl}

.dbclick()

// 双击某个元素
cy.get('li').dbclick();

// 带参数双击 与 click 参数一致
cy.get('li').dbclick(options);

// 在某个位置双击 与 click 一致
cy.get('li').dbclick(position);

.rightclick()

// 右击某个元素
cy.get('li').rightclick();

// 带参数右击 与 click 参数一致
cy.get('li').rightclick(options);

// 在某个位置右击 与 click 一致
cy.get('li').rightclick(position);

.type()

// 语法
.type(text)
.type(text, options)

cy.get('input').type('Hello, World');

cy.get('input').type('{shift+alt+b}hello')

// 输入特定字符
cy.get('input').type('{{}'); // 输入{

cy.get('input').type('{backspace}'); // 删除光标左侧的字符

cy.get('input').type('{del}'); // 删除光标右侧的字符

cy.get('input').type('{end}'); // 把光标移到行尾

cy.get('input').type('{enter}'); // 按Enter键

cy.get('input').type('{esc}'); // 按ESC键

cy.get('input').type('{home}'); // 把光标移到行首

具体文档查看 cypress-command-type

.clear()

// 清除输入或文本区域的值
cy.get('input').clear();

.check() & .uncheck()

// 针对单选框和复选框, 接受的值是 value 属性
cy.get('input[type="radio"]').check();

cy.get('input[type="radio"]').check('EN');

cy.get('input[type="radio"]').check(['EN', 'CN']);

cy.get('input[type="radio"]').uncheck();

cy.get('input[type="radio"]').uncheck('EN');

cy.get('input[type="radio"]').uncheck(['EN', 'CN']);

.selector

// 用来在 <select> 中选择一个 <option>
cy.get('select').select('javascript')
cy.get('select').select(['javascript', 'nodejs'])

.trigger

// 用来在DOM元素上触发事件
cy.get('button').trigger('mousedown');
cy.get('button').trigger('mouseover');
cy.get('button').trigger('mouseleave');

Cypress 常见操作

访问某个网站

cy.visit('https://www.baidu.com');

如果你在 cypress.json 中配置了 BaseUrl,则会为你自动加上前缀

// 如果你的 BaseUrl 配置的为 http://wwww.hello.com
cy.visit('/about/api');
// 等同于方位 http://wwww.hello.com/about/api

获取当前页面的URL地址

cy.url();
// 断言
cy.url().should('contain', '/about/api');

刷新当前页面

// 刷新页面
cy.reload();

// 强刷
cy.reload(true);

在运行中设置窗口大小

cy.viewport(1200, 800);

控制网页的前进和后退

// 后退
cy.go('back');
cy.go(-1);

// 前进
cy.go('forward');
cy.go(1);

判断元素是否可见

cy.get('.check-box').should('be.visible')

判断元素是否存在

// 判断元素存在
cy.get('.check-box').should('be.exist')

// 判断元素不存在
cy.get('.check-box').should('not.exist')

条件判断

if (Cypress.$('#btn').length > 0) {
  cy.get('#btn').click();
}

获取元素属性值

cy.get('#btn').then(($btn) => {
  const btnTxt = $btn.text();
  cy.log(btnTxt);
})

操作弹出框

cy.get('iframe')
  .then(($iframe) => {
    const $body = $iframe.contents().find('body')
    cy.wrap($body).find('#btn').click();
  })

cy.wrap() 可以使得DOM元素也能够使用 cy 相关的 命令,也可以传入一个 Promise,会等待 Promise 被 resolve/reject。 具体查看 cy.wrap()

操作被覆盖元素

// 强制单击 btn 元素,即使被覆盖
cy.get('#btn').click({ force: true})

操作页面滚动条

// 确认提交按钮不在视图中
cy.get('#submit').should('not.be.visible');

// 滚动直到提交按钮出现在视图中
cy.get('#submit').scrollIntoView().should('be.visible');

cy.get('#submit').click();

操作页面的 range

cy.get('input[type="range"]')
  .invoke('val', 25)
  .trigger('change')
  .get('input[type="range"]').siblings('p')
  .should('have.text', 25)

遍历表格

cy.get('tbody tr')
  .each(($el, index, $table) => {
    if ($el.text().includes('iTesting')) {
      $table.eq(index).find('button').click();
    }
  })