0
votes

Renvoi d'un booléen à partir d'un objet de page Cypress

J'essaie de comprendre comment puis-je renvoyer un booléen à partir d'un objet de page cyprès?

Cas d'utilisation:

J'essaye de vérifier si un élément est présent sur la page. Si tel est le cas, renvoyez un booléen.

Code:

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

Mainpage.spec.js

class DataTable {
  constructor() {
     return this;
  }

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

J'apprécierais quelques idées sur ce que je fais mal.

Merci pour le temps.


0 commentaires

3 Réponses :


1
votes

cy.get n'est pas une fonction synchrone en raison de la stratégie decapacité de relance, il n'y a donc aucun moyen de renvoyer directement Boolean .

Si nécessaire, vous pouvez utiliser la variante de should avec callback.

Dans votre cas, une variante plus simple avec exist convient (ou be.visible , éventuellement plus précise pour votre cas):

class DataTable {
  has(fieldName) {
    return cy.get('.view-and-field-name').contains(fieldName);
  }
}

const dataTable = new DataTable();
dataTable.getField(field.fieldName).should('exist');


0 commentaires

1
votes

Selon cet article , et selon les suggestions de cyprès pour les commandes personnalisées et les objets de page, je suggère la prochaine commande personnalisée :

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)

Et vous pouvez l'utiliser dans le test comme:

cy.validateIfElementExistsInDom(fieldName)
    

Et un exemple de fonction booléenne de retour général:

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


0 commentaires

3
votes

Le expect() sur Mainpage a déjà été exécuté en interne dans cy.get('.view-and-field-name').contains(fieldName) , il est donc redondant.

Si dataTable.has(field.fieldName) échoue, le test s'arrête là - il ne transmettra jamais une fausse valeur.

Si vous voulez que has(fieldName) passe un booléen, vous devez passer à jquery à l'intérieur, par exemple

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

Mais il est beaucoup plus simple d'utiliser les commandes Cypress et d'utiliser

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

Personnellement, j'abandonnerais l'objet de page et utiliserais simplement la commande directement dans le test.


0 commentaires