我在使用赛普拉斯测试虚拟滚动组件时遇到了一些问题。我有一个测试,在滚动到容器的底部后检查DOM中存在的li元素。
如果这样写,测试通过:
cy.get('.virtual-scroll').scrollTo('bottom')
cy.wait(0)
cy.get('li').last().children('h4').contains('1999')
如果这样写的话不会:
cy.get('.virtual-scroll').scrollTo('bottom')
cy.get('li').last().children('h4').contains('1999')
这也失败了:
cy.get('.virtual-scroll').scrollTo('bottom').get('li').last().children('h4').contains('1999')
在第二个和第三个例子中,get('li')在滚动完成之前返回存在的li元素,因此未通过测试。我可以通过添加.wait来解决这个问题,但是不能完全理解这种行为,并想知道这是不是一个bug。
有什么想法吗?
答案 0 :(得分:0)
创建一个在呈现DOM
时始终会通过的断言,例如将.get()
用于添加到DOM
的元素
ex)如果您有<ul class="myloadedlist">....
:
cy.get('.virtual-scroll').scrollTo('bottom')
cy.get('ul.myloadedlist')
cy.get('li').last().children('h4').contains('1999')
这样,一旦该元素变得可见,赛普拉斯将继续进行测试。
我假设在某种滚动DOM
中将元素添加到eventListener
。在这种情况下,这是正确的行为。
基本上,您测试过的是竞争条件用户将非常快速地滚动到页面底部,以查看{{1}尚未完成渲染 - 一个有效的senario。
由于您定位了DOM
last()
元素,赛普拉斯会在li
更新之前找到 页面的最后一个元素并且,即使在赛普拉斯重试4秒后,预计也不会DOM
contain
。
这实际上是赛普拉斯的一个很棒的功能,因为您可以测试用户可能只看到分秒的1999
状态。