Налаштування Cypress-тестів для 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування Cypress-тестів для 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування Cypress-тестів для 1С-Бітрікс

Cypress — більш сучасна альтернатива Selenium для E2E-тестування фронтенду 1С-Бітрікс. Ключова перевага: тести виконуються всередині браузера, мають повний доступ до DOM і мережі, автоматично чекають появи елементів. Нестабільних тестів («іноді падає, іноді ні») у Cypress менше, ніж у Selenium, тому що немає гонки умов з явними sleep().

Налаштування Cypress-тестів для 1С-Бітрікс

Встановлення і структура

Cypress встановлюється як dev-залежність у папку шаблону або в корінь проєкту:

npm install --save-dev cypress

Структура тестів для проєкту на 1С-Бітрікс:

cypress/
    e2e/
        catalog/
            filter.cy.ts
            product-card.cy.ts
        cart/
            add-to-cart.cy.ts
            checkout.cy.ts
        auth/
            login.cy.ts
    support/
        commands.ts      <- кастомні команди
        e2e.ts           <- глобальні імпорти
    fixtures/
        user.json        <- тестові дані
        product.json
cypress.config.ts

cypress.config.ts для 1С-Бітрікс

import { defineConfig } from 'cypress';

export default defineConfig({
    e2e: {
        baseUrl: 'https://test.site.ru',
        specPattern: 'cypress/e2e/**/*.cy.ts',
        supportFile: 'cypress/support/e2e.ts',
        viewportWidth:  1280,
        viewportHeight: 900,
        defaultCommandTimeout: 8000,
        requestTimeout:        10000,
        video: false,
        screenshotOnRunFailure: true,

        // Налаштування для Бітрікс — сесії та CSRF
        experimentalModifyObstructiveThirdPartyCode: true,
    },
    env: {
        adminLogin:    'admin',
        adminPassword: '', // зі змінної оточення CYPRESS_adminPassword
        siteSessid:    '', // CSRF-токен для API-запитів
    },
});

Кастомні команди для 1С-Бітрікс

// cypress/support/commands.ts
declare global {
    namespace Cypress {
        interface Chainable {
            loginBitrix(login: string, password: string): Chainable<void>;
            addToCart(productUrl: string): Chainable<void>;
            getBitrixSessid(): Chainable<string>;
        }
    }
}

Cypress.Commands.add('loginBitrix', (login, password) => {
    cy.visit('/');
    // Отримуємо sessid з cookie
    cy.getCookie('PHPSESSID').then(() => {
        cy.request({
            method: 'POST',
            url:    '/local/ajax/auth.php',
            body:   { action: 'login', login, password },
        }).then(resp => {
            expect(resp.body.status).to.eq('success');
        });
    });
});

Cypress.Commands.add('addToCart', (productUrl) => {
    cy.visit(productUrl);
    cy.get('[data-action="add-to-cart"]').click();
    // Чекаємо оновлення лічильника кошика
    cy.get('.cart-counter', { timeout: 5000 }).should('not.have.text', '0');
});

E2E-тест каталогу з фільтром

// cypress/e2e/catalog/filter.cy.ts
describe('Розумний фільтр каталогу', () => {
    beforeEach(() => {
        cy.visit('/catalog/tools/');
        // Чекаємо завантаження фільтра і товарів
        cy.get('.catalog-filter').should('be.visible');
        cy.get('.product-list').should('be.visible');
    });

    it('фільтрує товари за брендом', () => {
        cy.get('[data-filter-prop="BRAND"] [value="bosch"]').click();

        // Чекаємо AJAX-оновлення (зникнення лоадера)
        cy.get('.catalog-loading').should('not.exist');

        // URL повинен змінитись
        cy.url().should('include', 'brand=bosch');

        // Всі картки містять бренд Bosch
        cy.get('.product-brand').each($el => {
            cy.wrap($el).should('have.text', 'Bosch');
        });
    });

    it('скидає фільтр', () => {
        cy.get('[data-filter-prop="BRAND"] [value="bosch"]').click();
        cy.get('.catalog-loading').should('not.exist');

        cy.get('.filter-reset-btn').click();
        cy.get('.catalog-loading').should('not.exist');

        cy.url().should('not.include', 'brand=bosch');
    });

    it('відображає коректну кількість товарів у лічильнику фільтра', () => {
        // Перевіряємо, що лічильник оновлюється при зміні фільтра
        cy.get('[data-filter-prop="BRAND"] [value="makita"]').click();
        cy.get('.catalog-loading').should('not.exist');

        cy.get('.products-count').invoke('text').then(text => {
            const count = parseInt(text.replace(/\D/g, ''));
            cy.get('.product-card').should('have.length', Math.min(count, 24)); // 24 — pageSize
        });
    });
});

Тест форми замовлення

// cypress/e2e/cart/checkout.cy.ts
describe('Оформлення замовлення', () => {
    it('успішно оформлює замовлення гостем', () => {
        // Додаємо товар у кошик через UI
        cy.addToCart('/catalog/tools/drills/bosch-gsh/');
        cy.visit('/cart/');
        cy.get('.checkout-btn').click();

        // Заповнюємо форму замовлення
        cy.get('#ORDER_PROP_1').type('Іван Іванов');               // Ім'я
        cy.get('#ORDER_PROP_2').type('[email protected]');           // Email
        cy.get('#ORDER_PROP_3').type('+79001234567');                // Телефон
        cy.get('#ORDER_PROP_6').type('м. Київ, вул. Тестова, 1'); // Адреса

        // Вибираємо доставку
        cy.get('[name="DELIVERY_ID"][value="1"]').click();

        // Вибираємо оплату
        cy.get('[name="PAY_SYSTEM_ID"][value="1"]').click();

        // Приймаємо користувацьку угоду
        cy.get('#agree').check();

        // Відправляємо замовлення
        cy.get('.order-submit-btn').click();

        // Чекаємо сторінки успішного замовлення
        cy.url({ timeout: 15000 }).should('include', '/personal/order/');
        cy.get('.order-success-message').should('be.visible');
    });
});

Перехоплення AJAX-запитів до 1С-Бітрікс

// Мокування AJAX-відповіді для ізольованого тестування
cy.intercept('POST', '/local/ajax/cart.php', {
    statusCode: 200,
    body: {
        status: 'success',
        cart: { items: [], totalCount: 0, totalPrice: 0 },
    },
}).as('cartRequest');

cy.get('[data-action="add-to-cart"]').click();
cy.wait('@cartRequest').its('response.statusCode').should('eq', 200);

Терміни

Завдання Терміни
Встановлення Cypress, базова конфігурація, кастомні команди 4–8 годин
E2E-тести критичних сценаріїв (5–10 тестів) 1–2 дні
Повний набір тестів каталогу + кошик + чекаут 2–4 дні
Інтеграція в GitHub Actions / GitLab CI 4–8 годин