UI-Test с Protractor и Angular 8: как заставить один "it ()" ждать 2 минуты правильно? - PullRequest
0 голосов
/ 29 марта 2020

Я знаю, что уже есть некоторые похожие проблемы в stackoverflow, которые покрывают аналогичную проблему. Но все они не решили мой конкретный вопрос.

Описание проблемы

Я хочу, чтобы один шаг теста транспортира подождал 2 минуты, прежде чем продолжить. Я применил все эти подходы, уже упомянутые в других вопросах, о stackoverflow, но все не удалось.

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

Мой пакет. json

{
  "name": "application",
  "version": "0.1.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "8.2.14",
    "@angular/cdk": "8.2.3",
    "@angular/cli": "8.3.23",
    "@angular/common": "8.2.14",
    "@angular/compiler": "8.2.14",
    "@angular/core": "8.2.14",
    "@angular/forms": "8.2.14",
    "@angular/material": "8.2.3",
    "@angular/platform-browser": "8.2.14",
    "@angular/platform-browser-dynamic": "8.2.14",
    "@angular/router": "8.2.14",
    "@ng-bootstrap/ng-bootstrap": "5.1.0",
    "@types/jszip": "^3.1.7",
    "ajv-keywords": "^3.4.1",
    "bootstrap": "4.3.1",
    "core-js": "^2.6.11",
    "hammerjs": "^2.0.8",
    "jquery": "^3.4.1",
    "jszip": "^3.2.2",
    "ngx-bootstrap": "^3.3.0",
    "popper.js": "^1.16.1",
    "rxjs": "~6.4.0",
    "tslib": "^1.10.0",
    "web-animations-js": "2.3.1",
    "xmlbuilder": "^13.0.2",
    "zone.js": "^0.10.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^0.803.23",
    "@angular/compiler-cli": "8.2.14",
    "@angular/language-service": "8.2.14",
    "@types/jasmine": "^3.3.16",
    "@types/jasminewd2": "^2.0.8",
    "@types/node": "^11.15.5",
    "codelyzer": "5.1.0",
    "jasmine-core": "~3.3.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "^4.4.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "^2.0.6",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.5.1",
    "protractor": "^5.4.3",
    "ts-node": "8.3.0",
    "tslint": "5.18.0",
    "typescript": "3.5.3"
  }
}

Мой транспортир.conf

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

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

первоначальный тест

import { browser } from 'protractor';
import { HeaderComponentPO } from '../../src/app/components/generic-ui/header/header.component.po';

describe('Test the backup recovery mechanism', () => {

    it('logs start', () => {
        browser.sleep(500);
        console.log('processing 1000_backup_recovery_mechanism.e2e.ts');
    });

    it('10) calls the app on localhost', () => {
        browser.get('http://localhost:4200');
    });

    it('20) clears the localStorage', () => {
        browser.executeScript('window.localStorage.clear();');
    });

    it('30) waits 2 minutes, then expects the button to appear', () => {
        browser.driver.sleep(120000);
        expect<any>(HeaderComponentPO.getRecoveryButton().isDisplayed()).toBeTruthy();
    });

    it('logs end', () => {
        console.log('finished 1000_backup_recovery_mechanism.e2e.ts');
    });
});

ошибка вхождения после шага 30)

Failed: Timed out after 11000 ms
ScriptTimeoutError: Timed out after 11000 ms

Подход один - продлить DEFAULT_TIMEOUT_INTERVAL для Jasmine

beforeEach(function() {
    originalJasminTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 180000;
});

afterEach(function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = originalJasminTimeout;
});

возникшая ошибка после шага 30)

Failed: Timed out after 11000 ms
ScriptTimeoutError: Timed out after 11000 ms

Второй подход - дополнительно продлить время ожидания сценария драйвера браузера в той же степени

beforeEach(function() {
    originalJasminTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 180000;
    browser.driver.manage().timeouts().setScriptTimeout(180000);
});

afterEach(function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = originalJasminTimeout;
    browser.driver.manage().timeouts().setScriptTimeout(11000);
});

ошибка вхождения после шага 30)

A Jasmine spec timed out. Resetting the WebDriver Control Flow.

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Подход третий - сократить время ожидания скрипта драйвера браузера в меньшей степени

beforeEach(function() {
    originalJasminTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 180000;
    browser.driver.manage().timeouts().setScriptTimeout(110000);
});

afterEach(function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = originalJasminTimeout;
    browser.driver.manage().timeouts().setScriptTimeout(11000);
});

ошибка вхождения после шага 30)

Failed: Timed out after 110000 ms
ScriptTimeoutError: Timed out after 110000 ms

Я также пытался пу t время ожидания в объявлении метода вместо использования browser.driver.sleep. Те же результаты. Это ничего не изменило.

it('30) waits 2 minutes, then expects the button to appear', () => {
    expect<any>(HeaderComponentPO.getRecoveryButton().isDisplayed()).toBeTruthy();
}, 120000);

Так что вы можете видеть, что бы я ни делал, это не сработало. Либо Жасмин, либо водитель жалуются на тайм-ауты. Что я делаю не так? Какой момент я здесь скучаю?

Ответы [ 2 ]

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

Хорошо, так что я сам это выяснил. Проблема в том, что существует процесс waitFor Angular, работающий в фоновом режиме, и когда вы слишком долго ждете, это приводит к сбою участника независимо от того, какое время ожидания установлено. Таким образом, хитрость заключается в том, чтобы деактивировать этот процесс ожидания. Все, что мне нужно было сделать, это добавить этот дополнительный метод:

beforeAll(() => {
    browser.waitForAngularEnabled(false);
});

Вот снова весь мой тест, который теперь работает, как и ожидалось.

import { browser } from 'protractor';
import { HeaderComponentPO } from '../../src/app/components/generic-ui/header/header.component.po';

describe('Test the backup recovery mechanism', () => {
    let originalJasminTimeout: number;

    beforeAll(() => {
        browser.waitForAngularEnabled(false);
    });

    beforeEach(function() {
        originalJasminTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 400000;
        browser.driver.manage().timeouts().setScriptTimeout(400000);
    });

    afterEach(function() {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = originalJasminTimeout;
        browser.driver.manage().timeouts().setScriptTimeout(11000);

    });


    it('logs start', () => {
        browser.sleep(500);
        console.log('processing 1000_backup_recovery_mechanism.e2e.ts');
    });

    it('10) calls the application on localhost', () => {
        browser.get('http://localhost:4200');
        browser.sleep(3000);
    });

    it('20) clears the localStorage', () => {
        browser.executeScript('window.localStorage.clear();');
    });

    it('30) expects the button not to be present', () => {
        expect<any>(HeaderComponentPO.getRecoveryButton().isPresent()).toBeFalsy();
    });

    it('40) waits for 5 minutes and 5 seconds, expects the button then to be displayed', () => {
        browser.driver.sleep(305000);
        expect<any>(HeaderComponentPO.getRecoveryButton().isDisplayed()).toBeTruthy();
    });


    it('logs end', () => {
        console.log('finished 1000_backup_recovery_mechanism.e2e.ts');
    });
});
0 голосов
/ 29 марта 2020

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

exports.config = {
  allScriptsTimeout: 11000,

Просто обновите его, скажем, 5*60*1000 значение

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