Files
cc-1c-skills/tests/web-test/19-focus-field.test.mjs
T
Nick Shirokov f424d2ac70 feat(web-test): фокус на поле ввода через clickElement (fallback)
clickElement как последний fallback (без table) фокусирует одноимённое
поле ввода, не меняя значение — возвращает focused:{field,id,ok}.
Закрывает пробел: клавиши F4/Shift+F4 требовали сфокусированного поля,
но штатного примитива фокуса не было.

- dom/forms.mjs: резолв input.editInput/textarea по имени/заголовку
  последним шагом findClickTargetScript; имена полей в available
- click-form.mjs: focusFormField (клик по инпуту + isInputFocused → ok)
- click.mjs: ветка диспетчера kind === field
- SKILL.md + docs/web-test-guide.md: focused в extras, пример focus→F4
- tests: 19-focus-field.test.mjs (focus/F4/регресс/негатив)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 22:02:12 +03:00

73 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const name = 'clickElement: фокус на поле ввода (fallback) + клавиши';
export const tags = ['click', 'focus', 'smoke'];
export const timeout = 120000;
const findField = (state, name) => state.fields?.find(f => f.name === name || f.label === name);
export default async function({ navigateSection, openCommand, clickElement, getFormState, closeForm, getPage, wait, assert, step, log }) {
await step('focus: clickElement по имени поля ставит фокус, не меняя значение', async () => {
await navigateSection('Склад');
await openCommand('Приходная накладная');
await clickElement('Создать');
const before = findField(await getFormState(), 'Контрагент')?.value || '';
const r = await clickElement('Контрагент');
log('focused: ' + JSON.stringify(r.focused));
assert.ok(r.focused, 'должен вернуть focused (а не clicked)');
assert.ok(!r.clicked, 'focus-fallback не должен возвращать clicked');
assert.equal(r.focused.ok, true, 'фокус должен встать (focused.ok)');
assert.includes(r.focused.field, 'Контрагент', 'focused.field — имя/заголовок поля');
const after = findField(await getFormState(), 'Контрагент')?.value || '';
assert.equal(after, before, 'значение поля не должно измениться от фокуса');
await closeForm({ save: false });
});
await step('keyboard: F4 на сфокусированном поле открывает форму выбора', async () => {
await navigateSection('Склад');
await openCommand('Приходная накладная');
await clickElement('Создать');
const formCountBefore = (await getFormState()).formCount;
const r = await clickElement('Контрагент');
assert.equal(r.focused?.ok, true, 'поле сфокусировано перед F4');
await getPage().keyboard.press('F4');
await wait(2);
const state = await getFormState();
log(`formCount: ${formCountBefore}${state.formCount}`);
assert.ok(state.formCount > formCountBefore, 'F4 должен открыть форму выбора (formCount вырос)');
await closeForm({ save: false }); // закрыть форму выбора
await closeForm({ save: false }); // закрыть накладную
});
await step('regress: clickElement по реальной кнопке возвращает clicked, не focused', async () => {
await navigateSection('Склад');
await openCommand('Приходная накладная');
const r = await clickElement('Создать'); // настоящая кнопка
assert.ok(r.clicked, 'кнопка → clicked');
assert.ok(!r.focused, 'кнопка не должна резолвиться в focus-fallback');
await closeForm({ save: false });
});
await step('negative: несуществующий таргет по-прежнему бросает not_found', async () => {
await navigateSection('Склад');
await openCommand('Приходная накладная');
await clickElement('Создать');
await assert.throws(
() => clickElement('НесуществующееПолеИлиКнопкаXYZ'),
'clickElement должен бросить, если нет ни контрола, ни поля',
);
await closeForm({ save: false });
});
}