Для тестов Protractor e2e ... Метод выполнения нестабилен: щелчок три раза по кнопке - PullRequest
0 голосов
/ 23 марта 2020

Следующий метод обрабатывает событие.

exports.movingTowardsNextInstanceStage = () => {
  const nextInstance = manipulations.getDomObject('instance-tab-phases-buttons-next-instance', 'id'); // Next Approval Stage Button

  nextInstance.getText().then((text) => {
    if (text.includes('WEITERLEITEN AN TL')) {
      browser.wait(until.elementToBeClickable(nextInstance), TIMEOUT, 'taking too long to be clickable');
      nextInstance.click();
    }
  }).catch((err) => {
    console.error(err);
  });


  nextInstance.getText().then((text) => {
    if (text.includes('WEITERLEITEN AN LSM')) {
      browser.wait(until.elementToBeClickable(nextInstance), TIMEOUT, 'taking too long to be clickable');
      nextInstance.click();
    }
  }).catch((err) => {
    console.error(err);
  });

  nextInstance.getText().then((text) => {
    if (text.includes('FREIGABE')) {
      browser.wait(until.elementToBeClickable(nextInstance), TIMEOUT, 'taking too long to be clickable');
      nextInstance.click();
    }
  }).catch((err) => {
    console.error(err);
  });
};

Справочная информация: есть одна кнопка (nextInstance), которую нужно нажать три раза, чтобы активировать другую кнопку. Короче говоря ... После каждого нажатия кнопки появляется загрузчик, несколько компонентов активируются и деактивируются и т. Д. Кроме того, это занимает около 2-3 секунд, пока кнопка снова не станет активной. В течение этих трех секунд кнопка отключена.

Я пробовал другие способы нажатия кнопки x раз. Использование Array.forEach, использование setInterval с заданным числом повторений и задержкой, установка неявных ожиданий между каждым событием (щелчком) (это действительно сработало).

Я хочу избежать использования неявных ожиданий.

Я знаю, что не слишком хорошо определил контекст, но, глядя на мой код и мои намерения, есть ли способ улучшить его?

1 Ответ

0 голосов
/ 23 марта 2020

Правильно ли я понимаю, что «WEITERLEITEN AN LSM» должен отображаться после предыдущего щелчка (щелчка после «WEITERLEITEN AN TL»)?

Если это так, ваш код в настоящее время не ожидает для n-го клика, прежде чем проверять n + 1-й текст, и вам нужно цепочка обещаний .catch, точно так же, как .then возвращает новое Обещание, от которого вы можете ждать.

Кроме того, browser.wait также возвращает Обещание, от которого вам также нужно ждать.

Итак , что-то вроде:

  nextInstance.getText().then((text) => {
    if (text.includes('WEITERLEITEN AN TL')) {
      return browser.wait(until.elementToBeClickable(nextInstance), TIMEOUT, 'taking too long to be clickable')
      .then(() => nextInstance.click());
    }
  }).catch((err) => {
    console.error(err);
  })
  .then(() => nextInstance.getText()).then((text) => {
    if (text.includes('WEITERLEITEN AN LSM')) {
      return browser.wait(until.elementToBeClickable(nextInstance), TIMEOUT, 'taking too long to be clickable')
      .then(() => nextInstance.click());
    }
  }).catch((err) => {
    console.error(err);
  });
  // ...

Но если ошибка от n-го клика должна помешать n + 1-му клику, вы должны также пропустить все, кроме последнего .catch вызова.

И Вы можете рассмотреть возможность использования async / await. Это более интуитивно, чем цепочка Promise.

...