mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-11 08:24:57 +03:00
2c553fee98
browser.mjs v1.10: createContext/setActiveContext/listContexts/getActiveContext/
hasContext. Несколько изолированных BrowserContext в одном Chromium-процессе через
chromium.launch() + newContext(). Module-level page/sessionPrefix/seanceId/recorder
зеркалят активный слот (атомарный своп через _saveActiveSlot/_activateSlot).
connect() оставлен для exec/run/start без изменений (launchPersistentContext).
run.mjs v1.8: ensureContext(name) + ленивое создание. Single-routing через
export const context = 'name'. Multi через export const contexts = ['a','b'] +
buildScopedContext(name) строит ctx.a/ctx.b — каждое действие префиксится
setActiveContext. Reset state после теста по всем активным контекстам.
Конфиг tests/web-test/webtest.config.mjs: два контекста a/b на одну webtest
публикацию (изолированные cookies через newContext).
Smoke-тесты:
- 14-multi-context-routing.test.mjs — single routing в b (2.6s)
- 15-multi-context-handover.test.mjs — ctx.a создаёт Контрагента, ctx.b в
независимой сессии видит запись через filterList, ctx.a cleanup (14.5s, 4/4)
Live: 11/12 в полном прогоне. 04-selectvalue/direct-form флапает —
pre-existing, воспроизводится на baseline 95e4674 (03→04 sequence).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
1.8 KiB
JavaScript
47 lines
1.8 KiB
JavaScript
export const name = 'Multi-context: ctx.a creates, ctx.b sees the new record';
|
|
export const tags = ['multi-context'];
|
|
export const contexts = ['a', 'b'];
|
|
export const timeout = 120000;
|
|
|
|
export default async function({ a, b, assert, step, log }) {
|
|
|
|
const unique = 'MultiCtx-' + Date.now();
|
|
|
|
await step('a: открыть Контрагенты, создать новую запись', async () => {
|
|
await a.navigateSection('Склад');
|
|
await a.openCommand('Контрагенты');
|
|
await a.clickElement('Создать');
|
|
await a.fillField('Наименование', unique);
|
|
await a.clickElement('Записать и закрыть');
|
|
log(`a created: ${unique}`);
|
|
});
|
|
|
|
await step('b: открыть Контрагенты в независимой сессии', async () => {
|
|
await b.navigateSection('Склад');
|
|
const state = await b.openCommand('Контрагенты');
|
|
assert.ok(state.form != null, 'Список должен открыться в b');
|
|
});
|
|
|
|
await step('b: найти запись через filterList', async () => {
|
|
await b.filterList(unique);
|
|
const t = await b.readTable();
|
|
log(`b: total=${t.total} rows=${t.rows?.length}`);
|
|
assert.tableHasRow(t, r => r['Наименование'] === unique);
|
|
await b.unfilterList();
|
|
await b.closeForm();
|
|
});
|
|
|
|
await step('a: cleanup — удалить запись', async () => {
|
|
// a's list view is still open from step 1's "Записать и закрыть" returning to list
|
|
await a.filterList(unique);
|
|
await a.clickElement(unique);
|
|
const page = await a.getPage();
|
|
await page.keyboard.press('Delete');
|
|
// confirmation dialog → Yes
|
|
await a.clickElement('Да');
|
|
await a.unfilterList();
|
|
await a.closeForm();
|
|
log('a deleted');
|
|
});
|
|
}
|