Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

toAppear() and getText() для подтверждения присутсвтия error-текста на странице

protractor
jasmine
javascript
Теги: #<Tag:0x00007fedc46c4918> #<Tag:0x00007fedc46c4738> #<Tag:0x00007fedc46c45d0>

(Olexander Davis) #1

Привет.
Для логин формы, когда вводишь неправильный пароль, выводиться ошибка с текстом
, но в проблема в том не важно какой текст я добавил, все равно тест проходит успешно.

await expect(await browser.element(by.cssContainingText('.common-form-error', 'We do not recognize that email address or password.

Или так, но все равно текст проходит

const errorText = element(by.css('.common-form-error'));
await expect(await errorText.getText()).toEqual('asd assasdASd')

Что не так сделано?

Ага, если полностью заменить текст, то не проходит, но почему тогда не сравнивает на полную единтичность?

const errorMessage = $('.common-form-error');
    const errorText = EC.textToBePresentInElement(errorMessage, 'We do not recognize that email address or password.Please try again or Sign-up to create an account.');
await browser.wait(errorText, 3000);

(Alexander) #2

Касательно последнего:

Возможно там начало новой строки между предложениями. В винде это \r\n
По-крайней мере отсутствие пробела между предложениями наталкивает на такую мысль. Попробуйте так:
‘We do not recognize that email address or password.\r\nPlease try again or Sign-up to create an account.’


(Olexander Davis) #3

Интересно.

Когда меняю текст во втором приложении, даже просто делаю отступ от точки возле слова Please, то тест сразу падает.
Если что то меняю в первом предложении, то ничего, странно, честное слова))

const errorText = EC.textToBePresentInElement(errorMessage, 'We do not recognize that email address or password.Please try again or Sign-up to create an account.');

с \r\n просто падает при правильном тексте, возможно не подходит.


(Сергей Кузьмин) #4

прошу прощения если не в тему а сложно ли на js /ts писать wait condition ? на .net и java не просто о очень просто… для такого случая как раз


(Oleksandr Khotemskyi) #5

Попробуйте так же матчер toBe:

const errorText = await $('.common-form-error').getText()
await expect(errorText).toBe('asd assasdASd', `Actual login error message: ${error Text} does not match expected: 'asd assasdASd'`)

https://jasmine.github.io/edge/introduction#section-Included_Matchers


(Dmitri Komarist) #6

А зачем Вы ставите await перед функциями которые не возвращают промисы, ведь await так не работает.
const errorText = element(by.css(’.common-form-error’));
await expect(await errorText.getText()).toEqual(‘asd assasdASd’) ???
Также он не будет работать внутри функции которая не объявлена с async

Если Вы хотите использовать синтаксис async/await то Вам нужно обьявлять функцию с async
Например
describe(“Describe example”, function() {

it(“It example”, async function() {

const errorText = element(by.css(’.common-form-error’)); // Это желательно вынести в отдельный объект и не совать в каждый тест иначе потом будет очень сложно эти тесты поддерживать

let response = await errorText.getText() //Здесь ожидаем пока элемент появится и берем его значение

let expectedText = “We do not recognize that email address or password” //Здесь прописываем переменную для сравнения

expect(response, Error message should be equal ${expectedText}).toEqual(expectedText ) //Здесь проверяем через заградительное утверждение что сообщение появляется и оно содержит ожидаемый текст
})

})


(Olexander Davis) #7

@xotabu4 спасибо, проверяет полное совпадение текста


(Olexander Davis) #8

Функция обьялена как async

it('Sign in with correct email and incorrect password', async function () {
})

да, спасибо за советы.
Переменная в it обьекте для наглядности, а так выношу в describe обьект почти все самые важные переменные


(Oleksandr Khotemskyi) #9

Очень тонкий момент. Вы правы, если используется jasminewd то он достаточно умный чтобы отрабатывать промисы которые ему передали как параметры:

Кстати обратите внимание - что expect все таки вернул res переменную как промис!
Раньше были разные ошибки когда передавались промисы куда попало - в expected, actual (например - https://github.com/angular/protractor/issues/3020 )

Вроде все пофиксили, но я всеравно добавляю авейт - если промиса не вернулось - то хуже оно не сделает, а если да - я избавляюсь от потенциальной вероятности получить завершение теста до того как экспект отработает.

Здесь у вас неправильная передача параметров, должно быть:

expect(response).toBe(expectedText, `Error message should be equal ${expectedText}` ) //Здесь проверяем через заградительное утверждение что сообщение появляется и оно содержит ожидаемый текст
})