使用Protractor测试不是顺序执行JavaScript

时间:2017-12-28 18:16:11

标签: javascript angularjs automation protractor

每当我尝试运行使用带有Protractor的JavaScript编写的自动化测试脚本时,我可以看到这两个实际上是彼此独立地并行运行的。例如:

it("Validation of ND account", function() {

    // I logged in, and navigated to the page I need
    // And this is where is gets intresting

    console.log("\n");
    console.log("Before getting number of users");
    var numberOfUsers = element(by.xpath('//div[@viewid="userList"]//div[@class="results-count ng-binding"]')).getText().then(function(text) {
        console.log(text);
    });
    console.log("After getting number of users");

//  for (i=1, i<numberOfUsers, i++) {
//      console.log(i);
//  }

    });

我假设我以相同的顺序获取我的日志 - 之前,数字和之后,但首先我得到JS,然后是Protractor(因为它需要更长的时间来加载)。这是在控制台输出中运行此脚本的结果:

Started
[32m.[0m

Before getting number of users
After getting number of users
161
[32m.[0m

2 specs, 0 failures

话虽如此,我的问题是,如果我想打开一个页面,获取一个元素文本,然后用它执行一些操作(运行一个注释掉的FOR循环),它不会让这样做因为它甚至会在加载页面之前返回一个未解决的承诺。更确切地说,它的作用是在页面加载之前立即开始打开页面,它将运行该循环,这取决于页面中的元素。循环失败,因为元素尚未出现,并且程序仍然没有其text属性。所以这里有一个问题:是否有可能严格遵守脚本序列(在完成量角器命令执行之前不让JS运行脚本在完成量角器命令之后编写)没有JS超时或等待函数?

1 个答案:

答案 0 :(得分:0)

您需要了解Promises并使用回调来使其按顺序工作。

对于这种特殊情况,您不能等待numberOfUsers让您的测试继续进行,您必须继续使用回调函数:

console.log("\n");
console.log("Before getting number of users");
element(by.xpath('//div[@viewid="userList"]//div[@class="results-count ng-binding"]')).getText().then(function(text) {
    console.log(text);
    // continue working here with "text"
    console.log("After getting number of users");
});