[英]Is it possible to keep executing test if element wasn't found with Cypress
我有一個案例,我需要等待元素(廣告),如果它可見則需要單擊它,但如果在超時后未找到元素,則需要繼續執行測試。
如何處理 Cypress 的情況?
賽普拉斯說檢查條件元素的方式是元素存在
cy.get('body').then(($body) => {
const modal = $body.find('modal')
if (modal.length) {
modal.click()
}
})
很可能您將它放在測試的頂部,並且它運行得太快(沒有重試超時)。
您可以添加等待 30 秒,但每次測試都會延遲。
最好遞歸調用
const clickModal = (selector, attempt = 0) => {
if (attempt === 100) return // whole 30 seconds is up
cy.get('body').then(($body) => {
const modal = $body.find('modal')
if (!modal.length) {
cy.wait(300) // wait in small chunks
clickModal(selector, ++attempt)
}
})
return // done, exit
}
cy.get('body')
.then($body => clickModal('modal'))
最好的是,如果您可以在網絡選項卡中找到廣告的 url,請使用cy.intercept()
捕獲它並將其存根以停止模式顯示。
我嘗試了上述解決方案,但似乎在某些情況下參數$body
不能包含必要的元素,因為當我們調用cy.get('body')
時它沒有被加載。 所以,我找到了另一個解決方案,通過 Cypress 使用 jQuery,這里是:
let counter = 0;
const timeOut: number = Cypress.config('defaultCommandTimeout');
const sleep = (milliseconds) => {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
};
while (true) {
if (Cypress.$(element).length > 0 && Cypress.$(element).is(':visible')) {
Cypress.$(element).click();
break;
} else {
sleep(500);
counter = counter + 500;
if (counter >= timeOut) {
cy.log(elementName+ ' was not found after timeout');
break;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.