From e215957344352d252396b693e76beda088c71cc3 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 25 May 2026 22:35:24 +0300 Subject: [PATCH] =?UTF-8?q?refactor(web-test):=20=D1=8D=D1=82=D0=B0=D0=BF?= =?UTF-8?q?=20B.5.4=20=E2=80=94=20readEdd=20=D1=85=D0=B5=D0=BB=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=20(2=20=D0=BA=D0=BE=D0=BF=D0=B8=D0=B8=20=D0=B2=20fillRef?= =?UTF-8?q?erenceField)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В fillReferenceField было два места с одинаковым page.evaluate-скриптом чтения #editDropDown (DLB-popup перед paste и autocomplete после Ctrl+V). core/helpers.mjs: readEdd() → { visible, items?: [{ name, x, y }] }. selectValue использует свой clickEddItem через dispatchEvent (bypass div.surface) — оставлен как есть, специфика API там сильно отличается. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/web-test/scripts/browser.mjs | 28 ++----------------- .../skills/web-test/scripts/core/helpers.mjs | 22 +++++++++++++++ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.claude/skills/web-test/scripts/browser.mjs b/.claude/skills/web-test/scripts/browser.mjs index c48e7fda..1056bba6 100644 --- a/.claude/skills/web-test/scripts/browser.mjs +++ b/.claude/skills/web-test/scripts/browser.mjs @@ -143,7 +143,7 @@ import { _detectPlatformDialogs, _closePlatformDialogs, } from './core/errors.mjs'; import { - safeClick, findFieldInputId, + safeClick, findFieldInputId, readEdd, detectNewForm as helperDetectNewForm, } from './core/helpers.mjs'; // Re-export only what was publicly exported before the refactor. @@ -1456,18 +1456,7 @@ async function fillReferenceField(selector, fieldName, value, formNum) { if (dlbVisible) { await page.click(dlbSelector); await page.waitForTimeout(1000); - const eddState = await page.evaluate(`(() => { - const edd = document.getElementById('editDropDown'); - if (!edd || edd.offsetWidth === 0) return { visible: false }; - const eddTexts = [...edd.querySelectorAll('.eddText')].filter(el => el.offsetWidth > 0); - return { - visible: true, - items: eddTexts.map(el => { - const r = el.getBoundingClientRect(); - return { name: el.innerText?.trim() || '', x: r.x + r.width / 2, y: r.y + r.height / 2 }; - }) - }; - })()`); + const eddState = await readEdd(); if (eddState.visible && eddState.items?.length > 0) { const target = normYo(text.toLowerCase()); const candidates = eddState.items.filter(i => !i.name.startsWith('Создать')); @@ -1515,18 +1504,7 @@ async function fillReferenceField(selector, fieldName, value, formNum) { await page.waitForTimeout(2000); // 4. Check editDropDown for autocomplete suggestions - const eddState = await page.evaluate(`(() => { - const edd = document.getElementById('editDropDown'); - if (!edd || edd.offsetWidth === 0) return { visible: false }; - const eddTexts = [...edd.querySelectorAll('.eddText')].filter(el => el.offsetWidth > 0); - return { - visible: true, - items: eddTexts.map(el => { - const r = el.getBoundingClientRect(); - return { name: el.innerText?.trim() || '', x: r.x + r.width / 2, y: r.y + r.height / 2 }; - }) - }; - })()`); + const eddState = await readEdd(); if (eddState.visible && eddState.items?.length > 0) { const target = normYo(text.toLowerCase()); diff --git a/.claude/skills/web-test/scripts/core/helpers.mjs b/.claude/skills/web-test/scripts/core/helpers.mjs index a80cc6c7..4b8615e1 100644 --- a/.claude/skills/web-test/scripts/core/helpers.mjs +++ b/.claude/skills/web-test/scripts/core/helpers.mjs @@ -83,3 +83,25 @@ export async function detectNewForm(prevFormNum, { strict = false } = {}) { return nums.length > 0 ? Math.max(...nums) : null; })()`); } + +/** + * Read the `#editDropDown` autocomplete popup. Returns whether it's visible + * and, when visible, an array of `.eddText` items with display name and + * center coordinates (suitable for page.mouse.click). + * + * @returns {Promise<{visible: boolean, items?: Array<{name:string, x:number, y:number}>}>} + */ +export async function readEdd() { + return await page.evaluate(`(() => { + const edd = document.getElementById('editDropDown'); + if (!edd || edd.offsetWidth === 0) return { visible: false }; + const eddTexts = [...edd.querySelectorAll('.eddText')].filter(el => el.offsetWidth > 0); + return { + visible: true, + items: eddTexts.map(el => { + const r = el.getBoundingClientRect(); + return { name: el.innerText?.trim() || '', x: r.x + r.width / 2, y: r.y + r.height / 2 }; + }) + }; + })()`); +}