fix(web-test): клик в видимую ячейку строки формы выбора + пер-колоночный/exact матчинг

scanGridRowsScript целился в центр всей .gridLine; на широкой форме выбора (колонок
больше, чем влезает в окно) центр-X уезжает за вьюпорт в оверлей → клик мимо строки →
Enter не выбирает → форма не закрывается → ложное not_selectable «group/folder row».

- dom/grid v1.10: матч по ячейкам (строка: exact→startsWith→includes; объект {col:val}:
  пер-колоночно, AND, предпочтение exact-all), точка клика — первая видимая текстовая
  ячейка строки (не центр); возврат visibleSample/isGroup. scrollIntoView не нужен
  (динсписок держит в DOM только видимые строки).
- forms/select-value v1.25: структурированный search в скан (без склейки значений
  объекта), различение still_open vs реальная группа (isGroup), actionable not_found
  со списком видимых кандидатов.
- tests: широкая (14 колонок, choiceMode) форма выбора Контрагентов + контрагент «Север»
  рядом с «ООО Север» → детерминированный регресс центр-X + exact-preference;
  selectValue (04-selectvalue) и fillTableRow составной ячейки (05-table).

Проверено: живой E2E на реальной форме выбора составного типа, red-green на синтетике,
полный регресс web-test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-24 12:30:21 +03:00
parent 38d89af47d
commit a633520c66
5 changed files with 255 additions and 56 deletions
+11 -3
View File
@@ -22,18 +22,26 @@ export default async function({ navigateSection, openCommand, clickElement, sele
await closeForm({ save: false });
});
await step('direct-form: Контрагент → CatalogRef.Контрагенты (quickChoice=false)', async () => {
await step('direct-form: Контрагент → форма выбора (ШИРОКАЯ — регресс центр-X + exact-preference)', async () => {
// Форма выбора Контрагентов намеренно широкая (14 колонок) — строка шире окна.
// Старый scanGridRows целился в ЦЕНТР строки → клик в оверлей за вьюпортом →
// не та строка / not_selectable. Новый — в первую видимую ячейку.
// В справочнике есть и «ООО Север», и ровно «Север»; поиск «Север» даёт 2
// вхождения, «ООО Север» сортируется раньше. Багованный путь выбрал бы «ООО
// Север»; фикс (exact-preference + клик в видимую ячейку) обязан выбрать «Север».
await navigateSection('Склад');
await openCommand('Приходная накладная');
await clickElement('Создать');
const result = await selectValue('Контрагент', 'Север');
log(`method=${result.selected?.method}, search=${result.selected?.search}`);
log(`method=${result.selected?.method}, search=${result.selected?.search}, err=${result.selected?.error || ''}`);
assert.equal(result.selected?.method, 'form', 'Должен быть метод form (через форму выбора)');
assert.ok(!result.selected?.error, `выбор без ошибки (было not_selectable): ${result.selected?.message || ''}`);
const field = findField(result, 'Контрагент');
log(`Контрагент value='${field?.value}'`);
assert.includes(field?.value || '', 'Север', 'Контрагент должен показать выбранное значение');
assert.equal((field?.value || '').trim(), 'Север',
'exact-preference + клик в видимую ячейку: выбран точный «Север», не «ООО Север»');
await closeForm({ save: false });
});