[英]Not sequential execution of JavaScript with Protractor tests
每当我尝试运行使用JavaScript与Protractor编写的自动化测试脚本时,我都可以看到这两个实际上实际上是彼此独立地并行运行的。 例:
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,然后获取量角器(因为加载时间更长)。 这是在控制台输出中运行此脚本的结果:
Started
Before getting number of users
After getting number of users
161
话虽如此,我的问题是,如果我想打开一个页面,获取一个元素文本,然后对其执行一些操作(运行被注释掉的FOR循环),它将不允许这样做,因为它将返回一个尚未加载页面之前尚未解决的承诺。 更确切地说,它的工作是立即开始打开页面,在页面加载之前,它将运行该循环,这取决于页面中的元素。 循环失败,因为该元素尚未出现,并且程序仍然没有其text属性。 所以这是一个问题:是否可以严格遵守脚本序列(不让JS在完成量角器命令执行之前让JS运行在量角器命令之后编写的脚本)而没有JS超时或等待功能?
您需要了解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");
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.