在量角器中存储承诺之外的值
Storing values outside of promises in protractor
我的 angular 应用程序中有一个时间轴类型的功能,其中包含玩家的名字和他的描述。所有玩家的名字共享一个名为 player-title.ng-binding
的公共 class,所有玩家的描述共享一个名为 .player-description.ng-binding
的公共 class
为了获得所有名称和各自的描述,我做了以下操作。
element.all(by.css('.player-title.ng-binding')).getText().then(function(name){
//prints name of first player
console.log(name[0]);
});
element.all(by.css('.player-description.ng-binding')).getText().then(function(description){
//prints description of first player
console.log(description[0]);
});
但是我想不出一种方法来检查每个玩家的描述是否正确。例如 expect(name[0]).toEqual(description[0]);
我是 promises 的新手,希望在这件事上有任何意见。
最后我还注意到,当我做这样的事情时,它打印了 undefined。
var name = element.all(by.css('.player-title.ng-binding')).getText().then(function(name){
});
console.log(name[0]);
Html 玩家密码
<!-- player -->
<h4 class="font-thin m-t-lg m-b-lg text-primary-lt">Sponsor player</h4>
<p></p>
<div class="player m-l-sm m-r-sm b-info b-l">
<div ng-repeat = "player in formattedplayerData | orderBy : '-Name'">
<div class = "tl-item">
<i class="pull-left player-badge {{player.class}} "></i>
<div class="m-l-lg">
<div class="player-title">{{player.Name}}</div>
<p class="player-description">{{player.description}}</p>
</div>
</div>
</div>
</div>
<!-- / player -->
对于此事的所有意见,我将不胜感激。
如果你想检查 name
等于 description
:
var name = element.all(by.css('.player-title.ng-binding'))
.first()
.getText();
var description = element.all(by.css('.player-description.ng-binding'))
.first()
.getText();
var nameEqualsDesc = Promise.all([name, description]).then(function(info) {
var name = info[0], description = info[1];
return name === description;
});
expect(nameEqualsDesc).toBe(true);
检查每个名称和描述是否正确:
var correctNames = [...];
var correctDescriptions = [...];
var names = element.all(by.css('.player-title.ng-binding'));
var descriptions = element.all(by.css('.player-title.ng-binding'));
for (var i = 0; i < correctNames.length; i++) {
expect(names.get(i).getText()).toEqual(correctNames[i]);
expect(descriptions.get(i).getText()).toEqual(correctDescriptions[i]);
}
有关详细信息,请查看 ElementArrayFinder#get
编辑:检查所有名称是否等于所有描述(按照评论中的要求):
var names = element.all(by.css('.player-title.ng-binding'))
.map(getText);
var descriptions = element.all(by.css('.player-title.ng-binding'))
.map(getText);
var namesEqualDescriptions = Promise.all([names, descriptions])
.then(function(results) {
return results[0].every(function(name, index) {
return name === results[1][index];
});
});
expect(namesEqualDescriptions).toBe(true);
此解决方案使用 map as specified in the answer by @alecxe, along with Array#every
附加信息:
请记住,promise 是 异步的 ,因此在您的最后一个代码块中,当您 console.log(name[0])
时,name
是一个 promise 的实例,它具有没有 属性 0
,这就是你未定义的原因。
expect
在量角器 understands promises 中,所以你可以给 expect()
一个承诺,它会知道打开它并检查它的实际值。
还要记住 promises unwrap,这意味着如果你 return 在 then()
中调用你分配给原始 promise 的变量的 promise满足该值,例如
var p = Promise.resolve(2).then((x) => Promise.resolve(x * x));
p.then(console.log.bind(console)); // will log 4 (2 * 2)
所以为了得到你想要的东西,你可以 return 来自两个不同承诺的名称和描述,然后将这些承诺提供给 expect
。
此外,您可以使用 first 而不是必须使用带有索引的 then
。
var name = element.all(by.css('.player-title.ng-binding'))
.first()
.getText();
var description = element.all(by.css('.player-description.ng-binding'))
.first()
.getText();
expect(name).toEqual('name');
expect(description).toEqual('description');
要点
- 承诺可能令人困惑,但 using them correctly 会让你的生活更轻松。
ElementArrayFinder
方法可用于访问元素集合中的不同元素
Promise.all
可用于 "join" 完成承诺
every
、some
和 reduce
等列表操作方法可用于生成有关两个集合如何相互关联的信息。恕我直言,它真的 should be easier ;)
更 "protractoric" 的方法是使用 map()
:
var players = element.all(by.css("div.tl-item")).map(function (player) {
return {
name: player.element(by.css("div.player-title")).getText(),
description: player.element(by.css("p.player-description")).getText()
}
});
这里的 players
变量将包含一个承诺,该承诺将导致 玩家对象数组 。如果要查看 players
的实际值,请解决承诺:
players.then(function (playersValue) {
console.log(playersValue);
});
或者,您可以期望它等于预期的数组:
expect(players).toEqual([
{name: "Player 1", description: "Player description 1"},
{name: "Player 2", description: "Player description 2"}
]);
或者,您可以通过索引获取玩家:
players.then(function (playersValue) {
expect(playersValue[0].name).toEqual("Player 1");
expect(playersValue[0].description).toEqual("Player description 1");
});
我的 angular 应用程序中有一个时间轴类型的功能,其中包含玩家的名字和他的描述。所有玩家的名字共享一个名为 player-title.ng-binding
的公共 class,所有玩家的描述共享一个名为 .player-description.ng-binding
为了获得所有名称和各自的描述,我做了以下操作。
element.all(by.css('.player-title.ng-binding')).getText().then(function(name){
//prints name of first player
console.log(name[0]);
});
element.all(by.css('.player-description.ng-binding')).getText().then(function(description){
//prints description of first player
console.log(description[0]);
});
但是我想不出一种方法来检查每个玩家的描述是否正确。例如 expect(name[0]).toEqual(description[0]);
我是 promises 的新手,希望在这件事上有任何意见。
最后我还注意到,当我做这样的事情时,它打印了 undefined。
var name = element.all(by.css('.player-title.ng-binding')).getText().then(function(name){
});
console.log(name[0]);
Html 玩家密码
<!-- player -->
<h4 class="font-thin m-t-lg m-b-lg text-primary-lt">Sponsor player</h4>
<p></p>
<div class="player m-l-sm m-r-sm b-info b-l">
<div ng-repeat = "player in formattedplayerData | orderBy : '-Name'">
<div class = "tl-item">
<i class="pull-left player-badge {{player.class}} "></i>
<div class="m-l-lg">
<div class="player-title">{{player.Name}}</div>
<p class="player-description">{{player.description}}</p>
</div>
</div>
</div>
</div>
<!-- / player -->
对于此事的所有意见,我将不胜感激。
如果你想检查 name
等于 description
:
var name = element.all(by.css('.player-title.ng-binding'))
.first()
.getText();
var description = element.all(by.css('.player-description.ng-binding'))
.first()
.getText();
var nameEqualsDesc = Promise.all([name, description]).then(function(info) {
var name = info[0], description = info[1];
return name === description;
});
expect(nameEqualsDesc).toBe(true);
检查每个名称和描述是否正确:
var correctNames = [...];
var correctDescriptions = [...];
var names = element.all(by.css('.player-title.ng-binding'));
var descriptions = element.all(by.css('.player-title.ng-binding'));
for (var i = 0; i < correctNames.length; i++) {
expect(names.get(i).getText()).toEqual(correctNames[i]);
expect(descriptions.get(i).getText()).toEqual(correctDescriptions[i]);
}
有关详细信息,请查看 ElementArrayFinder#get
编辑:检查所有名称是否等于所有描述(按照评论中的要求):
var names = element.all(by.css('.player-title.ng-binding'))
.map(getText);
var descriptions = element.all(by.css('.player-title.ng-binding'))
.map(getText);
var namesEqualDescriptions = Promise.all([names, descriptions])
.then(function(results) {
return results[0].every(function(name, index) {
return name === results[1][index];
});
});
expect(namesEqualDescriptions).toBe(true);
此解决方案使用 map as specified in the answer by @alecxe, along with Array#every
附加信息:
请记住,promise 是 异步的 ,因此在您的最后一个代码块中,当您 console.log(name[0])
时,name
是一个 promise 的实例,它具有没有 属性 0
,这就是你未定义的原因。
expect
在量角器 understands promises 中,所以你可以给 expect()
一个承诺,它会知道打开它并检查它的实际值。
还要记住 promises unwrap,这意味着如果你 return 在 then()
中调用你分配给原始 promise 的变量的 promise满足该值,例如
var p = Promise.resolve(2).then((x) => Promise.resolve(x * x));
p.then(console.log.bind(console)); // will log 4 (2 * 2)
所以为了得到你想要的东西,你可以 return 来自两个不同承诺的名称和描述,然后将这些承诺提供给 expect
。
此外,您可以使用 first 而不是必须使用带有索引的 then
。
var name = element.all(by.css('.player-title.ng-binding'))
.first()
.getText();
var description = element.all(by.css('.player-description.ng-binding'))
.first()
.getText();
expect(name).toEqual('name');
expect(description).toEqual('description');
要点
- 承诺可能令人困惑,但 using them correctly 会让你的生活更轻松。
ElementArrayFinder
方法可用于访问元素集合中的不同元素Promise.all
可用于 "join" 完成承诺every
、some
和reduce
等列表操作方法可用于生成有关两个集合如何相互关联的信息。恕我直言,它真的 should be easier ;)
更 "protractoric" 的方法是使用 map()
:
var players = element.all(by.css("div.tl-item")).map(function (player) {
return {
name: player.element(by.css("div.player-title")).getText(),
description: player.element(by.css("p.player-description")).getText()
}
});
这里的 players
变量将包含一个承诺,该承诺将导致 玩家对象数组 。如果要查看 players
的实际值,请解决承诺:
players.then(function (playersValue) {
console.log(playersValue);
});
或者,您可以期望它等于预期的数组:
expect(players).toEqual([
{name: "Player 1", description: "Player description 1"},
{name: "Player 2", description: "Player description 2"}
]);
或者,您可以通过索引获取玩家:
players.then(function (playersValue) {
expect(playersValue[0].name).toEqual("Player 1");
expect(playersValue[0].description).toEqual("Player description 1");
});