Testing Codeception waitForElement方法的等效项是什么?

Testing Codeception waitForElement方法的等效项是什么?,testing,codeception,end-to-end,cypress,Testing,Codeception,End To End,Cypress,我正在重写基于PHP的测试框架中的一些测试。我在检测Ajax POST请求获取的新DOM元素时遇到了一个问题 当我使用: cy.wait(timeout); 我能够填充Ajax请求加载的文本输入,但这是一种反模式 我还尝试了以下解决方案:-在我的情况下不起作用。我也需要这个,所以我想我应该写一个 查找时,我无法精确定位waitForElement的源代码,但是在搜索中找到了这个库 它有一个非常简单的实现,所以这里是我对Cypress命令的翻译,基本上是相同的代码,只是我放弃了Promise逻辑

我正在重写基于PHP的测试框架中的一些测试。我在检测Ajax POST请求获取的新DOM元素时遇到了一个问题

当我使用:

cy.wait(timeout);
我能够填充Ajax请求加载的文本输入,但这是一种反模式


我还尝试了以下解决方案:-在我的情况下不起作用。

我也需要这个,所以我想我应该写一个

查找时,我无法精确定位
waitForElement
的源代码,但是在搜索中找到了这个库

它有一个非常简单的实现,所以这里是我对Cypress命令的翻译,基本上是相同的代码,只是我放弃了Promise逻辑,因为Cypress不需要它

我不能肯定地说这是否是一个好的实践,但它似乎与我迄今为止运行的几个粗略的测试一起工作

/cypress/support/wait-for-element.command.js

Cypress.Commands.add('waitForElement',(选择器,超时)=>{
var timeoutOption=timeout | | 2000;//2s
var循环时间=100;
var tryCount=0;
var limitCount=超时选项/循环时间;
var limitCountOption=(limitCount<1)?1:limitCount;
函数tryCheck(解析、拒绝){
if(tryCount{
if(元素!=null){
返回元素
}
setTimeout(函数(){
tryCheck(解决、拒绝);
},循环时间);
})
}否则{
抛出“未找到与选择器匹配的元素:”+选择器
}
tryCount++;
}
返回tryCheck();
})
/cypress/support/commands.js

require('./wait-for-element.command.js')
...
/cypress/integration/my tests.spec.js

cy.waitForElement('div#theid.aclass',3000)。然后(x=>console.log(x))
//.then()不是必需的,只是用于通过控制台进行初始检查

您只需使用
cy.get()
等待渲染某些
DOM
元素即可。Cypress将重试,直到
超时
结束:

cy.get('.request-button').click()
cy.get('.some-new-element', {timeout: 10000})
// Cypress waits up to 10 seconds for element to appear
cy.get('.new-button').click()
// continue with test knowing the DOM has

如果新元素没有唯一的选择器怎么办? 那么您就有了一个更大的问题,因为您无论如何都需要使用选择器对元素执行操作

在这种情况下,如果文本嵌套在元素中的任何位置,可以使用
cy.contains()

您不能这样做:

cy.get('.common-class).contains('new text') 

由于Cypress在成功执行
cy.get()
后不会再次查询
DOM
,因此只需查看已找到的公共类
DOM节点
中的更改。

这一点实际上非常明显。我总是忘记超时选项。@bkucera谢谢你的回答。如果页面内容中已经存在类似的选择器,该怎么办。我正在使用类而不是id处理Ajax内容:。Ajax新内容…:/如果无法通过选择器进行区分,并且您希望等待类
myClass
的3个元素,那么我猜您可以将超时转移到
eq()
命令,如下所示:
cy.get('.myClass').eq(2,{timeout:3000})实际上,
@RichardMatsen…这将不起作用,因为如果DOM查询已经成功,Cypress将不会重试该查询…因此Cypress将找到
.myclass
,并且永远不会返回查找新的。这允许您在元素可能在中丢失引用后保留对该元素的引用DOM@drupality查看非唯一选择器的更新答案没有理由编写此自定义命令,因为您编写的所有内容都是以Cypress的默认工作方式构建的,而不仅仅是针对
cy.get()
。每个DOM命令都将自动重试,直到在DOM中找到元素为止。通过链接断言,您甚至可以自动让命令重试,直到所有断言都通过。实际上,
cy.get(element)
不可能生成
null
,这意味着超出该值的所有实现代码将永远无法运行。细节是一个完全不同的问题,但本质上,在渲染完成之前,我有大约20个xhr和一些计算<代码>cy.route(…).as('myvar')。。。cy.wait('@myvar')只等待前3个xhr。我不得不使用
cy.wait(5000)
并同意@drupality的说法,即这是一种反模式。升级到Cypress v2.1.0后,我可以删除等待,但只有使用
before()
获取页面时,等待仍然有效。如果我切换到beforeach(),它仍然是片状的。正如@bkucera所示,我们可以简单地增加
cy.get()
的超时时间,直到他指出,我才意识到这一点。尽管如此,非唯一选择器的边缘情况在逻辑上留下了一点空白——即使将文本内容作为区分选择器也不可能在所有情况下都可行。我仍然认为自定义命令在某些情况下可以不那么脆弱。@RichardMatsen我试过使用DOM中已经存在的类,但不起作用。
cy.get('.common-class).contains('new text')