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.