selectOption() работает только с нативными элементами

Простейший случай: стандартный HTML-элемент . Для кастомных дропдаунов нужен другой подход.

Большинство современных приложений используют кастомные компоненты (React Select, Headless UI, Material UI) вместо нативного или

/

React Select использует специфичные CSS-классы. Если твоя версия генерирует другие имена классов, адаптируй соответственно. По возможности предпочитай getByRole:

// Лучше — использует семантические роли
await page.getByRole('combobox', { name: 'Country' }).click();
await page.getByRole('option', { name: 'Germany' }).click();

Мультиселект дропдауны

// Нативный <select multiple>
await page.getByLabel('Skills').selectOption(['playwright', 'typescript', 'cicd']);

// Кастомный мультиселект: кликаем несколько опций
await page.getByRole('button', { name: 'Skills' }).click();
await page.getByRole('option', { name: 'Playwright' }).click();
await page.getByRole('option', { name: 'TypeScript' }).click();
await page.getByRole('option', { name: 'CI/CD' }).click();

// Закрыть дропдаун
await page.keyboard.press('Escape');

// Проверить выбранные значения
await expect(page.getByTestId('selected-skills')).toContainText('Playwright');
await expect(page.getByTestId('selected-skills')).toContainText('TypeScript');

Дропдауны дат (день, месяц, год)

Поля ввода даты с отдельными дропдаунами для месяца, дня и года:

await page.getByLabel('Month').selectOption('June');
await page.getByLabel('Day').selectOption('15');
await page.getByLabel('Year').selectOption('1990');

Для :

// Работает во всех браузерах
await page.getByLabel('Date of birth').fill('1990-06-15');

// Проверка
await expect(page.getByLabel('Date of birth')).toHaveValue('1990-06-15');

Проверка опций дропдауна

// Проверить что все опции присутствуют
const options = await page.getByLabel('Country').locator('option').allTextContents();
expect(options).toContain('Germany');
expect(options).toContain('Poland');

// Проверить что конкретная опция задизейблена
await expect(page.getByRole('option', { name: 'Out of stock item' })).toBeDisabled();

// Проверить количество опций
const optionCount = await page.getByLabel('Category').locator('option').count();
expect(optionCount).toBeGreaterThan(0);

Типичные ошибки

selectOption() на кастомном дропдауне. Работает только с