Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未能从另一个文件调用的javascript函数返回量角器框架中的承诺_Javascript_Promise_Protractor_Ui Automation - Fatal编程技术网

未能从另一个文件调用的javascript函数返回量角器框架中的承诺

未能从另一个文件调用的javascript函数返回量角器框架中的承诺,javascript,promise,protractor,ui-automation,Javascript,Promise,Protractor,Ui Automation,我不熟悉量角器和javascript。我正在构建一个测试框架,其中每个测试套件都有相应的模块文件和定位器文件。在测试套件文件的测试用例中,通过传递参数调用测试模块。 当我试图用嵌套被调用的函数时,我得到了“TypeError:无法读取未定义的”的属性“then”。我看到了许多关于堆栈溢出的解决方案,其中promise没有返回,但我正在从调用的函数返回promise。下面是代码文件 UserPage.js // Test suit from where modules are called va

我不熟悉量角器和javascript。我正在构建一个测试框架,其中每个测试套件都有相应的模块文件和定位器文件。在测试套件文件的测试用例中,通过传递参数调用测试模块。 当我试图用嵌套被调用的函数时,我得到了“TypeError:无法读取未定义的”的属性“then”。我看到了许多关于堆栈溢出的解决方案,其中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制作模块化测试框架是多么容易

您遇到的错误是常见的,并且可能是由于您的
beforeach
函数中缺少
return
;很可能您需要在
浏览器之前返回
。如果要添加
,则get()
。然后()。我不完全确定,但请尝试以下方法:

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){....

你能复制完整的错误文本吗?这样我们就可以准确地知道错误发生的地方了?是的,我同意您对Java和Selenium的看法,但当您使用量角器时,量角器真的最适合有角度的页面。…@C.Peck现在有一个答案(包括返回后),我没有得到错误。但现在,在InputData的“for loop”执行完成之前,块正在执行。您的输入已删除错误,但现在,在InputData执行完成之前,块正在执行。就是,;然后(function(){element(by.buttonText(“Create”))。单击();})。在这里,元素(by.buttonText(“创建”)).click();在执行'this.fill'(见主要问题)之前执行。坦率地说,我不太理解承诺和javascript。我在网上做了很多研究,但找不到合适的材料来处理量角器的承诺。有些人讨论过“推迟”,但我不能完全理解。在这种情况下,延迟是有帮助的。我的印象是“返回解析(this.fill(person));”将首先执行此操作。返回前填写(个人)。