[英]Cypress finding DOM element using multiple contains
我需要 select 列表中的第一個 email ,但我不知道它什么時候到達。
為 email 設置一個較大的超時時間可能會起作用,但我正在尋找更好的解決方案。
我需要 select 第一行.subject
是confirm your email address
和時間字段是a few seconds ago
。
這是我嘗試過的:
cy.contains('a few seconds ago')
.closest('.row') // get the container
.contains('confirm your email address')
這個解決方案的問題是,如果有一個主題為reset your password
的 email ,它會先找到它,然后等待最后一個包含超時。
Cypress
似乎沒有重新檢查整個調用鏈,只是最后一次失敗。 (因此它不會從第一個.get('a few seconds ago')
重新啟動,而只會等到.contains('confirm your email address')
超時。
我也可以運行一些jquery
檢查,但是我自己寫超時和重試,這在Cypress
是不行的......
如何讓Cypress
找到滿足兩個contains
要求的第一行?
編輯:
如果我在should
中編寫多個斷言:
cy.get(".msglist-message", { timeout: 10_000 })
.should(($row) => {
// either fails triggers retry
expect($row.text()).to.match(/a few seconds ago/i);
expect($row.text()).to.match(new RegExp(subject, "i"));
})
.click();
click()
仍然會對所有行(匹配.msglist-message
)有引用,這對我來說是出乎意料的:
cy.click()
只能在單個元素上調用。 您的主題包含 7 個元素。 如果要連續單擊每個元素,請傳遞{ multiple: true }
所以基本上我只是斷言有row
與給定我的多個contains
條件的行匹配,但我仍然無法在其上使用Cypress
命令,例如click
,我沒有對該元素的引用。
似乎should
不能使用 lambda 產生新值。
當我嘗試在should
內單擊時,我得到了一些無休止的重試循環:
cy.get(".msglist-message", { timeout: 10_000 })
.should(($row) => {
// either fails triggers retry
expect($row.text()).to.match(/a few seconds ago/i);
expect($row.text()).to.match(new RegExp(subject, "i"));
cy.wrap($row).click()
})
也許顛倒順序會抓住它?
cy.contains('confirm your email address')
.closest('.row') // get the container
.contains('a few seconds ago') // do you even need this? timeout === 4 seconds
否則, .should(() => expect()...)
將重試
cy.get('.row')
.should($row => {
// either fails triggers retry
expect($row.text()).to.match(/a few seconds ago/i)
expect($row.text()).to.match(/confirm your email address/i)
})
縮小行列表
正如您所提到的, .should()
不會更改主題,因此后續鏈會看到所有行。
要縮小范圍,請使用.contains()
選擇單行
cy.contains('.row', 'Confirm your email address')
.should($row => {
// either fails triggers retry
expect($row.text()).to.match(/a few seconds ago/i)
expect($row.text()).to.match(/confirm your email address/i)
})
.contains('.row', 'Confirm your email address')
.click()
或者您可以在頂部應用.contains()
cy.contains('.row', 'Confirm your email address')
.should($row => {
expect($row.text()).to.match(/a few seconds ago/i)
})
.click()
或(邏輯上)“幾秒鍾前”收到的消息將是頂部的消息
cy.contains('.row', 'Confirm your email address')
.should($row => {
// either fails triggers retry
expect($row.text()).to.match(/a few seconds ago/i)
expect($row.text()).to.match(/confirm your email address/i)
})
.eq(0)
.click()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.