问题简介。因此我的项目使用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);
});
}
}
答案 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)
地狱,并引入更清晰的代码,如此
@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;
这也会对执行时间产生影响。
希望这有帮助