Условный тест для обхода всплывающего окна с Testcafe

Я использую testcafe для запуска некоторых тестов на странице электронной коммерции, но случайное всплывающее окно нарушает тест. Когда он появляется в окне, Testcafe не может щелкнуть следующий селектор и продвинуться вперед с тестом, а затем терпит неудачу.

В настоящее время я использую файлы .js для хранения селекторов, например:

    import { Selector } from 'testcafe';

    export default class Checkout {
        constructor () {
            //address
            this.addressName = Selector('input#CC-checkoutCepAddressBook-sfirstname');
            this.addressLastname = Selector('input#CC-checkoutCepAddressBook-slastname');

//Rest of selectors...
}

Затем я импортирую их в другой .js и объявляю тесты как функции:

import { ClientFunction } from 'testcafe';
import { Selector } from 'testcafe';
import Fixture from '../../../DesktopModel/Chrome/fixture.js';
import Home from '../../../DesktopModel/Chrome/home.js';
import Cart from '../../../DesktopModel/Chrome/cart.js';
...
const fixtureUrlBase = new Fixture();
const home = new Home();
const pdp = new Pdp();
const cart = new Cart();
...

export async function checkoutLoggedBoleto(t) {

await t
    .click(pdp.addToCartBtn)
    .click(home.finishOrderBtn)
    .click(cart.finishOrderBtn)

    //Rest of the test actions...}

Наконец, я выполняю another.js, где объявляю тесты с помощью команды test:

test
    .before(async t => {
        await login(t);
    })

('Desktop - User Login + Checkout with Invoice', async t => {

    // Function Login  => Search => PDP => Checkout with Invoice 
    await checkoutLoggedBoleto(t);
});

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

Я ищу в тестовом кафе Test API и не нашел такой функции.

Я использую testcafe 0.17.0.


person Bruno Estrazulas    schedule 17.08.2017    source источник


Ответы (1)


TestCafe не предоставляет для этого API. Чтобы справиться с вашим случаем, вы можете проверить, появляется ли всплывающее окно перед каждым действием. При желании, чтобы сделать ваш код более чистым, вы можете обернуть действия API TestCafe следующим образом:

import { t, Selector } from 'testcafe';

const closePopupBtn = Selector('.close-popup');

async function checkPopup () {
    if(await closePopupBtn.exists)
        await t.click(closePopupBtn);
}

const tc = {
    click: async selector => {
        await checkPopup();
        await t.click(selector);
    }
}

test('my test', async () => {
    await tc.click('.btn1');
    await tc.click('.btn2');
});
person Alexander Moskovkin    schedule 17.08.2017
comment
Обновил вопрос с помощью образца кода. Пробовал ваше предложение, но не сработало. Я считаю, что ошибся :) - person Bruno Estrazulas; 18.08.2017
comment
Бруно, ваша страница общедоступна? Я смогу попробовать создать рабочий пример, если вы поделитесь со мной его URL - person Alexander Moskovkin; 22.08.2017
comment
AlexanderMos спасибо, но я предпочитаю попробовать реализовать себя. Я возьму ваш ответ, поделюсь с коллегой и попробую еще раз. - person Bruno Estrazulas; 23.08.2017
comment
Я пробовал ваш код, но VS возвращает TypeError: tc.hover не является функцией. await tc 39 | //.hover(home.firstPromoImg) > 40 | .hover(home.logoLnk) 41 | await tc 42 | .typeText(home.search, product.productName) 43 | .click(home.firstProductImg) - person Bruno Estrazulas; 21.09.2017
comment
Если вы используете этот способ, вы не можете использовать цепи. Вместо await tc.hover('el1').hover('el2') нужно написать await tc.hover('el1'); await tc.hover('el2') - person Alexander Moskovkin; 22.09.2017
comment
Та же ошибка, наверное я что то не так делаю. Я обновил вопрос, указав более подробную информацию о том, как я кодирую тест (не включая ваш ответ). - person Bruno Estrazulas; 22.09.2017
comment
Вы можете попробовать использовать другой подход. Можно ли программно предотвратить всплывающий диалог? Возможно, вы можете установить какой-нибудь файл cookie перед запуском теста, что означает «Не показывать всплывающее окно»? Если это так, вы можете использовать для этого ClientFunction. - person Alexander Moskovkin; 02.10.2017