无法 return 在量角器框架中承诺来自从另一个文件调用的 javascript 函数
Failed to return promise in protractor framework from javascript function called from another file
我是量角器和 javascript 的新手。我正在构建一个测试框架,其中每个测试套件都有相应的模块文件和定位器文件。在测试套件文件的测试用例中,通过传递参数调用测试模块。
当我试图嵌套调用的函数时,我得到 "TypeError: Cannot read property 'then' of undefined"。我看到许多关于堆栈溢出的解决方案,其中未返回 promise,但我从被调用函数返回 promise。以下是代码文件。
UserPage.js // Test suit from where modules are called
var d = require("../Data/TestCaseData.js");
var login = require("../Modules/LoginPageModule.js");
var user = require("../Modules/UserPageModule.js");
var userl = require("../Locators/UserPageLocators");
describe('first test suit',function(){
beforeEach(function(){
browser.get(d.iManUrl).then(function(){
browser.manage().window().maximize();
login.OSPLogin(d.username,d.password);
})
});
it ('Creating user',function(){
var person = {'Username' : 'u6' , 'Context' : 'novell' , 'Last name' : 'last' , 'Password' : 'n'};
user.InputData(person).then(function(){
//some steps
};
})
})
以下是模块:
/**
* UserPageModule.js
*/
var obj = require("../Locators/LoginPageLocators");
var landing = require("../Locators/LandingPageLocators");
var user = require("../Locators/UserPageLocators");
var usercreated = false;
function UserPageModule(){
this.InputData = function(person){
this.InputUserPasswordContext(person).then(function(person){
this.fill =function(data){
for (var key in data) {
console.log(key);
element(by.xpath(user.identificationAddValueButtonXpath.replace("Input Field", key))).click();
element(by.css(user.identificationValueInputCss)).sendKeys(person [ key ]);
element(by.buttonText(user.identificationAcceptValueButtonText)).click();
}
}
return new Promise(function(resolve,request){
return resolve(this.fill(person));
})
});
}
/*this.InputData = function(person){
this.InputUserPasswordContext(person).then(function(person){
this.InputFields(person);
});
}*/
this.InputUserPasswordContext = function(person){
return new Promise(function(resolve,reject){
//Navigating to user page
element(by.css(landing.userLinkCss)).click();
//Clicking on add button
element(by.css(user.createuserButtonCss)).click();
//Inputting Username
element(by.css(user.usernameInputCss)).sendKeys(person.Username).then(function(){
delete person.Username;
});
//Input password
element(by.css(user.identificationPasswordInputCss)).sendKeys(person.Password);
element(by.css(user.identificationRetypeInputCss)).sendKeys(person.Password).then(function(){
delete person.Password;
});
//Inputting context
element(by.css(user.contextInputCss)).sendKeys(person.Context).then(function(){
delete person.Context;
}).then(function(){
resolve(person);
})
})
}
}
module.exports = new UserPageModule
现在我感觉到用 java 和 selenium 制作模块化测试框架是多么容易。
您遇到的错误很常见,可能是因为 beforeEach
函数中缺少 return
;如果要向其中添加 .then()
,则很可能在 browser.get()
之前需要 return
。我不太确定,但请尝试以下操作:
beforeEach(function(){
return browser.get(d.iManUrl).then(function(){
browser.manage().window().maximize();
login.OSPLogin(d.username,d.password);
});
});
您错过了函数 InputData
顶层的 return
。
this.InputData = function(person){
return this.InputUserPasswordContext(person).then(function(person){....
我是量角器和 javascript 的新手。我正在构建一个测试框架,其中每个测试套件都有相应的模块文件和定位器文件。在测试套件文件的测试用例中,通过传递参数调用测试模块。 当我试图嵌套调用的函数时,我得到 "TypeError: Cannot read property 'then' of undefined"。我看到许多关于堆栈溢出的解决方案,其中未返回 promise,但我从被调用函数返回 promise。以下是代码文件。
UserPage.js // Test suit from where modules are called
var d = require("../Data/TestCaseData.js");
var login = require("../Modules/LoginPageModule.js");
var user = require("../Modules/UserPageModule.js");
var userl = require("../Locators/UserPageLocators");
describe('first test suit',function(){
beforeEach(function(){
browser.get(d.iManUrl).then(function(){
browser.manage().window().maximize();
login.OSPLogin(d.username,d.password);
})
});
it ('Creating user',function(){
var person = {'Username' : 'u6' , 'Context' : 'novell' , 'Last name' : 'last' , 'Password' : 'n'};
user.InputData(person).then(function(){
//some steps
};
})
})
以下是模块:
/**
* UserPageModule.js
*/
var obj = require("../Locators/LoginPageLocators");
var landing = require("../Locators/LandingPageLocators");
var user = require("../Locators/UserPageLocators");
var usercreated = false;
function UserPageModule(){
this.InputData = function(person){
this.InputUserPasswordContext(person).then(function(person){
this.fill =function(data){
for (var key in data) {
console.log(key);
element(by.xpath(user.identificationAddValueButtonXpath.replace("Input Field", key))).click();
element(by.css(user.identificationValueInputCss)).sendKeys(person [ key ]);
element(by.buttonText(user.identificationAcceptValueButtonText)).click();
}
}
return new Promise(function(resolve,request){
return resolve(this.fill(person));
})
});
}
/*this.InputData = function(person){
this.InputUserPasswordContext(person).then(function(person){
this.InputFields(person);
});
}*/
this.InputUserPasswordContext = function(person){
return new Promise(function(resolve,reject){
//Navigating to user page
element(by.css(landing.userLinkCss)).click();
//Clicking on add button
element(by.css(user.createuserButtonCss)).click();
//Inputting Username
element(by.css(user.usernameInputCss)).sendKeys(person.Username).then(function(){
delete person.Username;
});
//Input password
element(by.css(user.identificationPasswordInputCss)).sendKeys(person.Password);
element(by.css(user.identificationRetypeInputCss)).sendKeys(person.Password).then(function(){
delete person.Password;
});
//Inputting context
element(by.css(user.contextInputCss)).sendKeys(person.Context).then(function(){
delete person.Context;
}).then(function(){
resolve(person);
})
})
}
}
module.exports = new UserPageModule
现在我感觉到用 java 和 selenium 制作模块化测试框架是多么容易。
您遇到的错误很常见,可能是因为 beforeEach
函数中缺少 return
;如果要向其中添加 .then()
,则很可能在 browser.get()
之前需要 return
。我不太确定,但请尝试以下操作:
beforeEach(function(){
return browser.get(d.iManUrl).then(function(){
browser.manage().window().maximize();
login.OSPLogin(d.username,d.password);
});
});
您错过了函数 InputData
顶层的 return
。
this.InputData = function(person){
return this.InputUserPasswordContext(person).then(function(person){....