使用带有循环的量角器超时错误

时间:2017-05-16 20:39:18

标签: selenium typescript protractor cucumber

问题简介。因此我的项目使用BDD Framework(Cucumber)在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);
        });

    }
}

1 个答案:

答案 0 :(得分:0)

就我在你的代码中看到的而言,循环将花费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)地狱,并引入更清晰的代码,如此

&#13;
&#13;
@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();
}
&#13;
&#13;
&#13;

这也会对执行时间产生影响。

希望这有帮助