дождитесь окончания загрузки угловых 2+ - PullRequest
0 голосов
/ 14 января 2019

Недавно я опубликовал вопрос о проблеме, которую я проверяю белым приложением на основе углов (ссылка: , дождитесь, пока Angular закончит загрузку )

Оказывается, что выполненная проверка действительна для угловых приложений 1.x, в то время как наше приложение работает на угловых 6.x.

Затем я обнаружил, что сообщение: Обнаружение того, что Angular 2 завершен, работает

, который объясняет, как выполнить аналогичную проверку, но для угловых приложений 2+. Я настроил проверку таким же образом, как объяснил «Михал Филип».

Я также пытался использовать решение ngWebdriver, предложенное ниже в этом посте.

Обе страдают одной и той же проблемой: проверка всегда будет возвращать true, как и при завершенной загрузке, что не соответствует действительности.

пытался отменить проверку, это не помогло (состояние никогда не менялось)

// Will check if Angular still has pending http_requests ongoing and wait if required
public void untilAngular2HasFinishedProcessing()
{
  until(() ->
    {
      log.info("Waiting on angular 2+ to finish processing");
      final boolean isReady = ((JavascriptExecutor) driver).executeAsyncScript(
        "var callback = arguments[arguments.length - 1];" +
          "if (document.readyState !== 'complete') {" +
          "  callback('document not ready');" +
          "} else {" +
          "  try {" +
          "    var testabilities =  window.getAllAngularTestabilities();" +
            "    var count = testabilities.length;" +
            "    var decrement = function() {" +
            "      count--;" +
            "      if (count === 0) {" +
            "        callback('complete');" +
            "      }" +
            "    };" +
            "    testabilities.forEach(function(testability) {" +
            "      testability.whenStable(decrement);" +
            "    });" +
            "  } catch (err) {" +
            "    callback(err.message);" +
            "  }" +
            "}"
      ).toString().equals("complete");
      log.info("Is angular 2+ ready? " + isReady);
      return isReady;
    }
  );
 }


  // sample call would be
 untilAngular2HasFinishedProcessing();

Ожидается: тест будет ждать, пока Angular завершит загрузку, прежде чем вернет true

Actual: возвращает true с самого начала, что, я знаю, не так.

Возможен ли дубликат? Нет, потому что это проблемный вопрос, основанный на реализации, предложенной в связанном вопросе.

1 Ответ

0 голосов
/ 16 января 2019

Вот решение, которое я использовал в итоге:

public boolean untilAngular2HasFinishedProcessing()
  {
    until(() ->
      {
        log.info("Waiting on angular 2+ to finish processing");
        final boolean isReady = (Boolean.valueOf(((JavascriptExecutor) driver)
          .executeScript(
            "try{" +
          "return (window.getAllAngularTestabilities()[0]._ngZone.hasPendingMicrotasks == " +
          "false && " +
          "window.getAllAngularTestabilities()[0]._ngZone.hasPendingMacrotasks == false && " +
          "window.getAllAngularTestabilities()[0]._ngZone._nesting == 0 &&" +

          "window.getAllAngularTestabilities()[0]._ngZone.isStable == true)" +
          "}" +
          "catch(err) {" +
          "if (err.message == ('window.getAllAngularTestabilities is not a function'))" +
          "{" +
          "return true" +
          "}" +
          "}")
          .toString()));
        log.info("Is Angular 2+ ready? " + isReady);
        return isReady;
      }
    );
    return true;
  }

До сих пор это работало последовательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...