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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不是使用Protractor测试顺序执行JavaScript相关的知识,希望对你有一定的参考价值。

每当我尝试运行使用带有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("
");
    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超时或等待功能?

答案

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

对于这种特殊情况,你不能等待numberOfUsers让你的测试继续进行,你将不得不继续回调函数:

console.log("
");
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");
});

以上是关于不是使用Protractor测试顺序执行JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

来自 Protractor 测试的裸 HTTP 调用

有没有办法在 Allure Reports 中失败一步并使用 Jasmine Protractor 框架继续执行相同的测试用例?

你可以同时使用 Protractor 和 Appium 来测试混合应用程序吗?

推出Protractor但未运行的Firefox

Protractor e2e 测试登录重定向

Protractor JS 中大型任务的最佳设计模式