Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript cypress xhr请求重试超时_Javascript_Xmlhttprequest_Cypress - Fatal编程技术网

Javascript cypress xhr请求重试超时

Javascript cypress xhr请求重试超时,javascript,xmlhttprequest,cypress,Javascript,Xmlhttprequest,Cypress,如果超时,我将尝试执行以下XHR请求重试。如果我删除cy.wait('@formRequest'),测试似乎不会停止以正确地等待响应。但是如果我将cy.wait保留在中,则如果请求超时,测试将失败。因此,我尝试向cy.request调用(如第二个代码块所示)添加一些回调(ontimeout),但这似乎也不起作用。你知道如果响应不是200或者根本没有收到响应,我如何使这个cypress命令重试吗 我对这一点还很陌生,所以如果能解释一下,我将不胜感激 提前谢谢 //这可以工作,但不能处理超时 add

如果超时,我将尝试执行以下
XHR
请求重试。如果我删除
cy.wait('@formRequest')
,测试似乎不会停止以正确地等待响应。但是如果我将
cy.wait
保留在中,则如果请求超时,测试将失败。因此,我尝试向
cy.request
调用(如第二个代码块所示)添加一些回调(ontimeout),但这似乎也不起作用。你知道如果响应不是200或者根本没有收到响应,我如何使这个cypress命令重试吗

我对这一点还很陌生,所以如果能解释一下,我将不胜感激

提前谢谢

//这可以工作,但不能处理超时
add('form_request',(url,formData)=>{
函数递归_请求(url、formData、尝试){
让xhr
常量maxRetry=3
如果(尝试>最大重试){
抛出新错误(`form_request()已达到最大重试次数,${maxRetry}`)
}
如果(尝试!==0){
cy.log(`Backing off retry.trunt:${trunt}/${maxRetry}.`)
等一下(30000)
}
返回cy
.server()
.route('POST',url)
.as('formRequest')
.window()
.然后((赢)=>{
xhr=new win.XMLHttpRequest()
xhr.open('POST',url)
xhr.send(formData)
})
.wait(“@formRequest”)
。然后((resp)=>{
如果(xhr.status!==200){
返回递归_请求(url、formData、尝试+1)
}
返回响应
})
}
返回递归_请求(url、formData、0)
})
Cypress.Commands.add('form_request',(url,formData)=>{
函数递归_请求(url、formData、尝试){
让xhr
常量maxRetry=3
如果(尝试>最大重试){
抛出新错误(`form_request()已达到最大重试次数,${maxRetry}`)
}
如果(尝试!==0){
cy.log(`Backing off retry.trunt:${trunt}/${maxRetry}.`)
等一下(30000)
}
返回cy
.server()
//.route('POST',url)
.路线({
'method':'POST',
“url”:url
}, {
ontimeout:(xhr)=>{
返回新的Cypress.Promise((解析)=>{
解析(递归_请求(url、formData、尝试+1))
})
},
onreadystatechange:(xhr)=>{
if(xhr.status!==200&&xhr.readyState==4){
返回新的Cypress.Promise((解析)=>{
解析(递归_请求(url、formData、尝试+1))
})
}
}
})
.as('formRequest')
.window()
.然后((赢)=>{
xhr=new win.XMLHttpRequest()
xhr.open('POST',url)
xhr.send(formData)
})
.wait(“@formRequest”)
。然后((resp)=>{
如果(xhr.status!==200){
返回递归_请求(url、formData、尝试+1)
}
返回响应
})
}
返回递归_请求(url、formData、0)
})
编辑: 我尝试执行以下自定义cypress命令。但是,我得到了一个非法调用错误。通过查看jQuery.ajax()上的文档,我不清楚它的非法之处

我还有几个问题。。。 #1.传入{timeout:30000}对象是如何工作的?这叫什么?我对承诺链的基本理解是,您可以传入一些处理函数来使用前面的调用产生的任何结果。我还没有看到模式
。那么(arg,function(){…})
之前,这叫什么

#二,。cy.log(…)在这里工作吗?我怀疑不会,因为这会混合同步/异步代码,对吗?(很抱歉,我现在想自己玩它,但我无法让它运行超过非法调用错误)。
const log=Cypress.log(…)
会在这里同步工作吗

  527 |       }
  528 | 
> 529 |       Cypress.$.ajax({
      |                 ^
  530 |         url,
  531 |         method: 'POST',
  532 |         data: formData,
Cypress.Commands.add('form_request',(url,formData)=>{
const waits={请求:2000,重试:10000}
常量maxRetry=3
函数递归_请求(url、formData、尝试=0){
返回新的Cypress.Promise((解析)=>{
如果(尝试>最大重试){
抛出新错误(`form_request()已达到最大重试次数,${maxRetry}`)
}
常量重试=(原因)=>{
console.log(${reason}-在${waits.retry}中重试)/#2
返回setTimeout(()=>{
递归_请求(url、formData、尝试+1)
.then(data=>resolve(data));//从递归结果解析
},等待。重试)
}
Cypress.$.ajax({
网址,
方法:“POST”,
数据:formData,
超时:waits.request,
})
.done(函数(数据、文本状态、jqXHR){
如果(textStatus!=“成功”){
重试('状态未成功')
}
解析(数据)
})
.catch(函数(jqXHR、textStatus、errorshown){
重试(错误抛出)
})
})
}
cy.wrap(空)
。然后({timeout:30000},//#1
() => {
返回递归请求(url、formData)
})
。然后((结果)=>{
返回结果
})
})

测试级别重试

我想看看(Cypress v 5.0+)来处理超时问题

const waitTime=1000;//为演示而缩短
add('form_request',(url,formData)=>{
返回cy
.请求({
方法:“POST”,
网址,
正文:formData,
超时:等待时间
})
。然后((resp)=>{
如果(各自状态!==200){
抛出新错误(`Status not 200`)
}
返回响应
})
})
设尝试次数=0;
它('repeats',{retries:3},()=>{
常量等待=尝试?等待时间:0;//初始等待=0
常量url=尝试次数<2
? 'http://nothing“//最初使用不可访问的url
: 'http://example.com“;//第三次尝试成功
尝试++;
wait(wait).form_请求(url,{name:'Fred'})
})

请求lev