Size: a a a

QA — Автоматизация

2020 July 07

ЕА

Евгений Асовин... in QA — Автоматизация
Евгений Асовин
во, мне что-то подсказывало что так не делается))) тут такой кейс, я в цикле на главной странице нажимаю кнопки и они ведут на страницу регистрации и я проверяю, что открылась именно та страница, что мне нужно. Вот код:
    public void checkButtonsRegisterInMainSlider() {
       $(byXpath(slidesInMainSliderXPath)).shouldBe(Condition.exist);
       int countOfSlides = $$(byXpath(slidesInMainSliderXPath)).size();
       for (int i = 1; i <= countOfSlides; i++) {
           $(byXpath(slidesInMainSliderXPath + "[" + i + "]")).click();
           RegistrationPage.checkForRegistrationPage1();
           if (i == countOfSlides) break;
           open(MyProject.getUrl());
       }
   }
тут вся проблема из-за цикла, без него всё было просто: вызвал в тесте
mainPage.clickButtonRegister
registrationPage.checkForRegistrationPage1

Но у меня это слайдер с разными кнопками и я считаю кол-во этих кнопок и в цикле их проверяю
источник

AV

Alexei Vinogradov in QA — Автоматизация
Sergey Chevychelov
Я не читал всю цепочку. Но, может, создать класс-степ, к которому подключить нужные тебе пейджи и описать нужный тебе метод с нужно логикой?
И если тебе нужно в рамках одного метода вызвать несколько пейджей, то это будет просто обращение к двум объектам пейджей. Все красиво будет
да, это один из стандартных подходов тоже. То есть в моём примере удаляем последнюю строчку, пишем step метод changeAmount:

new EditOrder().changeAmount(newAmount);
new ConfirmationPopup().confirm();
источник

ЕА

Евгений Асовин... in QA — Автоматизация
Sergey Chevychelov
Я не читал всю цепочку. Но, может, создать класс-степ, к которому подключить нужные тебе пейджи и описать нужный тебе метод с нужно логикой?
И если тебе нужно в рамках одного метода вызвать несколько пейджей, то это будет просто обращение к двум объектам пейджей. Все красиво будет
попробую этот подход)
источник

ЕА

Евгений Асовин... in QA — Автоматизация
ещё раз всем спасибо)
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
Евгений Асовин
тут вся проблема из-за цикла, без него всё было просто: вызвал в тесте
mainPage.clickButtonRegister
registrationPage.checkForRegistrationPage1

Но у меня это слайдер с разными кнопками и я считаю кол-во этих кнопок и в цикле их проверяю
я делаю иначе,

mainPage.startRegistration()

registrationPage.completeRegistrationWith(someDataModel) <- и уже в этом методе у меня первым делом -
browser.wait(pageIsLoaded)

типа кому надо - тот и ждет. Методу registrationPage.completeRegistrationWith нужна registration страница - то там и будем ждать
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
а то эти checkForRegistrationPage1() - очень легко забыть вызвать и вообще непонятно что значит check - проверить что открылась? А ждать будет если не открыто еще? А что именно будет check?
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
Иногда немного fluent добавляю типа -

const somePopup = await somePage.openMenu();
await somePopup.blabla()
await somePopup.close()

и somePopup - доступен только или прямым импортом, или как return из openMenu
источник

B

Bola in QA — Автоматизация
mainPage.registration()
registrationPage.isOpened()
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
Bola
mainPage.registration()
registrationPage.isOpened()
isOpened будет ждать или вернет булеан?
источник

SC

Sergey Chevychelov in QA — Автоматизация
ну чисто по семантике должен вернуть булево, которое уже надо в ассерт оборачивать скорее всего
источник

B

Bola in QA — Автоматизация
Oleksandr Khotemskyi
isOpened будет ждать или вернет булеан?
Будет ждать
источник

B

Bola in QA — Автоматизация
Причем, isOpened относится к базовому классу, и ждёт определенный элемент на странице. Если ожидание сложнее, то в самом пейдже переопределяется ожидалка
источник

B

Bola in QA — Автоматизация
Sergey Chevychelov
ну чисто по семантике должен вернуть булево, которое уже надо в ассерт оборачивать скорее всего
Можно назвать waitForPageIsLoaded() 😁
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
Sergey Chevychelov
ну чисто по семантике должен вернуть булево, которое уже надо в ассерт оборачивать скорее всего
+1
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
Bola
mainPage.registration()
registrationPage.isOpened()
ИМХО - waitForPageLoaded лучше если будет protected или private
источник

B

Bola in QA — Автоматизация
Ну, как выше писали, это архитектура Шредингера
источник

СС

Сказочный Сникерс... in QA — Автоматизация
Bola
mainPage.registration()
registrationPage.isOpened()
А лучше сразу в ините
источник

СС

Сказочный Сникерс... in QA — Автоматизация
Если была вызвана пейджа то логично что ожидается что она сейчас будет открыта
источник

OK

Oleksandr Khotemskyi in QA — Автоматизация
Сказочный Сникерс
Если была вызвана пейджа то логично что ожидается что она сейчас будет открыта
не, в конструкторе точно лучше не делать ожидание. Не всегда если создается пейджа значит мы уже на этой странице:

const somePage = new SomePage()

test(‘test 1’, function () {
    somePage.doSomething()
})

test(‘test 2’, function () {
   somePage.doMore()
})

если хочется переиспользовать инстанс страницы - то ожидание в конструкторе сломает все тесты
источник

СС

Сказочный Сникерс... in QA — Автоматизация
Не виду проблем строить логически цепочки с новой инициализацией каждый раз
источник