量角器-如何在定位器中使用“或”

时间:2019-03-09 16:44:27

标签: css protractor automated-tests

我想要实现的目标: 如果该元素可用,则使用它,否则请使用另一个定位器。

编辑:

我之前的解释有点差,所以让我们从头开始。我有2种情况:

  1. 有促销价时。
  2. 不存在销售价格时,仅显示常规价格。

#1案例标记:存在销售价格时。

<td class="total-amount">
   <s>58.00</s> 
   <span>£30.50</span>
</td>

span-销售价格。 s-正常价格。

#2案例标记:没有销售时,仅存在正常价格

<td class="total-amount">£78.00</td>

Basket.js

this.price = this.basket.element(by.css('.total-amount span, .total-amount'));
----
  totalAmount() {
    return this.getAttribute('attribute-name')
      .then(summaryprice => summaryprice.slice(1))
      .then(summaryprice => parseFloat(summaryprice));
  }

Spec.js

expect(delivery + price).toEqual(basket.totalAmount());

#1案例-量角器结果:失败

Expected 30.5 to equal 58.

30.5-(交付成本+价格),这是正确的。 58.0-这是不正确的,因为第一个条件为真,所以不是30.5吗?

如果我要去

this.price = this.basket.element(by.css('.total-amount span'));

那么就没有失败。

我想编写更灵活的测试并涵盖这两种情况,因为价格经常变化。

1 个答案:

答案 0 :(得分:0)

更新后的答案 看来您原来的定位器很好,但是您的totalAmount函数未返回正确的值。如果您确实想对定位器尝试一种替代方法来获取价格,可以尝试这种方法,但是您应该采用的方法。

let price = element(by.css('.total-amount span')).isDisplayed()
    .then(disp => {
        return element(by.css('.total-amount span'));
    })
    .catch(err => {
        return element(by.css('.total-amount'));
    });

原始答案

您正确使用了“或”,但定位器的结构不正确。

如果我们分解定位器element(by.css('.total-amount span, .total-amount'));,我们可以看到有两个条件。如果第一个满意,则将其返回。如果不满意第一个,则找到后返回第二个。

但是,您永远不会得到30.50的返回,因为第二个条件将返回td元素本身。如果您想获得销售价格(如果存在),而<s>(如果销售价格不存在),则您需要运行此行

element(by.css('.total-amount s, .total-amount span'))