mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-24 05:31:02 +03:00
refactor(web-test): этап B.5.3 — detectNewForm хелпер (3 копии → 1)
В fillReferenceField, selectValue и fillTableRow была одна и та же логика:
сканировать DOM на наличие элемента с id="form{N}_*" где N > prevFormNum.
Две вариации: strict (только visible interactive — input.editInput/a.press)
и broad (любой [id], учитывает type-dialogs с пустыми button-id).
core/helpers.mjs: detectNewForm(prevFormNum, { strict }) → number|null.
Внутри функций оставлены тонкие локальные обёртки (для совместимости
с уже использующейся сигнатурой без аргументов) — будут убраны на C.8/D.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
3fe038277f
commit
09b2084672
@@ -53,3 +53,33 @@ export async function findFieldInputId(formNum, fieldName) {
|
||||
return el ? el.id : null;
|
||||
})()`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect a new form opened above the given `prevFormNum`. Two modes:
|
||||
* `{ strict: true }` — only counts visible interactive elements
|
||||
* (`input.editInput[id], a.press[id]`); used by fillReferenceField.
|
||||
* default (broad) — any element with `id^=form{N}_` that's visible
|
||||
* in either dimension; also finds type-dialogs whose a.press buttons
|
||||
* have empty IDs. Used by selectValue / fillTableRow.
|
||||
*
|
||||
* @param {number} prevFormNum
|
||||
* @param {object} [opts]
|
||||
* @param {boolean} [opts.strict=false]
|
||||
* @returns {Promise<number|null>} new form number or null
|
||||
*/
|
||||
export async function detectNewForm(prevFormNum, { strict = false } = {}) {
|
||||
const selector = strict ? 'input.editInput[id], a.press[id]' : '[id]';
|
||||
const visibleCheck = strict
|
||||
? 'el.offsetWidth === 0'
|
||||
: 'el.offsetWidth === 0 && el.offsetHeight === 0';
|
||||
return page.evaluate(`(() => {
|
||||
const forms = {};
|
||||
document.querySelectorAll(${JSON.stringify(selector)}).forEach(el => {
|
||||
if (${visibleCheck}) return;
|
||||
const m = el.id.match(/^form(\\d+)_/);
|
||||
if (m) forms[m[1]] = true;
|
||||
});
|
||||
const nums = Object.keys(forms).map(Number).filter(n => n > ${prevFormNum});
|
||||
return nums.length > 0 ? Math.max(...nums) : null;
|
||||
})()`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user