不是使用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的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Allure Reports 中失败一步并使用 Jasmine Protractor 框架继续执行相同的测试用例?