【问题标题】:Returning Boolean from Cypress Page Object从赛普拉斯页面对象返回布尔值
【发布时间】:2021-02-26 09:15:15
【问题描述】:

我试图了解如何从 cypress 页面对象返回布尔值?

用例:

我正在尝试检查页面上是否存在元素。如果是这样的话, 返回一个布尔值。

代码:

class DataTable {
  constructor() {
     return this;
  }

  has(fieldName) {
    // HOW DO I RETURN A BOOLEAN HERE?
    return cy.get('.view-and-field-name').contains(fieldName)
  }
}

Mainpage.spec.js

const dataTable = new DataTable();
expect(dataTable.has(field.fieldName)).to.be.true;

我会很感激一些关于我做错了什么的见解。

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript cypress


    【解决方案1】:

    根据this post,根据cypress suggestions for custom commands and page objects建议下custom command

    Cypress.Commands.add("validateIfElementExistsInDom", (selector) => {
        cy.get('body')
            .then($body => {
                expect($body.find(selector).length > 0).to.be.true
            })
        
    })
    

    你可以像这样在测试中使用它:

    cy.validateIfElementExistsInDom(fieldName)
        
    

    还有一个通用的返回布尔函数示例:

    Cypress.Commands.add("validateIfElementExistsInDomAsBoolean", (selector) => {
       return cy.get('body')
            .then($body => {
                return cy.wrap($body.find(selector).length > 0) //Cy wrap is needed so the function is chainable
            })
    })
    
    //in test code
    cy.validateIfElementExistsInDomAsBoolean(fieldName)
        .then(boolean => expect(boolean).to.be.true)
    
    

    【讨论】:

      【解决方案2】:

      主页上的expect()已经在cy.get('.view-and-field-name').contains(fieldName)内部执行过,所以是多余的。

      如果dataTable.has(field.fieldName) 失败,测试将停止 - 它永远不会传递错误值。

      如果你想让has(fieldName)传递一个布尔值,你需要在里面切换到jquery,例如

      has(fieldName) {
        const jquerySelector = `.view-and-field-name:contains(${fieldName})`;
        return Cypress.$(jquerySelector);
      }
      

      但是使用 Cypress 命令和使用要简单得多

      const dataTable = new DataTable();
      dataTable.has(field.fieldName);
      

      就个人而言,我会放弃页面对象,直接在测试中使用命令。

      【讨论】:

        【解决方案3】:

        由于retry-ability 策略,cy.get 不是同步函数, 所以没有办法直接返回Boolean

        如有必要,您可以使用带有回调的should 的变体。

        在您的情况下,使用exist 的更简单的变体是合适的(或be.visible,可能更适合您的情况):

        class DataTable {
          has(fieldName) {
            return cy.get('.view-and-field-name').contains(fieldName);
          }
        }
        
        const dataTable = new DataTable();
        dataTable.getField(field.fieldName).should('exist');
        

        【讨论】:

          猜你喜欢
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-20
          • 1970-01-01
          相关资源
          最近更新 更多