Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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:每个循环的request()都有问题_Javascript_Node.js_Regex_Loops_Cypress - Fatal编程技术网

Javascript Cypress:每个循环的request()都有问题

Javascript Cypress:每个循环的request()都有问题,javascript,node.js,regex,loops,cypress,Javascript,Node.js,Regex,Loops,Cypress,我正在使用Cypress开发一个测试框架,并面临一个问题:我尝试在上执行一个each循环,每次迭代在标记上执行一个请求函数,然后执行一个断言,表明响应包含来自正则表达式的特定值。我可以看到它开始执行请求链接,但显然响应的主体太大,浏览器停止运行,显示Cypress UI冻结或似乎没有响应。测试可能仍在运行,但Cypress UI似乎已冻结或非常粗糙 我试图寻找解决这个问题的办法,但没有任何办法可以解决我的困境。我曾想过使用for-each循环遍历标记,但我认为这会比我现在拥有的更慢、更糟糕。有人

我正在使用Cypress开发一个测试框架,并面临一个问题:我尝试在上执行一个each循环,每次迭代在标记上执行一个请求函数,然后执行一个断言,表明响应包含来自正则表达式的特定值。我可以看到它开始执行请求链接,但显然响应的主体太大,浏览器停止运行,显示Cypress UI冻结或似乎没有响应。测试可能仍在运行,但Cypress UI似乎已冻结或非常粗糙

我试图寻找解决这个问题的办法,但没有任何办法可以解决我的困境。我曾想过使用for-each循环遍历标记,但我认为这会比我现在拥有的更慢、更糟糕。有人在与Cypress合作时遇到过这种情况吗

代码:查看和验证列表内容链接的功能测试

const steamHeader = new SteamGlobalHeader(cy);

steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = '/^schinese|tchinese|japanese|koreana'+
                '|thai|bulgarian|czech|danish|german|spanish|latam|greek'+
                '|french|italian|hungarian|dutch|norwegian|polish|portuguese'+
                '|brazilian|romanian|russian|finnish|swedish|turkish'+
                '|vietnamese|http://translation.steampowered.com$/';
                steamHeader.get('a[class="popup_menu_item tight"]').should('have.length', 28)
                .each(($a) => {
                    steamHeader.inspectRequestURL(steamHeader.get($a), 'href', 'body', langList);
                });

            });
用于使用Cypress检查POM基页的RequestURL部分的函数

inspectRequestURL(givenValue, propValue, requestSection, requestTarget){
        givenValue.then(($a) => {
            const prop = $a.prop(propValue);

            this.cy.request(prop).its(requestSection).should('include', requestTarget);
        })
    }

虽然这可能不是每个人的解决方案。有人建议我创建一个task cy.task,并使用节点js中的代码来处理请求。对于我的请求,我使用axios包处理get请求,并在内容与值匹配时返回布尔值以及状态代码

编辑:但是,我仍然看到断言失败,因为在我的列表中间或接近末尾时超时。几天后,我在Steam网站上再次测试了这一点,现在我的测试运行可以在1.5分钟内顺利完成。 我确实创建了一种替代方法,一次执行对所有链接的请求,而不是进行迭代。完成时间至少快了10秒

编辑:旧方法: 在cypress/plugins/index.js中找到任务:

const axios = require('axios').default;
 // use axios
module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    //Work on request and return, learn what gets returned
    getURLBodyResponseContains: ({href, target}) => {
        return axios.get(href)
          .then( (response) => {
            //console.log('target: '+ target);
            if (response.data.match(target)) {
              return { answer: true, status: response.status };
            } else {
              return { answer: false, status: response.status };
            }
          })
          .catch((error) => console.log(error));
          
          
    }
})
测试代码:

it.only('Test Lanuage list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);
                
                steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                });
            });

    });
it('Test Language list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);

                //This using task on whole array.
                let urlList = [];
                steamHeader.get('@languageLinks').each(($a) => {
                    urlList.push($a.prop('href'));
                });
                steamHeader.getCy().task('getURLListBodyResponseContains', {hrefList: urlList, target: langList}, {timeout: 100000}).as('returnValue');
                steamHeader.get('@returnValue').then(($value) => {
                    console.log($value);
                    $value.forEach((val) => {
                        console.log(val);
                        steamHeader.getCy().wrap(val).its('status').should('eq', 200);
                        steamHeader.getCy().wrap(val).its('answer').should('be.true');
                    })
                }); 


                //This approach using each loop
               /* steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                }); */
            });

    })
新方法: 几天后我重新测试了我的测试代码,现在我没有频繁地遇到超时问题。在试图找出替代方案时,我提出了一种一次性执行所有请求的方法,而不是逐个执行。请求完成后,将结果作为一个数组返回,然后执行forEach循环,包装对象的属性并运行断言集。使用这种方法,我注意到测试时间快了10秒

任务代码:

const axios = require('axios').default;
 // use axios
module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    //Work on request and return, learn what gets returned
    getURLBodyResponseContains: ({href, target}) => {
        return axios.get(href)
          .then( (response) => {
            //console.log('target: '+ target);
            if (response.data.match(target)) {
              return { answer: true, status: response.status };
            } else {
              return { answer: false, status: response.status };
            }
          })
          .catch((error) => console.log(error));  
    },

    getURLListBodyResponseContains: ({hrefList, target}) => {
     return Promise.all(hrefList.map((href) => {
// Would have wanted to reuse the task from above, but not sure you could reuse a  task within a task.
        return checkIfRequestContains(href, target);
      }))
        .then((result) => {
          return result;
        })
        .catch((error) => console.log(error));
    }
  })
}

function checkIfRequestContains(url, target){
  return axios.get(url)
  .then( (response) => {
    //console.log('target: '+ target);
    if (response.data.match(target)) {
      return { answer: true, status: response.status };
    } else {
      return { answer: false, status: response.status };
    }
  })
  .catch((error) => console.log(error)); 
}
测试代码:

it.only('Test Lanuage list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);
                
                steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                });
            });

    });
it('Test Language list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);

                //This using task on whole array.
                let urlList = [];
                steamHeader.get('@languageLinks').each(($a) => {
                    urlList.push($a.prop('href'));
                });
                steamHeader.getCy().task('getURLListBodyResponseContains', {hrefList: urlList, target: langList}, {timeout: 100000}).as('returnValue');
                steamHeader.get('@returnValue').then(($value) => {
                    console.log($value);
                    $value.forEach((val) => {
                        console.log(val);
                        steamHeader.getCy().wrap(val).its('status').should('eq', 200);
                        steamHeader.getCy().wrap(val).its('answer').should('be.true');
                    })
                }); 


                //This approach using each loop
               /* steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                }); */
            });

    })

虽然这可能不是每个人的解决方案。有人建议我创建一个task cy.task,并使用节点js中的代码来处理请求。对于我的请求,我使用axios包处理get请求,并在内容与值匹配时返回布尔值以及状态代码

编辑:但是,我仍然看到断言失败,因为在我的列表中间或接近末尾时超时。几天后,我在Steam网站上再次测试了这一点,现在我的测试运行可以在1.5分钟内顺利完成。 我确实创建了一种替代方法,一次执行对所有链接的请求,而不是进行迭代。完成时间至少快了10秒

编辑:旧方法: 在cypress/plugins/index.js中找到任务:

const axios = require('axios').default;
 // use axios
module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    //Work on request and return, learn what gets returned
    getURLBodyResponseContains: ({href, target}) => {
        return axios.get(href)
          .then( (response) => {
            //console.log('target: '+ target);
            if (response.data.match(target)) {
              return { answer: true, status: response.status };
            } else {
              return { answer: false, status: response.status };
            }
          })
          .catch((error) => console.log(error));
          
          
    }
})
测试代码:

it.only('Test Lanuage list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);
                
                steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                });
            });

    });
it('Test Language list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);

                //This using task on whole array.
                let urlList = [];
                steamHeader.get('@languageLinks').each(($a) => {
                    urlList.push($a.prop('href'));
                });
                steamHeader.getCy().task('getURLListBodyResponseContains', {hrefList: urlList, target: langList}, {timeout: 100000}).as('returnValue');
                steamHeader.get('@returnValue').then(($value) => {
                    console.log($value);
                    $value.forEach((val) => {
                        console.log(val);
                        steamHeader.getCy().wrap(val).its('status').should('eq', 200);
                        steamHeader.getCy().wrap(val).its('answer').should('be.true');
                    })
                }); 


                //This approach using each loop
               /* steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                }); */
            });

    })
新方法: 几天后我重新测试了我的测试代码,现在我没有频繁地遇到超时问题。在试图找出替代方案时,我提出了一种一次性执行所有请求的方法,而不是逐个执行。请求完成后,将结果作为一个数组返回,然后执行forEach循环,包装对象的属性并运行断言集。使用这种方法,我注意到测试时间快了10秒

任务代码:

const axios = require('axios').default;
 // use axios
module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    //Work on request and return, learn what gets returned
    getURLBodyResponseContains: ({href, target}) => {
        return axios.get(href)
          .then( (response) => {
            //console.log('target: '+ target);
            if (response.data.match(target)) {
              return { answer: true, status: response.status };
            } else {
              return { answer: false, status: response.status };
            }
          })
          .catch((error) => console.log(error));  
    },

    getURLListBodyResponseContains: ({hrefList, target}) => {
     return Promise.all(hrefList.map((href) => {
// Would have wanted to reuse the task from above, but not sure you could reuse a  task within a task.
        return checkIfRequestContains(href, target);
      }))
        .then((result) => {
          return result;
        })
        .catch((error) => console.log(error));
    }
  })
}

function checkIfRequestContains(url, target){
  return axios.get(url)
  .then( (response) => {
    //console.log('target: '+ target);
    if (response.data.match(target)) {
      return { answer: true, status: response.status };
    } else {
      return { answer: false, status: response.status };
    }
  })
  .catch((error) => console.log(error)); 
}
测试代码:

it.only('Test Lanuage list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);
                
                steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                });
            });

    });
it('Test Language list', () => {
        const steamHeader = new SteamGlobalHeader(cy);

        steamHeader.getActionItem('span', 'language').click();

        steamHeader.getActionSection().get('#language_dropdown')
            .within(() => {
                const langList = /^schinese|tchinese|japanese|koreana|thai|bulgarian|czech|danish|german|spanish|latam|greek|french|italian|hungarian|dutch|norwegian|polish|portuguese|brazilian|romanian|russian|finnish|swedish|turkish|vietnamese|Steam Translation Server/;
                steamHeader.get('a[class="popup_menu_item tight"]').as('languageLinks');
                steamHeader.get('@languageLinks').should('have.length', 28);

                //This using task on whole array.
                let urlList = [];
                steamHeader.get('@languageLinks').each(($a) => {
                    urlList.push($a.prop('href'));
                });
                steamHeader.getCy().task('getURLListBodyResponseContains', {hrefList: urlList, target: langList}, {timeout: 100000}).as('returnValue');
                steamHeader.get('@returnValue').then(($value) => {
                    console.log($value);
                    $value.forEach((val) => {
                        console.log(val);
                        steamHeader.getCy().wrap(val).its('status').should('eq', 200);
                        steamHeader.getCy().wrap(val).its('answer').should('be.true');
                    })
                }); 


                //This approach using each loop
               /* steamHeader.get('@languageLinks').each(($a) => {
                    steamHeader.getCy().task('getURLBodyResponseContains', {href: $a.prop('href'), target: langList}, {timeout: 100000}).as('returnValue');
                    steamHeader.get('@returnValue').its('status').should('equal', 200);
                    steamHeader.get('@returnValue').its('answer').should('be.true');
                    
                }); */
            });

    })

您能否在cypress.json文件中写入EnumTestSkeptinMemory:0,然后再试一次。@不走运。我也有同样的行为。我甚至尝试在我的cypress.json文件中使用/不使用numtestkeptinmory在headless中运行测试。从终端开始,即使15分钟过去了,测试也从未结束。我会将此问题发布到Cypress,如果他们能提供解决方案。问题/问题已从Github发布到Cypress:您能在Cypress.json文件中写入EnumTestSkeptinMemory:0,然后重试吗?@ALA不走运。我也有同样的行为。我甚至尝试在我的cypress.json文件中使用/不使用numtestkeptinmory在headless中运行测试。从终端开始,即使15分钟过去了,测试也从未结束。我会将此问题发布到Cypress,如果他们能提供解决方案。问题/问题已从Github发布到Cypress: