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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування end-to-end тестування для 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

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

Після кожного оновлення ядра або доопрацювання хтось вручну перевіряє кошик, оформлення замовлення та особистий кабінет. Це займає 2–3 години і все одно пропускає регресії — бо жоден тестувальник не перевірить одночасно п'ять браузерів, мобільний вигляд і авторизацію через соцмережі. E2E тести вирішують це автоматично.

Вибір інструменту

Playwright — оптимальний вибір для проєктів на 1С-Бітрікс. Підтримує Chromium, Firefox, WebKit в одному запуску, працює headless і headful, має потужний локатор API, який не ламається при зміні структури DOM. Вбудована підтримка мобільних вьюпортів, мережевого перехоплення, скриншотів.

Cypress — гарний для SPA, але для багатосторінкових сайтів на 1С-Бітрікс його обмеження (один origin, відсутність нативної підтримки кількох вкладок) створюють проблеми.

Інфраструктура

Тестове середовище — обов'язково окрема база даних із фіксованими даними. Жодних тестів на продакшені. Мінімальна структура:

tests/
  e2e/
    fixtures/        # JSON із тестовими даними
    pages/           # Page Object Model
    specs/           # сценарії
  playwright.config.ts
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests/e2e/specs',
  timeout: 30_000,
  retries: process.env.CI ? 2 : 0,
  use: {
    baseURL: process.env.TEST_BASE_URL || 'https://test.shop.example.com',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
  },
  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'mobile',   use: { ...devices['iPhone 13'] } },
  ],
});

Page Object Model для 1С-Бітрікс

Стандартний компонент bitrix:sale.order.ajax має стійкі CSS-класи. Page Object ізолює локатори від тестів:

// tests/e2e/pages/CartPage.ts
import { Page, Locator } from '@playwright/test';

export class CartPage {
  readonly page: Page;
  readonly checkoutButton: Locator;
  readonly totalPrice: Locator;

  constructor(page: Page) {
    this.page           = page;
    this.checkoutButton = page.locator('.basket-checkout-btn');
    this.totalPrice     = page.locator('.basket-coupon-block-total-price-current');
  }

  async goto() {
    await this.page.goto('/personal/cart/');
  }

  async applyPromocode(code: string) {
    await this.page.fill('.basket-coupon-field-input', code);
    await this.page.click('.basket-coupon-apply-btn');
    await this.page.waitForResponse(resp =>
      resp.url().includes('ajax_basket') && resp.status() === 200
    );
  }
}

Ключові сценарії

Додавання в кошик і оформлення замовлення:

// tests/e2e/specs/checkout.spec.ts
import { test, expect } from '@playwright/test';
import { CartPage } from '../pages/CartPage';

test('checkout flow', async ({ page }) => {
  // Додаємо товар зі сторінки каталогу
  await page.goto('/catalog/electronics/headphones/sennheiser-hd-599/');
  await page.click('.catalog-element-offer-set-item:first-child'); // вибір SKU
  await page.click('.btn-buy');
  await expect(page.locator('.bx-basket-count')).toContainText('1');

  // Перехід у кошик
  const cart = new CartPage(page);
  await cart.goto();
  await expect(cart.totalPrice).toBeVisible();

  // Оформлення
  await cart.checkoutButton.click();
  await page.fill('#order-name', 'Іван Іванов');
  await page.fill('#order-email', '[email protected]');
  await page.fill('#order-phone', '+79001234567');
  await page.click('#pay-system-1'); // вибір способу оплати

  await Promise.all([
    page.waitForURL(/\/order\/success\//),
    page.click('.btn-checkout-submit'),
  ]);

  await expect(page.locator('.sale-order-detail-result')).toBeVisible();
});

Авторизація та особистий кабінет:

test('login and account access', async ({ page }) => {
  await page.goto('/personal/login/');
  await page.fill('#USER_LOGIN', '[email protected]');
  await page.fill('#USER_PASSWORD', 'testpassword123');
  await page.click('.login-btn');

  await expect(page).toHaveURL(/\/personal\//);
  await expect(page.locator('.personal-user-name')).toContainText('Іван');
});

Інтеграція в CI/CD

# .github/workflows/e2e.yml
name: E2E Tests
on:
  push:
    branches: [main, staging]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm ci
      - run: npx playwright install --with-deps chromium
      - run: npx playwright test
        env:
          TEST_BASE_URL: ${{ secrets.TEST_BASE_URL }}
      - uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: playwright-report
          path: playwright-report/

Що покривати в першу чергу

Сценарій Пріоритет Компоненти Бітрікс
Додавання в кошик + checkout Критичний sale.basket.basket, sale.order.ajax
Авторизація / реєстрація Критичний system.auth.form
Пошук + фільтрація каталогу Високий search.title, catalog.smart.filter
Застосування промокоду Високий sale.basket.basket.coupon
Особистий кабінет (історія замовлень) Середній sale.personal.order.list

Стабільність тестів — головне завдання. Використовуйте waitForResponse замість waitForTimeout, локатори за data-testid там, де стандартні CSS-класи змінюються при оновленнях шаблону. При нестабільних тестах проблема майже завжди в асинхронності AJAX у 1С-Бітрікс, а не в Playwright.