mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-10 08:04:56 +03:00
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>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
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 });
|
||||
});
|
||||
}
|
||||
@@ -5,7 +5,7 @@ E2E-тесты движка `web-test` (Playwright + изолированная
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
# Полный регресс (все 20 тестов)
|
||||
# Полный регресс (все 21 тестов)
|
||||
node .claude/skills/web-test/scripts/run.mjs test tests/web-test/
|
||||
|
||||
# Один файл
|
||||
|
||||
Reference in New Issue
Block a user