q
库具有此整齐的功能,可以解决多个promise并将其分散到单独的参数中:
如果对数组有保证,则可以使用点差代替。传播函数将值“传播”在实现处理程序的参数上。
return getUsername()
.then(function (username) {
return [username, getUser(username)];
})
.spread(function (username, user) {
});
在量角器中,我们尝试使用来自的内置protractor.promise
函数WebDriverJS
。
问题:
是否可以使用“传播”功能protractor.promise
?
用例示例:
我们已经实现了一个自定义的茉莉花匹配器,以检查元素是否聚焦。在这里,在进行相等比较之前,我们需要解决两个诺言。目前,我们正在使用protractor.promise.all()
和then()
:
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
jasmine.matchersUtil.equals(values[0], values[1]);
});
理想情况下,我们希望其处于更具可读性的状态:
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).spread(function (currentElementID, activeElementID) {
return jasmine.matchersUtil.equals(currentElementID, activeElementID);
})
使用它可能有点麻烦,但是您可以定义一个独立的帮助器函数,该函数可以then()
作为参数传递给并具有回调,通常then()
将其传递给传递给它。然后,此函数将数组值转换为函数参数:
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).then(spread(function (currentElementID, activeElementID) {
// ---^^^----- use helper function to spread args
jasmine.matchersUtil.equals(currentElementID, activeElementID);
}));
// helper function gets a callback
function spread(callback) {
// and returns a new function which will be used by `then()`
return function (array) {
// with a result of calling callback via apply to spread array values
return callback.apply(null, array);
};
}
您仍然可以将其与另一个链接then()
并提供拒绝回调。它使量角器Promise的所有行为保持不变,只是将值数组转换为参数。
缺点是,它是没有一个完美的外观就像在你的榜样(未.all().spread()
不过.all().then(spread())
),你可能会需要创建这个助手模块或全局定义它能够在多个测试文件轻松地使用它。
更新:
借助ES2015,可以与以下对象一起使用解构分配then()
:
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
// Destructure values to separate variables
const [currentElementID, activeElementID] = values;
jasmine.matchersUtil.equals(currentElementID, activeElementID);
}));
问题内容: 我正在编写一个测试用例,用于使用Protractor在Angular应用程序的页面中添加商店信息,在这里我最初是在计算已经拥有的商店数量,并且在完成测试块后,我希望该数量增加一,因此通过遵循创建承诺的链接来做到这一点如何在量角器中创建和操纵承诺? 我希望测试结束时商店的数量是相同的。count()正在解决一个承诺,并且商店计数的正确值会打印在testPromise()中,但是当我调用t
问题内容: 我对angular中的$ q库如何工作有一个不错的想法,但是我不确定量角器或web-driver- js如何使用它们。(特别是因为我认为量角器/网络驱动程序/角度之间的利用率略有不同) 例如,我在量角器教程中看到的示例代码似乎是逐行编写的,并且假定上一个在下一个之前完成。(例如,browser.get(url)后跟browser.getTitle())是否存在某种隐含的承诺?(我不必手
问题内容: 我想使用Node Http模块直接调用服务器以设置我的量角器测试。Http基于回调,我想将其变为promise。 例如,我想让这个函数返回promise: 因此,问题是:我需要什么并代替“以某种方式创造承诺”才能使之起作用? 问题答案: 量角器使用WebDriver的承诺,并在“量角器”上全局公开该API。所以你应该能够做 有关完整的WebDriverJS Promise API,请参
我试图在量角器测试用例中设置一个cookie。我们使用量角器3.3.0,Angular 1.5.x和Node.js 6.9.1 这是规格: 编辑: 我做了一些进一步的实验。请注意,我已经更改了域,并且在成功读取/写入cookie之前没有。 这是我得到的输出: 编辑4: 越来越近了!将域设置为(注意开头的点(.))似乎有效。会做进一步调查并报告。与此同时,如果有人能告诉我为什么这个点是重要的,以及为
问题内容: 在我的测试中,我调用了外部库并在使用量角器运行一些ui测试之前将数据播种到我们的后端。 因此,dataBuilder返回的promise在it()实际完成之前不会得到解决。如何将dataBuilder返回的Promise添加到webDriver的流控制中? 问题答案: 量角器在量角器对象上公开WebDriverJS承诺,因此您可以使用方法或创建新的承诺和使用。 前者可以达到以下目的:
问题内容: 当我在循环中使用Protractor时,循环索引()不是我期望的。 症状: 失败:索引超出范围。尝试访问索引为’x’的元素,但是只有’x’个元素 要么 索引是静态的,并且始终等于最后一个值 我的密码 例如: 要么 要么 问题答案: 发生这种情况的原因是因为量角器使用了诺言。 阅读https://github.com/angular/protractor/blob/master/docs