如何迭代和测试 cypress 元素内的不同子元素?

Say*_*osh 3 javascript automated-tests reactjs cypress

所以,我有以下结构中的元素:

<div class="MuiBox-root" data-testid="all-events">
  <ul ....>
    <div class="MuiBox-root" data-testid="event">
    <div class="MuiBox-root" data-testid="event">
    <div class="MuiBox-root" data-testid="event">
Run Code Online (Sandbox Code Playgroud)

现在,每个事件元素内都有以下结构:

 <div class="MuiBox-root" data-testid="event">
  <li .....>
    <div class="MuiBox-root ....." data-testid="event-status">
      <div> Text Value </div>
    <div class="MuiBox-root ....." data-testid="event-name">
    
Run Code Online (Sandbox Code Playgroud)

因此,我要测试的是,如果元素事件状态为已完成或活动,则元素事件名称将出现。所以我使用的方法如下:

cy.get("[data-testid='events']").its("length").then((numEvents) => {
  for (let i = 0; i < numEvents; i++) {
    cy.get("[data-testid='event-status']").each((status, index) => {
      if (index === i) {
        if (isEventActive(status)) {
          cy.get("[data-testid='event-name']").each((name, index) => {
            if (index === i) {
              cy.get(name).should("have.text", "some value");
            }
          });
        } else {
            cy.get("[data-testid='event-name']").each((name, index) => {
            if (index === i) {
              cy.get(name).should("not.exist");
            }
          });
        }
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

上面的代码正在测试我想要测试的内容,但它非常混乱,欢迎任何更简单的方法。

小智 5

将 for 循环转换为.each(). .within()在事件上使用将允许内部get命令特定于事件,并且无需检查索引值。

cy.get("[data-testid='events']").each($event=> { 
  cy.wrap($event).within(() => {
    cy.get("[data-testid='event-status']").each($status => {
      if (isEventActive($status)) {
        cy.get("[data-testid='event-name']").should("have.text", "some value");
      }) else {
        cy.get("[data-testid='event-name']").should("not.exist")
      })
    })
  })
});
Run Code Online (Sandbox Code Playgroud)

也许这也会起作用。使用闭包将两个内部元素($status 和 $name)放入三元表达式中,并使用.should("satisfy", callbackFn)进行“非此即彼”检查。

cy.get("[data-testid='events']").each($event => { 
  cy.wrap($event).find("[data-testid='event-status']").then($status => {
    cy.wrap($event).find("[data-testid='event-name']")
      .should("satisfy", $name => isEventActive($status)  
        ? $name.text() === "some value"
        : $name.length === 0;
      );
    })
  })
});
Run Code Online (Sandbox Code Playgroud)