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.
3 Réponses :
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');
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
})
})
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.