在量角器中存储承诺之外的值

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" 完成承诺
  • everysomereduce 等列表操作方法可用于生成有关两个集合如何相互关联的信息。恕我直言,它真的 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");
});