ProtractorJS_не работает метод push при попытке вытянуть часть текста в тегах

Добрый день,

Возникла проблема при написании теста. Почему-то не отрабатывает метод push. Код прилагаю. В консоль выводит просто [].

Код в html:

<span grid-data-type="text" class="xh-highlight">4205 - код підтвердження реєстрації </span>

//Код в PageObject’е:

var main_page = function() {
   this.fieldTextSMS = function() {
	return element(by.cssContainingText('span', 'код підтвердження реєстрації'));
};

//Код в тесте:

var codeSMS = [];
it ('Тестируем через нажатие кнопки', function() {
    main_page.fieldTextSMS().getText().then(function(text) {
	codeSMS.push(text.match(/\d{4}/g) + "\n");
	});
console.log(codeSMS);

P.S.: Заметил баг тут, что если ввести в названии темы менее 40 символов, заполнить все поля и нажать кнопку “Создать тему”, то выскочит попап на поле названия темы. Его закрыть. И когда начинаю что-то дописывать в названии темы, то он сразу опять появляется и перекрывает мне все поле ввода.

Всё отрабатывает, просто вы вызываете push в промисе, который выполняется уже после того как пройдет console.log(codeSMS). В Protractor же всё выполняется асинхронно через browser.controlFlow, который создает иллюзию синхронности. Рекомендую ознакомится с этой темой и промисами более детально, это очень необходимо для написания тестов и вообще для работы с JS. Вот тут хорошо описано это angularjs - Using protractor with loops - Stack Overflow

1 лайк

Хм, почитав статью, я поместил console.log(codeSMS) в expect:

	main_page.fieldTextSMS().getText().then(function(text) {
		codeSMS.push(text.match(/\d{4}/g) + "\n");
	});
	expect(console.log(codeSMS));

Но код все равно выводит в консоль [].

Алексей Щербин использование js это требование кот вы не можете обойти - ?
js could be tough… :slight_smile:

You may use ‘real’ protractor if javascript is language of your choice, or the C# or java ports of the same - these are as good as the ‘real’ one, but one is not forced to give up c# or java skills / frameworks

There is also php port i do not know enough to recommend
сергей - один из контрибуторов туда

Не пытайтесь синхронизировать асинхронный код, вам нужно продолжать писать асинхронно. Никакой гарантии что если вы в коде написали по порядку - команды будут выполнятся в том же порядке. Асинхронность это другой подход в организации потока выполнения кода. Ознакомьтесь с официальной документацией селениума по промисам и controlflow - selenium-webdriver/lib/promise

Не слишком понятно что вы хотите потестировать этим тестом, можете приложить весь тест?

Если вам нужно просто проверить формат текста смс кода - используйте матчер - .toMatch() - Redirecting…

it ('Тестируем через нажатие кнопки', function() {
   var codeSMS = main_page.fieldTextSMS().getText()
   expect(codeSMS).toMatch(/\d{4}/g) + "\n", 'SMS code must be in valid format')
});
1 лайк

@sergueik
Команда Angular выпустила специальный блокирующий прокси который будет ждать стабильности приложения прежде чем выполнять ваши команды. Попробуйте использовать его.

When to NOT use?

When you can use the original Protractor framework :slight_smile:

Сами разработчики библиотек которые вы предлагаете рекомендуют использовать ProtractorJS. JavaScript отличный язык, у него есть свои особенности такие как асинхронность выполнения (которая кстати есть и в других языках), прототипная модель наследования, возможность писать как в ООП так и в функциональном стиле и нестрогая типизация. Это очень непривычно для людей которые привыкли к тому что язык четко ограничивает вас как вам писать код (java, c#). Но менять язык только потому что какая-то концепция языка непонятна и лень потратить пару дней на обучение - неправильно. Вы же не меняете дома кран на ведро с водой, только потому что не знаете как установить кран?

1 лайк

Мой тест должен идти на другой ресурс, копировать по указанному набору селекторов с учетом прописанных паттернов (так как там помимо цифр еще и слова есть, а мне нужны только цифры) в массив код, возвращаться на первый ресурс и вставлять из массива код в соответствующее поле.

Console.log я вставлял для того, что бы понять что написанный паттерн работает. А оно вот как получается. И я не вижу ошибку. Возможно есть какие дебагеры для этого

Благодаря помощи Паши Гладуна, победил проблему. Правда немного другим путем. Делюсь вариантом решения.

		B_main_page.tabHistoryInProfile().click();
		browser.sleep(7000);
		B_main_page.fieldTextSMS().getText().then(function(text) {
			return text.replace(' - код підтвердження реєстрації', '');
		}).then(function(result) {
			console.log(result);
			//act - возвращаемся на страницу сайта для ввода кода SMS
			browser.sleep(7000);
			browser.getAllWindowHandles().then(function(handles) {
				browser.driver.close();
				browser.switchTo().window(handles[0]);
				});
			browser.sleep(5000);
			registration_confirmCode_page.enterFieldcodeSMS().sendKeys(result);
			browser.sleep(5000);
			browser.ignoreSynchronization = false;
			registration_confirmCode_page.buttonEnterIn().click();
			browser.sleep(5000);
			});