Транспортир - хорошо работает на локальном хосте, но удаленный выбрасывает Timeout - асинхронный обратный вызов не был вызван в течение указанного времени - PullRequest
0 голосов
/ 15 января 2019

Когда я выполняю protractor protractor.conf.js --baseUrl=http://localhost:4200/, он работает хорошо - заполняет данные, проверяет элементы и т. Д.

Когда я пытаюсь протестировать точно такой же веб-сайт через удаленный URL-адрес protractor protractor.conf.js --baseUrl=http://the-same-website.com/, он открывается в браузере, логины и все необходимые части загружаются, как в localhost, но Protractor / Jasmine не заполняет / щелкает / не проверяет что-либо, и я получаю Тайм-аут после указанного времени:

  - Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
      at ontimeout (timers.js:436:11)
      at tryOnTimeout (timers.js:300:5)
      at listOnTimeout (timers.js:263:5)
      at Timer.processTimers (timers.js:223:10)
  - Failed: script timeout: result was not received in 30 seconds
    (Session info: chrome=71.0.3578.98)

Существуют другие потоки, схожие проблемы с переполнением стека - пробовал browser.ignoreSynchronization = true и Protractor.waitForAngular(false), но затем страница не загружается должным образом и тесты не пройдены, потому что элементы не найдены.

ОБНОВЛЕНИЕ 1

Приведенный ниже тест хорошо работает на локальном хосте - выводит успех или неудачу в зависимости от h1, но на удаленном URL ничего не проверяет, несмотря на загрузку сети:

import { browser, by, element } from 'protractor';

describe('example-test', () => {

  const PATH_TO_TEST = 'specific-path/to/test';

  beforeEach(() => {
    browser.get(PATH_TO_TEST);
  });

  it('should exist header', () => {
    expect(element(by.css('h1')).getText()).toEqual('test');
  });
});

Если я добавлю ведение журнала, я вижу вывод, но expect не выполняется:

import { browser, by, element } from 'protractor';

describe('example-test', () => {

  const PATH_TO_TEST = 'specific-path/to/test';

  beforeEach(() => {
    browser.get(PATH_TO_TEST);
    console.log('beforeEach');
  });

  it('should exist header', () => {
    expect(element(by.css('h1')).getText()).toEqual('test');
    console.log('test end');
  });
});

Конфигурация транспортира:

const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 30000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'chrome'
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  onPrepare() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  }
}

ОБНОВЛЕНИЕ 2

Если я добавлю browser.sleep и browser.ignoreSynchronization, тесты начнут работать, но затем мне нужно будет добавить browser.sleep для каждой синхронизации, которая выглядит не очень хорошо:

beforeEach(() => {
  browser.get('path/to/test');
  browser.sleep(3000);
  browser.ignoreSynchronization = true;
});

Похоже, что транспортир не распознает страницу как полностью загруженную или как угловую сеть.

Почему Protractor не проверяет содержимое, несмотря на то, что страница загружена правильно?

1 Ответ

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

ОБНОВЛЕНО: Завершено изменение исходного предложенного ответа.

Эта проблема может быть связана с характером вашей страницы входа. Если ваш логин не угловой, вы должны проинструктировать транспортира не ждать, пока angular станет тестируемым (что будет по умолчанию). Для этого вы можете использовать команду browser.waitForAngularEnabled (false) , которая является рекомендуемым новым способом, в отличие от предыдущей browser.ignoreSynchronization = true .

После входа в приложение вы можете установить для browser.waitForAngularEnabled значение true, а остальные тесты в этой спецификации должны работать правильно.

describe('Main', function {
  beforeAll(function () {
      browser.waitForAngularEnabled(false);
      Site.login();
      //after you have successfully logged into you site you can 
      browser.waitForAngularEnabled(true);
  });

  it('should show the main page', function () {
     //Your code
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...