簡體   English   中英

賽普拉斯使用多個包含查找 DOM 元素

[英]Cypress finding DOM element using multiple contains

我需要 select 列表中的第一個 email ,但我不知道它什么時候到達。

為 email 設置一個較大的超時時間可能會起作用,但我正在尋找更好的解決方案。

我需要 select 第一行.subjectconfirm 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM