Failed: SELENIUM_PROMISE_MANAGER environment variable: undefined

Скачал Саша @xotabu4 твой готовый проект тутай
посколько на готовом проекте в e2e ни как не мог задать baseUrl и запускался localhost посредством karma как я понимаю: плюс билдинг время отнимает (ну думаю еще стоит разобраться в будние)

Тут все проще, скачал, осмотрел своим noobie анализом, написал тест.
Но при запуске такое разочарование(ниже), я уже не могу за сегодня, намучался с настройками, спросить по такой теме не у кого (спасибо хоть за этот доклад очень информативно.
Не понимаю почему, посколько есть параметр
SELENIUM_PROMISE_MANAGER = false

Full Error:
Failed: Unable to create a managed promise instance: the promise manager has been disabled by the SELENIUM_PROMISE_MANAGER environment variable: undefined

В файле protractor.conf.ts -> baseUrl: 'https://my.nice.webapp.com/', укажите URL вашего сайта который тестируете.

Скорее всего в коде вы где-то используете вебдрайверовские промисы напрямую. Но сложно сказать без стектрейса и кода под рукой.

это было сделано в первую очередь, правда в protractor.conf.js
ts - нету файла
вот структура

Я думал вы говорите про мой йомен генератор проектов :slight_smile:

В этом случае посмотрите еще на параметры с которыми вы запускаете протрактор, и на сам метод browser.get() - если вы вызываете его с абсолютной юрл - базовая юрл использоватся не будет.

1 лайк

ну в йомен генератор проектов тоже в protractor.conf.ts baseUrl: 'http://my-web-site ', :slightly_smiling_face:

Вот запустил стандартый тест что идет в проекте для примера: все ок, а когда создал свой файл в specs по принципу homepage.spec.ts
и в page_objects в class BasePage
тоже добавил protected url: хотя она не нада судя по коменту // Will be same as baseUrl by default.

import { browser, element, by, ExpectedConditions, $, $$ } from 'protractor'
import { Login } from "../page_objects/login.page"

и вот элементарный тест, созданный в отдельном файле по прнципу homepage example
но тут ошибка

import { browser, element, by, ExpectedConditions, $, $$ } from 'protractor'
import { Login } from "../page_objects/login.page"

declare let expect:any

describe('first login', function () {
    beforeEach( async () => {
        await new Login().open()
        })

    it( 'User is getting loged in', async function () {
        await expect(browser.getTitle()).toEqual('Project', 'Here is no Sign In page');
        const emailField = element(by.css('input[type=\'email\']'));
        const passwordField = $('.input[type=\'email\']');

        emailField.sendKeys('tylermac2030@gmail.com');
        passwordField.sendKeys('Alexander2030');
        browser.pause(10);

    });
});

вот полный лог ошибки:

1) first login User is getting loged in
        - Failed: Unable to create a managed promise instance: the promise manager has been disabled by the SELENIUM_PROMISE_MANAGER environment variable: undefined
            at new ManagedPromise (/Users/alexandertunick/hotproject/node_modules/selenium-webdriver/lib/promise.js:1031:13)
    at new Deferred (/Users/alexandertunick/hotproject/node_modules/selenium-webdriver/lib/promise.js:1408:20)
    at Object.defer (/Users/alexandertunick/hotproject/node_modules/selenium-webdriver/lib/promise.js:1495:10)
    at DebugHelper.init_ (/Users/alexandertunick/hotproject/node_modules/protractor/lib/debugger.ts:83:35)
    at DebugHelper.init (/Users/alexandertunick/hotproject/node_modules/protractor/lib/debugger.ts:35:10)
    at ProtractorBrowser.pause (/Users/alexandertunick/hotproject/node_modules/protractor/lib/browser.ts:1190:22)
    at UserContext.<anonymous> (/Users/alexandertunick/hotproject/specs/login.spec.ts:18:17)
    at Generator.next (<anonymous>)
    at fulfilled (/Users/alexandertunick/hotproject/specs/login.spec.js:4:58)
    at <anonymous>
From asynchronous test: 
Error
    at Suite.<anonymous> (/Users/alexandertunick/hotproject/specs/login.spec.ts:11:5)
    at Object.<anonymous> (/Users/alexandertunick/hotproject/specs/login.spec.ts:6:1)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)

await нужно добавлять для всех асинхронных операций. Практически это 99% методов протрактора -

import { browser, element, by, ExpectedConditions, $, $$ } from 'protractor'
import { Login } from "../page_objects/login.page"

declare let expect:any //это уже пофикшено в новой версии jasmine-protractor-matchers

describe('first login', function () {
    beforeEach( async function () {
        await new Login().open()
    })

    it( 'User is getting loged in', async function () {
        await expect(await browser.getTitle()).toEqual('Project', 'Here is no Sign In page');
        const emailField = $(`input[type='email']`)
        const passwordField = $(`input[type='email']`) // Обратите внимание что у вас одинаковый локатор для эмейла и пароля!

        await emailField.sendKeys('tylermac2030@gmail.com');
        await passwordField.sendKeys('Alexander2030');
        await browser.sleep(10000); //Время в миллисекундах, и нужно использовать .sleep() а не .pause()

    });
});

Можно еще пожалуйста увидеть ваш пейджобджект - import { Login } from "../page_objects/login.page" ?

1 лайк

Если вы используете ASYNC/AWAIT то промис менеджер нужно выключать.
Добавьте в этот конфиг обьект SELENIUM_PROMISE_MANAGER: false, или можно указать такую же переменную окружения -

Спасибо большое за помощь!
В вашем проекте, поправил код и тупую ошибку
Убрал declare let expect:any но без него 'Project →

specs/login.spec.ts(12,50): error TS2345: Argument of type ‘“Project”’ is not assignable to parameter of type ‘Expected<Promise>’.

Возможно это нужно сделать я так понимаю? https://www.npmjs.com/package/jasmine-protractor-matchers

Почитал здесь про matchers, я так понимаю это те же assertions GitHub - Xotabu4/jasmine-protractor-matchers: This module adds some matchers that will be useful for those who develop test cases with ProtractorJS

  • List of matchers - их нужно добавлять в ручную в config или они уже есть (в вашем проекте)?

  • await browser.sleep(10000) - добавил, но почему то после ‘.’ нету sleep в автокомплите

Добавил await перед каждой командой (как то не учел: хотя слышал как на докладе вы про это упоминали(ну что сказать, вобще только знакомлюсь и начинаю понимать все это: информации много, тяжело: но очень интересно для меня: готов страдать как говориться))
p.s хотя если с passwordField убрать и запустить то тест не упал

Все свиты прошли успешно (дефолтный ‘homepage’ и мой ‘first login’)

Саш, а как лучше запускать тесты, если мне нужно будет запускать один тест и свита, это что мне выходит нужно везде вручную прописывать xdescribe или xit?

Тут вроде все нормально:

import { browser, $, $$} from "protractor";
import { BasePage } from "./base.page";

export class Login extends BasePage {
}

А так спасибо большое снова за помощь.

В свежесозданом проекте уже подключен модуль jasmine-protractor-matchers в package.json, попробуйте просто обновить версию до 2.0.0 - (не забудьте переустановить node_modules после). И добавить в проект теперь нужно через импорт, вот пример - GitHub - Xotabu4/jasmine-protractor-matchers: This module adds some matchers that will be useful for those who develop test cases with ProtractorJS

Буду признателен за пуллреквест в generator-modern-protractor с этим обновлением!

Здесь проблема в том что ваш expect получает промис, а потом сравнивается с строкой, типы которыми описан jasmine - не знают что jasminewd может обрабатывать такие ситуации. Решение очень простое - вместо browser.getTitle()await browser.getTitle()

await expect(await browser.getTitle()).toEqual('Project', 'Here is no Sign In page');

Почитать больше можно здесь -

1 лайк

Ок, с радостью.

Может и други пакеты обновить?

а Protractor до 2.0
@types/node 8.0.54
geckodriver 1.10.0

protractor - там вроде 5.1.2 - судя по бекверд-компатибл изменениям в 5.2.0 - можно безопасно обновить

@types/node - это уже опциональная штука, по хорошему тут каждый поставит ту версию которую он использует. Лучше наверное вообще убрать из package.json

geckodriver - у меня в зависимостях этого нет.

в Protractor.conf.ts добавил

var protractorMatchers = require('jasmine-protractor-matchers');
jasmine.addMatchers(protractorMatchers);

P.S я выставил ECMAScript 6 для javascript
var заменил на const соответсвенно под новый стандарт как понимаю

и удалил там же эти строки что там были: (Норм?)

let matchers = require('jasmine-protractor-matchers')
        jasmine.addMatchers(matchers);

И в тест файл добавил тоже

import { browser, element, by, ExpectedConditions, $, $$ } from 'protractor'
import { Login } from "../page_objects/login.page"
import matchers = require('jasmine-protractor-matchers')

describe('first login', function () {
    beforeEach( async function () {
       jasmine.addMatchers(matchers)

Интересная штучка только осталась - если здесь:

describe('first login', function () {
    beforeEach( async function () {
       jasmine.addMatchers(matchers)

        await new Login().open();

не оставлять gap между строчками то появляеться вот это

если все сделаю через одну строку то пропадает:

Не знаю с чем связано