сообщение об ошибке не отображается в транспортире - PullRequest
1 голос
/ 07 января 2020

Я запускаю сценарии Protractor в среде Jasmine из Visual Studio Code V1.41.1, но, похоже, не могу выполнить код обработки ошибок. Похоже, что онлайн-справка указывает на формат, похожий на этот:

    elm.isDisplayed().then(function() { /* passing case */}, function(err) { /* error handling here */})

Я пытался использовать этот тип формата в моем реальном сценарии, но не могу получить ожидаемые результаты. Насколько я вижу, это просто двоичный выбор ... Либо отображается заголовок, либо он НЕ отображается. Если он отображается, код проверяет, соответствует ли количество записей, отображаемых в таблице результатов, количеству записей, отображаемых в заголовке. Если он НЕ отображается, то отображается сообщение о том, что записи не найдены, и тест переходит к следующему блоку it . Я использую следующий код:

    it('  Verified: Search results record count matches the expected total', function () {

      let intTotalCount = 0;
      let intRecordCount = 0;
      // See if the Search Results "items in the list" header is displayed
      reportPage.getResultHeaderIsDisplayed()
        .then(function () {
            reportPage.getResultCount()
              .then(function (tCount: any) {
                intTotalCount = tCount;

                return intTotalCount;
              })

              .then(function (rCount: any) {
                reportPage.getSRCount();
                intRecordCount = rCount;

                return intRecordCount;
              })

              .then(function () {
                console.log('          Expect: ' + intRecordCount + ' = ' + intTotalCount);

                if (!(intRecordCount === intTotalCount)) {
                  console.log('***   ERROR:  Number of records DOES NOT match the expected total');
                }

                expect(intRecordCount).toEqual(intTotalCount);
              })
        }, function (msg) {
          msg = "Records Not Found!"
          console.log("\n        *** " + msg + " ***\n");
        })
    });

Я использую специальные вызовы функций:

    // PO File:
    // Items Found Header:
    resultHeader = element(by.xpath('//body//h5[not(@class="ng-hide")]'));

    // Search Results Count:
    public getResultHeaderIsDisplayed() {
      this.browserHelper.wait('//h3[@class="panel-title"]', 'xpath');
      return this.navigationHelper.isElementDisplayed(this.resultHeader);
    }


    // Navigation Helper:
    async isElementDisplayed(ele: ElementFinder) {
      return await ele.isDisplayed();
    }

Если найдены результаты поиска, отображается ожидаемая информация таблицы и код работает просто отлично. Однако, если результаты не найдены, отображается красный баннер «Записи не найдены». То, что я пытался сделать sh, это просто отображение "Записи не найдены!" сообщение в окне вывода. Что я на самом деле получаю, так это (и ожидаемое сообщение НЕ отображается) ...

    ×   Verified: Search results record count matches the expected total
      - Failed: Wait timed out after 20420ms
          at C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:2201:17
          at ManagedPromise.invokeCallback_ (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:1376:14)
          at TaskQueue.execute_ (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:3084:14)
          at TaskQueue.executeNext_ (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:3067:27)
          at asyncRun (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:2927:27)
          at C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:668:7
          at <anonymous>
          at process._tickCallback (internal/process/next_tick.js:189:7)
      From: Task: <anonymous wait>
          at scheduleWait (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:2188:20)
          at ControlFlow.wait (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:2517:12)
          at Driver.wait (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\webdriver.js:934:29)
          at run (C:\Users\Ops-UI\node_modules\protractor\built\browser.js:59:33)
          at ProtractorBrowser.to.(anonymous function) [as wait] (C:\Users\Ops-UI\node_modules\protractor\built\browser.js:67:16)
          at BrowserHelper.wait (C:\Users\Ops-UI\apps\safe-e2e\src\helpers\browser.helper.ts:55:30)
          at reportPage.getResultHeaderIsDisplayed (C:\Users\Ops-UI\apps\e2e\src\pageobjects\report.po.ts:1055:28)
          at UserContext.<anonymous> (C:\Users\Ops-UI\apps\e2e\src\specs\verify-report.e2e-spec.ts:435:25)
          at new ManagedPromise (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:1077:7)
          at ControlFlow.promise (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:2505:12)
          at TaskQueue.execute_ (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:3084:14)
          at TaskQueue.executeNext_ (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:3067:27)
          at asyncRun (C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:2974:25)
          at C:\Users\Ops-UI\node_modules\selenium-webdriver\lib\promise.js:668:7
      From: Task: Run it("  Verified: Search results record count matches the expected total") in control flow
          at runCallback (timers.js:810:20)
          at tryOnImmediate (timers.js:768:5)
      From asynchronous test:
      Error
          at Suite.<anonymous> (C:\Users\Ops-UI\apps\e2e\src\specs\verify-report.e2e-spec.ts:431:5)
          at Object.<anonymous> (C:\Users\Ops-UI\apps\e2e\src\specs\verify-report.e2e-spec.ts:45:1)
          at Module._compile (module.js:653:30)
          at Module.m._compile (C:\Users\Ops-UI\node_modules\ts-node\src\index.ts:439:23)
          at Module._extensions..js (module.js:664:10)
          at Object.require.extensions.(anonymous function) [as .ts] (C:\Users\Ops-UI\node_modules\ts-node\src\index.ts:442:12)          at Module.load (module.js:566:32)
          at tryModuleLoad (module.js:506:12)
          at Function.Module._load (module.js:498:3)
          at Module.require (module.js:597:17)
          at require (internal/module.js:11:18)

Как вы можете видеть, я получаю дамп стека, который не говорит мне ничего, кроме того факта, что он пытался найти объект заголовка не смог его найти и истек тайм-аут после 20420 мс, но ожидаемое сообщение об ошибке игнорируется. Как избавиться от дампа стека и просто отобразить сообщение?

1 Ответ

0 голосов
/ 08 января 2020

Проблема довольно проста, ваш жасминовый тест не знает о ваших асиновых c командах, а просто достигает конца блока it и думает, что это конец теста.

Вам необходимо вернуться Обещание, которое будет решено, когда ваш тест завершен ИЛИ использовать async / await, и обещание будет возвращено неявно, вот документы: https://jasmine.github.io/tutorials/async

Для вас исправление будет очень простым, просто добавьте return к вашей цепочке обещаний:

it('  Verified: Search results record count matches the expected total', function () {

  let intTotalCount = 0;
  let intRecordCount = 0;
  // notice return added!
  return reportPage.getResultHeaderIsDisplayed().then(
    ... rest of code...
});

Но я настоятельно рекомендую переписать код для повсеместного использования async / await и установить SELENIUM_PROMISE_MANAGER: false в вашей конфигурации.

Посмотрите, как чище Ваш код может быть:

it('  Verified: Search results record count matches the expected total', async function () {
    await reportPage.getResultHeaderIsDisplayed();
    const intTotalCount = await reportPage.getResultCount();
    const intRecordCount = reportPage.getSRCount();
    expect(intRecordCount).toEqual(intTotalCount, '***   ERROR:  Number of records DOES NOT match the expected total');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...