Dom 如何防止cy.get从;“快照”;它前面的列表';排序

Dom 如何防止cy.get从;“快照”;它前面的列表';排序,dom,cypress,Dom,Cypress,不是最好的标题,但这是我的挑战。我的页面上有一个可以排序的列表,我需要一个Cypress测试来检查它是否按预期工作。想象一下这个测试: /*1*/cy.get('.list item').eq(0).应该('have.text','A'); /*2*/cy.get('.list item').eq(-1).应该('have.text','Z'); //触发排序从asc更改为desc的代码 /*3*/cy.get('.list item').eq(0).应该('have.text','Z'); /

不是最好的标题,但这是我的挑战。我的页面上有一个可以排序的列表,我需要一个Cypress测试来检查它是否按预期工作。想象一下这个测试:

/*1*/cy.get('.list item').eq(0).应该('have.text','A');
/*2*/cy.get('.list item').eq(-1).应该('have.text','Z');
//触发排序从asc更改为desc的代码
/*3*/cy.get('.list item').eq(0).应该('have.text','Z');
/*4*/cy.get('.list item').eq(-1).应该('have.text','A');
看起来很简单,但排序时会有一点延迟,因此UI不会立即更新

我不确定是
cy.get
还是
eq
函数导致了它,但问题是第3行“捕获”了列表中的第一个元素,它仍然是
'A'
,然后试图断言文本是
'Z'
。当列表被重新排序时,这个“捕获的”元素实际上并没有改变,它只是在DOM中移动,所以断言仍然试图断言同一个元素
'A'
,它现在实际上是DOM中的最后一个元素,是
'Z'
,显然它不是也不应该是

如果我在3之前插入一个
cy.wait(100)
,那么它会按预期工作,但显然我不希望在测试中有随机等待,那么我该如何解决这个问题呢


在这样的情况下,当Cypress在重新排序DOM元素之前捕获它们时,我如何检查第一个和最后一个元素是什么,而不插入任意等待 您需要将
cy.get(…)
.eq
合并到一个选择器中,以确保它在重试后重试断言
.should('have.text','Z')
。了解它-现在它获取列表,然后只重试
.eq()
命令,这太晚了。您还可以重写代码,使用单个
。should(cb)
-文档中的示例非常适合您的用例。

您需要将
cy.get(…)
.eq
合并到单个选择器中,以确保在重新调用后重试断言
。should('have.text',Z')
。了解它-现在它获取列表,然后只重试
.eq()
命令,这太晚了。您还可以使用单个
重写代码以获取第一个和最后一个元素。应该(cb)
-文档中的示例非常适合您的用例。

我在这里做了一个粗略的尝试,但也许您可以使用触发器进行排序

    cy.get('.list-item').eq(0).should('have.text', 'A');
    cy.get('.list-item').eq(-1).should('have.text', 'Z');

    // Code that triggers sorting to change from asc to desc
    cy.get("#id-to-sort").click().then(()=>{

    cy.get('.list-item').eq(0).should('have.text', 'Z');
    cy.get('.list-item').eq(-1).should('have.text', 'A');

    })

我在这里做了一个疯狂的尝试,但也许在触发排序时你可以使用它

    cy.get('.list-item').eq(0).should('have.text', 'A');
    cy.get('.list-item').eq(-1).should('have.text', 'Z');

    // Code that triggers sorting to change from asc to desc
    cy.get("#id-to-sort").click().then(()=>{

    cy.get('.list-item').eq(0).should('have.text', 'Z');
    cy.get('.list-item').eq(-1).should('have.text', 'A');

    })

您是否可以单击其他东西(不起任何作用)以导致瞬时延迟,或者单击输入字段上的
focus()
,然后单击
;blur()
?@Mikkel实际情况有点复杂,所以不是真的,呵呵。同样,我也非常喜欢随机聚焦/模糊的东西,就像我喜欢随机等待一样。你可以点击其他东西(它什么也不做)来引起瞬间延迟,或者在输入字段上点击focus(),然后点击
;blur()
?@Mikkel实际情况有点复杂,所以不是真的,呵呵。我也非常喜欢随机聚焦/模糊的东西,就像我喜欢看起来很有前途的随机等待一样!明天将在工作中试用,看起来很有希望!明天我将在工作中试用,我已经添加了一个实际案例的描述,这比我所问的非常简单的示例要复杂一些,因此实际上没有任何按钮点击。但这看起来确实类似于@gleb bahmutov建议的带有回调的
should
,因此可以尝试类似的方法/我已经添加了对实际情况的描述,这比我所问的非常简单的示例要复杂一些,所以实际上不涉及任何按钮点击。但这看起来确实类似于@gleb bahmutov建议的带有回调的
should
,因此可以尝试类似于/this的方法