量角器:如果定位器的结果发生变化,则存储在变量中的元素会发生变化

时间:2016-10-27 11:22:06

标签: protractor

我有一个邀请列表,想看一下触发后是否接受了第一个待处理的邀请。

<div class="invitation">
  <h1>A</h1>
  <div class="PENDING">PENDING</div>
</div>
<div class="invitation">
  <h1>B</h1>
  <div class="PENDING">PENDING</div>
</div>

规范中的一些代码,用h1 A

存储第一个待处理的邀请
// get first element with css .PENDING
let pendingTxt = element.all(by.css('.PENDING')).get(0);

// get its parent : div.invitation with h1 A
let invitation = pendingTxt.element(by.xpath('ancestor::div'))

这里有一些脚本更新状态为ACCEPTED的邀请

<div class="invitation">
  <h1>A</h1>
  <div class="ACCEPTED">ACCEPTED</div>
</div>
<div class="invitation">
  <h1>B</h1>
  <div class="PENDING">PENDING</div>
</div>

但是,如果我现在登录邀请,它将返回邀请与h1 B

这意味着邀请已根据pendingText定位器进行了更新。我不确定理解为什么。

但我无法正确存储原始邀请。我试图克隆它没有成功。

1 个答案:

答案 0 :(得分:1)

变量pendingTxt包含ElementFinder的承诺,它将在每次解析时定位元素。您没有通过机制存储元素来定位它。

因此,要存储元素,首先必须将Promise解析为WebElement

protractor.promise.fulfilled(element.all(by.css('.PENDING')).get(0))
  .then(status => {

    expect(status.getText()).toEqual('PENDING');

    //  accept the invitation 

    expect(status.getText()).toEqual('ACCEPTED');

  })

或网页元素列表:

element.all(by.css('.PENDING')).then(statuses => {

  expect(statuses[0].getText()).toEqual('PENDING');

  //  accept the invitation 

  expect(statuses[0].getText()).toEqual('ACCEPTED');

})