亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

賽普拉斯:每個循環的 request() 問題

賽普拉斯:每個循環的 request() 問題

夢里花落0921 2023-02-17 16:27:55
我正在使用 Cypress 開發一個測試框架并面臨一個問題,我嘗試執行一個each循環并且每次迭代都對 執行一個request函數<a> tag,然后執行一個斷言響應包含來自regex表達式的特定值。我可以看到它開始執行請求鏈接,但顯然響應的正文太大,以至于瀏覽器停止運行,視覺上顯示 Cypress UI 凍結或似乎沒有響應。(測試可能仍在運行,但 Cypress UI 似乎凍結或非常笨拙。)我曾嘗試尋找有關此問題的解決方案,但沒有任何東西可以作為我困境的解決方案或替代方案。我想過使用 for each 循環來遍歷標簽,但我認為會比我現在擁有的更慢更糟。在與賽普拉斯合作時,有人遇到過這個嗎?代碼:查看和驗證列表內容鏈接的功能測試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);                });            });inspectRequestURL() 的函數(使用 Cypress 的 POM 基頁的一部分)inspectRequestURL(givenValue, propValue, requestSection, requestTarget){        givenValue.then(($a) => {            const prop = $a.prop(propValue);            this.cy.request(prop).its(requestSection).should('include', requestTarget);        })    }
查看完整描述

1 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

雖然這可能不是每個人的解決方案。有人建議我創建一個任務 ( cy.task()) 并使用 Node js 中的代碼來處理請求。對于我的請求,我使用 axios 包來處理獲取請求并在內容與值匹配時返回布爾值以及狀態代碼。


編輯:但是,我仍然看到斷言由于列表中途或接近尾聲的超時而失敗。幾天后我在 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');

                    

                });

            });


    });

新方法:幾天后我重新測試了我的測試代碼,現在我沒有高頻率地遇到超時問題。在嘗試找出替代方案時,我想到了一種同時執行所有請求而不是一個一個執行請求的方法。請求全部完成后,將結果作為一個數組返回,然后執行 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('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');

                    

                }); */

            });


    })


查看完整回答
反對 回復 2023-02-17
  • 1 回答
  • 0 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號