Скачал Саша @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
Я думал вы говорите про мой йомен генератор проектов
В этом случае посмотрите еще на параметры с которыми вы запускаете протрактор, и на сам метод browser.get() - если вы вызываете его с абсолютной юрл - базовая юрл использоватся не будет.
ну в йомен генератор проектов тоже в protractor.conf.ts baseUrl: 'http://my-web-site ',
Вот запустил стандартый тест что идет в проекте для примера: все ок, а когда создал свой файл в 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" ?
Если вы используете ASYNC/AWAIT то промис менеджер нужно выключать.
Добавьте в этот конфиг обьект SELENIUM_PROMISE_MANAGER: false, или можно указать такую же переменную окружения -
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 {
}
Буду признателен за пуллреквест в generator-modern-protractor с этим обновлением!
Здесь проблема в том что ваш expect получает промис, а потом сравнивается с строкой, типы которыми описан jasmine - не знают что jasminewd может обрабатывать такие ситуации. Решение очень простое - вместо browser.getTitle() → await browser.getTitle()
await expect(await browser.getTitle()).toEqual('Project', 'Here is no Sign In page');
protractor - там вроде 5.1.2 - судя по бекверд-компатибл изменениям в 5.2.0 - можно безопасно обновить
@types/node - это уже опциональная штука, по хорошему тут каждый поставит ту версию которую он использует. Лучше наверное вообще убрать из package.json