【问题标题】:Time out error using protractor with loops使用带循环的量角器超时错误
【发布时间】:2017-05-17 12:41:44
【问题描述】:

问题的简要介绍。所以我的项目使用 BDD 框架(黄瓜)在 Protractor/Selenium 的帮助下使用 Typescript 作为脚本语言自动化。我将一个包含多行的表传递给步骤定义,并希望使用 typescript/javascript 在迭代模式下运行该函数。我传递了预期的下拉列表值并针对应用程序进行验证。在堆栈溢出的一个主题的帮助下,我提供了以下解决方案。 (Using protractor with loops)

但问题是它并不总是有效。很多时候我遇到函数超时错误。(错误:函数在 30000 毫秒后超时

谁能告诉我我在这里缺少什么?任何帮助将不胜感激。

请在下面找到 Cucumber 和 Typescript 代码。

Cucumber Step Definition_Screenshot

@then(/^.*verify the country data in both the citizenship drop downs$/, 'extratime', 30000)

public VerifyCountryData(table, callback: CallbackStepDefinition): void {
        let promises = []
        let dropcheck
        let dropcheck1
        let promise
        let noOfRows
        var i,j;
        var i1,j1;
        var k,l;
        var funcs = [];
        for (i = 0; i < 2; i++) {
            let index = i;
            funcs[i] = function(index) {




  promises.push(element(by.model('vm.citizenships['+index+'].citizenshipCd')).all(by.tagName('option')).getText().then((CitizenValueList) => {
                        var dropdown = table.rows()[index][1].split(";")
                        for (i1 = 0; i1 < dropdown.length; i1++) {
                            dropcheck = false;
                            for (j1 = 0; j1 < CitizenValueList.length; j1++) {
                                if (dropdown[i1] === CitizenValueList[j1]) {
                                    dropcheck = true;
                                    break;
                                }
                            }
                            if (!dropcheck) {
                                callback("Passed value: '" + dropdown[i1] + "' not found")
                            }
                        }


                        for (k = 0; k < CitizenValueList.length; k++) {
                            dropcheck1 = false;
                            for (l = 0; l < dropdown.length; l++) {
                                if (CitizenValueList[k] === dropdown[l]) {
                                    dropcheck1 = true;
                                    break;
                                }
                            }
                            if (!dropcheck1) {
                                callback("Application value: '" + CitizenValueList[k] + "' not found in expected")
                            }
                        }

                }))

            }.bind(null, i);
        }
        for (j = 0; j < 2; j++) {
            funcs[j]();
        }

       Promise.all(promises).then(() => {
            callback();
        }, (error) => {
            callback(error);
        });

    }
}

【问题讨论】:

    标签: selenium typescript protractor cucumber


    【解决方案1】:

    据我在您的代码中看到的,您的循环将花费超过 30 秒,这是您在 @then(/^.*verify the country data in both the citizenship drop downs$/, 'extratime', 30000) 中给出的超时时间。如果您将其更改为例如60000,您将有更多时间使用此方法。

    升级时间在我看来是治标不治本,还需​​要找到root-超过30秒时间限制的原因。其中一个问题可能是连接速度慢,导致无法足够快地检索 webdriver 调用。您是在本地测试它还是针对云解决方案进行测试?我对云解决方案的经验是 1 个 webdriver-call 最多可能需要 1 秒。如果将其与本地测试相比,本地 webdriver 调用只需几毫秒。

    关于代码。根据您拥有的 Typescript 版本(我认为您至少需要 2.1 版),您可以使用async/await。这将删除所有的promises.push(..)Promise.all(promises) 地狱并引入一个更干净的代码像这样

    @then(/^.*verify the country data in both the citizenship drop downs$/, 'extratime', 30000)
    public async VerifyCountryData(table): Promise < void > {
      const citizenValueListOne = await element(by.model('vm.citizenships[1].citizenshipCd')).all(by.tagName('option')).getText();
      const dropdownOne = table.rows()[1][1].split(';');
      const citizenValueListTwo = await element(by.model('vm.citizenships[2].citizenshipCd')).all(by.tagName('option')).getText();
      const dropdownTwo = table.rows()[2][2].split(';');
    
      for (let i1 = 0; i1 < dropdownOne.length; i1++) {
        let dropdownOnecheck = false;
        for (let j1 = 0; j1 < citizenValueListOne.length; j1++) {
          if (dropdownOne[i1] === citizenValueListOne[j1]) {
            dropdownOnecheck = true;
            break;
          }
        }
        if (!dropdownOnecheck) {
          Promise.reject(`Passed value: '${dropdownOne[i1]}' not found`);
        }
      }
    
      for (let k = 0; k < citizenValueListTwo.length; k++) {
        let dropdownTwocheck = false;
        for (let l = 0; l < dropdownTwo.length; l++) {
          if (citizenValueListTwo[k] === dropdownTwo[l]) {
            dropdownTwocheck = true;
            break;
          }
        }
        if (!dropdownTwocheck) {
          Promise.reject(`Application value: '${citizenValueListTwo[k]}' not found in expected`);
        }
      }
    
      return Promise.resolve();
    }

    这也会影响执行时间。

    希望对你有帮助

    【讨论】:

    • 非常感谢您的回复。真的很感激。好吧,我的项目使用的是 Typescript 1.8.10 版,所以我需要将其升级到 2.1.0 版才能使用 async/await Typescript 功能。同时,我会尝试将等待时间增加到 60000 或更多。正如您正确指出的那样,当我针对云解决方案进行测试时,webdriver 调用需要一些时间,因此它给了我超时错误。
    • 也许this 示例项目可以帮到你
    • 非常感谢。这个链接很有帮助!
    • 我知道,这是我的 ?
    • 太好了。解释清楚
    猜你喜欢
    • 2015-03-10
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多