首页 > 解决方案 > 从自定义命令 cypress 返回内容

问题描述

我创建了下面的函数,但我很难从最后一个 if 块(elArr [3])返回东西。

如果我删除所有返回语句并在 if 块中说 put: cy.get(el).click() ,它工作正常,但我不想在此函数中使用该命令,而是在测试中执行,而不是像这样:

cy.traverseIFrame(['1', '2', '3'], 'myelement').click()

有人可以帮助我吗?试图让这个工作让我发疯。

Cypress.Commands.add('traverseIFrame', (elArr, searchEl) => {
 return cy.iframe(elArr[0]).within((res) => {
    if (res.find(searchEl).length > 0) {
      console.log('true1');
      cy.get(searchEl).click(150, 220, {
        force: true
      });
    }
    return cy.iframe(elArr[1]).within((res) => {
      if (res.find(searchEl).length > 0) {
        console.log('true2');
        cy.get(searchEl).click(150, 220, {
          force: true
        });
      }
      return cy.iframe(elArr[2]).within((res) => {
        if (res.find(searchEl).length > 0) {
          console.log('true3');
          cy.get(searchEl).click(150, 220, {
            force: true
          });
        }
        return cy.iframe(elArr[3]).within((res) => {
          if (res.find(searchEl).length > 0) {
            console.log('true4');
            return cy.get(searchEl);
          }
        });
      });
    });
  });
});

标签: cypress

解决方案


这是因为.within()命令不关注 inner return,而是返回上一个主题

在#Yields 内

.within() 产生与上一个命令相同的主题。
尝试返回不同的元素 .within 回调无效

相反,等效的应该是.then()&cy.wrap(...).find(...)组合,

Cypress.Commands.add('traverseIFrame', (elArr, searchEl) => {
  return cy.iframe(elArr[0]).then(res => {

    // this find sb ok since it's jquery
    if (res.find(searchEl).length > 0) {
      console.log('true1');

      // cy.wrap().find() here equates to .within(() => cy.get()
      cy.wrap(res).find(searchEl).click(150, 220, { force: true });    
    }

    // this nested cy.iframe may be ok - depends on internals of this command
    return cy.iframe(elArr[1]).then((res) => {
      ...

      // inner-most return
      return cy.wrap(res).find(searchEl)

推荐阅读