Транспортир - Как использовать «или» в локаторах - PullRequest
0 голосов
/ 09 марта 2019

Чего я хочу добиться: если элемент доступен, используйте его, если нет, то используйте другой локатор.

Редактировать:

Мое предыдущее объяснение былонемного бедны, так что давайте начнем с самого начала.У меня есть 2 случая:

  1. При наличии цены продажи.
  2. Если цена продажи отсутствует, присутствует только обычная цена.

# 1 Case Markup: при наличии цены продажи.

<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 голосов
/ 09 марта 2019

Обновленный ответ Кажется, ваш оригинальный локатор в порядке, но ваша функция 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'))
...