Protractor如何执行函数调用。 (E2E AngularJS +量角器+茉莉花)

时间:2014-08-27 06:53:22

标签: angularjs selenium-webdriver jasmine protractor

我是量角器的新手,目前正在尝试使用内部Angular JS应用程序。在下面的代码片段中,我无法理解Protractor如何执行语句和函数调用。这种行为看起来很奇怪,或者我做错了什么。感谢所有帮助。

    describe('Describe Function', function() 
{

    it('Should return a value',function(){
        var IndexValue = ' ';

        var col_model = element.all(by.repeater('col in renderedColumns'));
        var row_model = element.all(by.repeater('row in renderedRows'));

        browser.get('URL');

        ptor = protractor.getInstance();

        var user = element(by.model('login.user_id_1'));
        user.sendKeys('demo');

        element(by.id('txtusername')).getAttribute('value').then(function(text) {
            console.log(text); // This line prints 'demo'
        });

        var pwd = element(by.model('login.password_1'));
        pwd.sendKeys('demo');

        var submit = element(by.className('login-submit'));
        submit.click();

        browser.driver.sleep(1000);

        var colCount = element.all(by.repeater('col in renderedColumns')).count(); 
        colCount.then(console.log) // This prints '80'

        var items = [];
        getArrayList();
        function getArrayList() // Function to capture all the content of the table in an array
        {
            console.log('Array List function started');
            colCount.then(function(Col_count){
                for(var i=0; i < Col_count; ++i){
                    var grid =  browser.findElement(by.repeater('col in renderedColumns').row(i));
                    grid.getText().then(function(gridValue){
                        items.push(gridValue.trim());
                        console.log('For loop')
                    });
                }
            });
           console.log('Array List function completed');
        }
        console.log(items); // This prints []
        getGridValue('Prospect');
        function getGridValue(name) 
        {

            console.log('Inside grid value');

        }

    });
});

当我执行上面的代码时,甚至在调用浏览器并启动应用程序之前,控制台上会打印前4行(如下所示)。令我惊讶的是,第1点和第3点是函数调用的一部分,它实际上是打印点7.看起来像所有独立的&#34; console.log&#34;首先执行,然后执行&#34; console.log&#34;与&#34;元素相关联。&#34;语句被执行。它真的很混乱。 Plz让我知道我哪里出错了。感谢。

控制台输出
1.阵列列表功能已启动
2. []
3.阵列列表功能完成
4.内部网格值
5.演示
6. 80
7.对于循环
对于循环
对于循环
对于循环
....等等,直到循环结束

1 个答案:

答案 0 :(得分:1)

起初:好吧,量角器做了,你告诉它做什么......你可以阅读一些关于promises和异步JavaScript的内容。

我试着解释一下,请理解,解释一切都需要花费很多时间。

启动量角器调用脚本(spec)。在调用getArrayList()之前编写的大多数行是返回promise的函数调用。这意味着,该函数被调用,并且在准备好后,它的回调函数被调用(例如:then(...)

一个例子:

        var colCount = element.all(by.repeater('col in renderedColumns')).count(); 
        colCount.then(console.log) // This prints '80'

在这两行中,您正在搜索DOM中col in renderedColumns可以找到的每个元素,然后,如果准备就绪,则计算它们并将值返回到其回调then,然后通过console.log

但所有这些都需要时间,这就是console.log('Array List function started');colCount.then(console.log)之前打印的原因。

希望我能提供一些帮助,如前所述,你可以阅读一些关于承诺的内容。