typescript - Așteptați până când textul apare în caseta de text
Trebuie să aștept până când textul apare în caseta de text din aplicația mea. Problema este că textul se încarcă de obicei între 1 și 5 secunde, uneori mai mult, și unele casete de text nu conțin text, ceea ce face imposibil de utilizat cypress-wait-until, deoarece acesta doar așteaptă să apară textul și eșuează testul după 60 de secunde dacă nu se încarcă. Iată implementarea mea actuală:
cy.get(elementSelector)
.if()
.find(this.helpTextArea)
.then(($helptextBox) => {
let helptext = $helptextBox.text();
helptext = helptext.trim() ? helptext : null;
if (additionalHelptext) {
questionModel.additionalHelptext = helptext;
} else {
questionModel.helptext = helptext;
}
});
Presupun că cea mai eficientă soluție ar fi o anumită aserțiune moale care să nu eșueze testul pe casetele de text fără text, dar din ceea ce știu, Cypress nu suportă niciun fel de aserțiuni moi.
Încercat: cypress-wait-until (eșuează când textul nu este găsit), cy.wait() (crește timpul de execuție al testului și nu este de încredere).
Răspuns #1
Testul tău ar trebui să fie cât mai determinist posibil, așa că utilizarea funcțiilor instabile precum waitUntil nu este recomandată.
În schimb, mărește timpul de așteptare al interogării tale, deoarece spui „ceva mai mult de 5 secunde”, aș ghici că 10 secunde ar fi o limită superioară potrivită.
Poți construi selectorul tău folosind interpolarea șirurilor de caractere.
Pentru a obține textul, invocați text() și acesta va returna textul sau un șir gol.
cy.get(`${elementSelector} ${this.helpTextArea}`)
.invoke('text')
.then(helptext => {
if (helptext) {
// process helptext here
} else {
// use additional text here
}
})
Răspunsul #2
Dacă vrei să aștepți până când textul care se încarcă apare într-o casetă de text, metoda uzuală este să adaugi o aserțiune.
„Uneori durează mai mult de 5 secunde” - cât mai mult?
Să zicem, crește timeout-ul la 10 secunde.
cy.get(elementSelector) <-- |
.find(helpTextArea, {timeout:10_000}) |
.should('not.have.text', '') // loop back if not so --> |
.invoke('text') // then proceed on down the chain
.then(text => {
// use the text
})
