From 7561faf73650dcc50e796645da1a382821265d0b Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 4 May 2026 18:19:42 +0300 Subject: [PATCH] =?UTF-8?q?test(web-test):=20=D0=BF=D0=BE=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D1=8C=20Tumbler=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20clickElement=20=D0=B2=20radio-=D1=88=D0=B0=D0=B3=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tumbler-представление RadioButtonField не парсится fillFields, но варианты видны в state.buttons[] и кликаются через clickElement. Уточнили шаг radio: - RadioButtons (КатегорияЦены) → fillFields с method=radio - Tumbler (СпособУчёта) → проверка наличия в buttons[] + clickElement('ФИФО') Семантика Tumbler через fillFields остаётся как баг web-test/browser.mjs (см. upload/web-test-bugs.md пункт 5), но рабочий путь интеракции есть. 10/10 smoke зелёные после рестарта Apache. Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/web-test/03-fillfields.test.mjs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tests/web-test/03-fillfields.test.mjs b/tests/web-test/03-fillfields.test.mjs index 9f32072f..d23fdcb9 100644 --- a/tests/web-test/03-fillfields.test.mjs +++ b/tests/web-test/03-fillfields.test.mjs @@ -52,24 +52,33 @@ export default async function({ navigateSection, openCommand, clickElement, fill await closeForm({ save: false }); }); - await step('radio: КатегорияЦены (RadioButtonField, представление RadioButtons)', async () => { - // Tumbler-представление (СпособУчёта) пока не покрыто — getFormState не - // возвращает Tumbler в fields[]. См. upload/web-test-bugs.md пункт «radio - // Tumbler не распознаётся». + await step('radio: КатегорияЦены (RadioButtons) через fillFields, СпособУчёта (Tumbler) через clickElement', async () => { + // Tumbler-представление не парсится fillFields как radio-поле (см. + // upload/web-test-bugs.md пункт 5). Но варианты тумблера видны в + // state.buttons и кликаются через clickElement — покрываем через него. await navigateSection('Склад'); await openCommand('Номенклатура'); await filterList('Товар 02'); await clickElement('Товар 02', { dblclick: true }); + // RadioButtons — fillFields с method=radio const result = await fillFields({ 'Категория цены': 'Оптовая' }); - log('method: ' + result.filled[0]?.method + ', value: ' + result.filled[0]?.value); + log('RadioButtons method: ' + result.filled[0]?.method + ', value: ' + result.filled[0]?.value); assert.ok(result.filled[0]?.ok, 'КатегорияЦены fillField должна сработать'); assert.equal(result.filled[0]?.method, 'radio', 'КатегорияЦены должна использовать method=radio'); - - // Note: getFormState().fields для RadioButtonField возвращает value='' — - // выбранный вариант проще проверить через result.filled[].value. assert.includes(result.filled[0]?.value || '', 'Оптовая', 'КатегорияЦены = Оптовая'); + // Tumbler — варианты «По среднему» / «ФИФО» доступны как buttons + const before = await getFormState(); + const tumblerButtons = (before.buttons || []) + .map(b => b.name || b) + .filter(n => n === 'По среднему' || n === 'ФИФО'); + log('Tumbler buttons: ' + tumblerButtons.join(', ')); + assert.equal(tumblerButtons.length, 2, 'Tumbler должен показывать оба варианта в buttons[]'); + + await clickElement('ФИФО'); + log('Tumbler clicked: ФИФО'); + await closeForm({ save: false }); }); }