vyvchy
    Теми розділу

    07 · Інструменти автоматизації

    Боротьба з флаком засобами інструмента

    Зміст

    (flaky test) — це тест, який дає різні результати залежно від того, коли і хто його запускає, хоч код не змінювався. Питання «як ви боретеся з флаком» має друге дно: за ним стоїть не перелік опцій, а те, чи ви розрізняєте два різні класи важелів. Одні прибирають причину недетермінізму — підміняють час, фіксують дані, дають тесту свіжий стан. Інші причину не чіпають узагалі, а лише роблять її видимою, , відео. Плутати їх дорого: команда, яка вважає ретраї лікуванням, роками платить хвилинами CI за симптом, який ніхто не діагностує.

    Ця глава — про механіку конкретного інструмента, і тільки про неї. Таксономія причин , політика ретраїв, (quarantine) і метрики стабільності — це дисциплінарна тема розділу «Автоматизація тестування»; тут — важелі, які реально стоять у playwright.config.ts і в коді . Главу можна пропустити при першому проході: вона спирається на автоочікування й таймаути, фікстури й конфігурацію та трейс, і без них читається як список налаштувань. Зате повернутися до неї варто перед першою серйозною співбесідою на AQA.

    Що інструмент лікує, а що лише показує

    Почнемо з чесної межі: значну частину інструмент не лікує, бо причина живе не в ньому. Офіційна дока Selenium прямо називає гонку (race condition) між браузером і кодом тесту однією з головних причин флакі-тестів: іноді браузер устигає першим, іноді тест. І одразу закриває найпопулярніший «фікс» — жорстка пауза програє двічі: замало — тест падає, забагато — прогін стає непідйомним за часом.

    Дока Cypress перелічує решту типових джерел нестабільності: , доступність сервера й бази даних, залежності від ресурсів, мережа. Це не те, що вимикається прапорцем.

    Окремо стоїть категорія, яку варто називати вголос: застосунок справді поводиться недетерміновано, і тест це чесно ловить. Класичний приклад — (eventual consistency). Дока AWS DynamoDB формулює це без евфемізмів: відповідь може не відображати результат нещодавно завершеної операції запису, а якщо повторити читання трохи згодом, вона «зрештою» віддасть свіжіший елемент. Показова деталь: сильна узгодженість там — опція запиту (ConsistentRead). Тобто детермінізм іноді просто перемикається, а не виборюється ретраями.

    Так

    Ні — гонка, мережа, узгодженість

    Дефект

    Штатна

    Тест нестабільний

    Причина в часі,
    даних чи стані?

    Прибрати причину:
    підміна часу, фіксовані дані,
    свіжа фікстура, мок мережі

    Це дефект застосунку
    чи його штатна поведінка?

    Баг-репорт,
    тест лишається червоним

    Перевірка умови, а не часу;
    де є — перемикач детермінізму

    Ретрай, трейс, відео:
    не лікування, а прилад

    Так

    Ні — гонка, мережа, узгодженість

    Дефект

    Штатна

    Тест нестабільний

    Причина в часі,
    даних чи стані?

    Прибрати причину:
    підміна часу, фіксовані дані,
    свіжа фікстура, мок мережі

    Це дефект застосунку
    чи його штатна поведінка?

    Баг-репорт,
    тест лишається червоним

    Перевірка умови, а не часу;
    де є — перемикач детермінізму

    Ретрай, трейс, відео:
    не лікування, а прилад

    Ретраї: конфіг, проєкт і три категорії результату

    Ретрай (retry) — автоматична повторна спроба виконати тест після падіння. Два факти про нього формують усю подальшу політику.

    Перший: ретраї вимкнені за замовчуванням і задаються в конфігурації. Тобто це свідоме рішення команди з ціною, а не поведінка «з коробки». Позиціонує їх дока Cypress однозначно — як засіб виявити флак, а не сховати його.

    Другий, і саме він відрізняє сильну відповідь від слабкої: Playwright розводить три категорії результату, а не дві. passed — пройшов з першого разу. flaky — упав з першого разу, але пройшов на ретраї. failed — упав і на першому прогоні, і на всіх ретраях. Тобто «зелений з другої спроби» пройденим тестом не вважається: інструмент віддає цей сигнал безкоштовно, треба лише на нього дивитися.

    Воркер 2РепортерВоркер 1Воркер 2РепортерВоркер 1ретрай стартує в НОВОМУ процесіперший прогін — failedповтор — passedкатегорія flaky + трейс першого ретраюВоркер 2РепортерВоркер 1Воркер 2РепортерВоркер 1ретрай стартує в НОВОМУ процесіперший прогін — failedповтор — passedкатегорія flaky + трейс першого ретраю

    Ретрай виконується в новому процесі (worker). Наслідок важливий і неочевидний: стан, накопичений у попередньому процесі, не переноситься — а разом із ним «розчиняється» й фейл, який саме цим станом і був спричинений. Тому ретрай не лише маскує причину політично, а й фізично забирає частину доказів.

    Тест при цьому бачить, що він на ретраї (testInfo.retry), і штатний приклад доки цим користується: чистить серверний стан перед повторною спробою. Задавати ретраї можна не тільки глобально — а й для окремої групи чи файла, і на рівні проєкту (project). Проєкти розкладають не лише браузери: різні , різні ретраї, різні середовища. Це дає точний важіль замість тупого: підняти ретраї там, де нестабільність зовнішня й визнана, і тримати нуль там, де вона означала б замовчаний дефект.

    // playwright.config.ts
    import { defineConfig, devices } from '@playwright/test';
    
    export default defineConfig({
      retries: process.env.CI ? 2 : 0,     // штатний дефолт доки: ретраї лише в CI
      use: { trace: 'on-first-retry' },    // трейс пишемо саме на повторі впалого тесту
      projects: [
        { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
        // проєкт із зовнішньою залежністю: ретраї вищі, і це задокументоване рішення
        { name: 'payments-sandbox', retries: 3, use: { ...devices['Desktop Chrome'] } },
      ],
    });

    Ціну ретраїв найкраще сформулював сам Google: схема «вважати падінням лише те, що впало три рази поспіль» — «далеко не ідеальне рішення», бо вона знижує хибні спрацювання, але заохочує розробників ігнорувати флак у власних тестах. І вимірюється ця ціна не абстрактно: 15-хвилинний , позначений як флакі, покаже реальну поломку через 45 хвилин — і потім ще треба зрозуміти, він зламаний чи «флакнув тричі».

    Підміна часу: page.clock

    Тепер про важіль, який працює проти причини. (clock mocking) — це коли тест керує годинником сторінки замість того, щоб чекати реального часу. Дока називає обидві вигоди разом: точна перевірка залежних від часу речей — рендеру за часом, таймаутів, запланованих задач — без затримок і без мінливості реального виконання. Друге слово тут важливіше за перше: прискорення — приємний бонус, а часу як джерела недетермінізму — власне механізм.

    Підміняється не «час абстрактно», а перелічені поіменно глобальні класи й функції: Date, setTimeout, setInterval, requestAnimationFrame, performance. Отже, керованим стає все, що на них тримається: автооновлення списку, лічильник до кінця акції, банер «сесія завершиться через хвилину», дебаунс пошуку.

    Порядок вибору режиму дока задає прямо: спершу page.clock.setFixedTime(), і лише якщо це не підходить — page.clock.install(), який дає паузу, перемотування й покрокове просування. page.clock.setSystemTime() названо режимом для складних випадків. Різниця між першими двома — не про зручність, а про поведінку застосунку. Якщо потрібно лише зафіксувати Date.now(), а таймери мають текти природно — беремо фіксований час. Якщо ж таймери самі залежать від Date.now(), застиглий час їх ламає: тоді потрібен встановлений годинник і перемотування.

    test('банер сесії зʼявляється за 30 хвилин без очікування 30 хвилин', async ({ page }) => {
      // install мусить стояти ПЕРЕД будь-якими іншими викликами, повʼязаними з часом
      await page.clock.install({ time: new Date('2026-07-30T09:00:00Z') });
      await page.goto('/dashboard');
    
      await page.clock.fastForward('30:00');
      await expect(page.getByRole('alert', { name: 'Сесія завершується' })).toBeVisible();
    });

    Один рядок доки заслуговує на окремий абзац, бо саме він робить із засобу проти флаку джерело флаку. install мусить (MUST) стояти перед будь-якими іншими викликами, повʼязаними з часом; порушення порядку дає невизначену поведінку. Не помилку, не виняток — невизначену поведінку. На ревʼю це виглядає як черговий нестабільний тест, а насправді підміна годинника просто приїхала після того, як сторінка вже завела свій перший таймер.

    Анімації: важіль вужчий, ніж здається

    Анімації — сусідній засіб детермінізму, і тут потрібна точність, бо тема обросла народними рецептами. Джерельно документована річ одна: -знімок вимикає анімації за замовчуванням. Поводження різне за тривалістю — скінченні перемотуються до кінця (тому подія transitionend таки спрацює), нескінченні скасовуються до початкового стану й програються вже після знімка. Каретка ховається теж за замовчуванням: інакше її блимання давало б різницю між знімками.

    А от поза асертом-знімком цей дефолт не діє — тому теза «ми вимкнули анімації і флак зник» коректна саме для візуальних порівнянь, а не для тестів узагалі. Для звичайних дій цю роль виконує : перевірка стабільності елемента вимагає незмінного щонайменше протягом двох послідовних кадрів анімації.

    Детермінізм у фікстурах: стан і дані

    Фікстура (fixture) — це те, що має бути доступним, аби тест міг виконатися. Канонічне джерело ISTQB звʼязує її прямо з двома властивостями тесту: повторюваністю й атомарністю. Тобто фікстура — не «зручний хелпер», а місце, де детермінізм або зʼявляється, або втрачається.

    Базове рішення сформульоване як ключове рішення автоматизації: будувати фікстуру щоразу заново чи перевикористовувати. Свіжа фікстура (fresh fixture) — коли кожен тест будує власну новісіньку фікстуру для власного приватного вжитку й нічого не бере від інших тестів чи прогонів. Джерело каже про неї просто: вона запобігає нестабільним тестам. Порядок відступу, якщо свіжа не по кишені, теж заданий: свіжа → незмінна спільна → і лише потім звичайна спільна.

    Три тонкості, які на співбесіді відрізняють вивчене від зрозумілого:

    • Приватна бази свіжою фікстурою не є. Наступний прогін дістане той самий стан — а це вже персистентна спільна фікстура, тобто «неповторюваного тесту»: пройшов один раз, далі падає. Патерн Pass-Fail-Fail або Fail-Pass-Pass — не випадковість, а діагностична ознака.
    • «Війна прогонів» можлива тільки за глобально спільної фікстури, до якої різні тести звертаються й іноді її змінюють. Тому питання «чи падає тест наодинці» зазвичай ставлять у діагностиці першим.
    • Стратегія «прибирати між тестами» програє з двох причин: про прибирання легко забути, а дещо прибрати взагалі неможливо (відвідані посилання).

    Механіка ранера додає до цього . Тестова фікстура прибирається після кожного тесту; воркерна — лише коли завершується сам воркер, а сам воркер перевикористовується для наступних файлів, поки воркерні фікстури збігаються. Звідси висновок: воркерний скоуп — це навмисно спільний стан, який переживає файли. Дороге авторизування там доречне, а все, що тест змінює, — ні.

    Тепер дані. Data-driven тестування будується поверх структурного скриптингу й знижує вартість додавання нового тесту — але ціна названа тим самим джерелом: потреба в керуванні . Генератори тут головне джерело оманливої впевненості:

    • Генератор за замовчуванням дає різні значення щоразу; для сталих результатів задають (seed).
    • Зерно не дає повної відтворюваності. Після оновлення бібліотеки те саме зерно може дати інші значення, бо змінилися вихідні набори даних.
    • Методи з відносними датами відтворюваними не стають узагалі — їм потрібна фіксована опорна дата. І тут дві теми глави сходяться: фіксована дата — це той самий setFixedTime.

    Межа корисності генерації сформульована точно: унікальні ключі для бази — легітимний випадок; шкідливо, коли згенероване значення йде на вхід алгоритму, поведінка якого від цього значення залежить. Звідси робоче правило: генеруй те, що не впливає на гілку виконання; усе, що впливає, задавай явно.

    // Фікстура з фіксованим зерном: імена й адреси випадкові, але прогін відтворюваний
    export const test = base.extend<{ user: User }>({
      user: async ({}, use) => {
        faker.seed(20260730);
        await use({
          email: faker.internet.email(),   // на гілку виконання не впливає
          plan: 'trial',                   // впливає — задано явно, не згенеровано
          discount: 0,                     // межа з тест-дизайну, теж явно
        });
      },
    });

    Термінологічна деталь, яку варто знати: у канонічному викладі «фікстура» означає ще й сам набір даних, а фабрика тестових даних — це те саме, що : «catchy name for such a factory». Тому питання «фікстура — це хук чи дані?» коректно має відповідь «залежить від джерела», а не «ви неправильно вживаєте термін».

    Трейс і відео як докази флаку

    Останній важіль нічого не лікує — він перетворює «здається, це флак» на матеріал, з яким можна щось зробити. Трейс (trace) — інструмент post-mortem-розбору, і саме для падінь у CI, куди не зайдеш дебагером.

    Вибір носія дока формулює однозначно: для CI-падінь використовуй trace viewer замість відео й . Причина не в естетиці — у складі. У трейсі лежать використаний і тривалість кожної дії, DOM-знімки до й після, мережеві запити з кодами й тривалостями, , метадані оточення (браузер, розмір вікна) і вкладення з дифами скріншотів. Скріншот відповідає на питання «що було видно», трейс — «що відбувалося». Практична деталь для команд із режимними обмеженнями: трейс завантажується повністю в браузері й нічого не передає назовні.

    Політика запису в доках вирішена однаково і збігається з попереднім розділом: трейс пишеться на першому ретраї впалого тесту, а вмикати його на кожен тест дока прямо не рекомендує через вартість. Звідси звʼязка, на якій спотикаються: якщо ретраїв у конфігурації немає, то й трейсів не буде — записувати нічого. Анатомія трейсу і стратегії запису детально розібрані в главі про дебаг і trace viewer.

    Канон ISTQB ставить планку вище за «у нас є скріншот». Джерела даних перелічені окремо: логи SUT (UI, API, застосунки, вебсервери, БД), логи фреймворку як аудиторський слід, логи збірки й , скріншоти й записи екрана. Рівнів логування шість — fatal, error, warn, info, debug, trace, причому error валить тест-кейс, а warn ні. І головна вимога: у разі падіння рішення автоматизації має зберегти все, що потрібно для аналізу, включно з дампами й стеками. Один скріншот аудиторським слідом не є, бо його не звести за часовими мітками з логом застосунку.

    Ще один інструментальний факт, який щороку когось коштує: --debug не просто відкриває інспектор — він запускає браузер видимим і робить таймаут нульовим. Тому «локально в дебазі проходить, у CI падає» часто означає лише те, що локально ви чекали нескінченно. Поруч живе журнал перевірок придатності: якщо умови недосяжні, дія показується як pending, а не як помилка — і це спосіб відрізнити «локатор не той» від «елемент ще не готовий». UI Mode трейсить кожен тест автоматично, але не враховує setup-тести — рівно та пастка, через яку «в UI падає, у звичайному рані ні».

    Типові помилки

    • «Упало по таймауту — піднімемо таймаут тесту» → якщо вичерпався таймаут асерту, тестовий не додасть жодної спроби: рівні не повʼязані, і дока каже це прямо. Більше того, до низькорівневих таймаутів вона додає застереження: якщо ви прийшли сюди через флакі-тест, рішення майже напевно не тут.
    • «Таймаут — це 30 секунд» → у бібліотеки 30 секунд на більшість операцій, а в ранера більшість операцій самі не тайм-аутяться, зате кожен тест має таймаут, який його валить. Без назви рівня число нічого не означає.
    • «Асерт же чекає» → чекає лише ретрайний. Неретрайний асерт на асинхронній сторінці названо причиною флаку окремо; порядок вибору — ретрайний асерт, далі -обгортка або toPass, який до того ж не успадковує налаштований таймаут асерту.
    • «Підмінили час, а флак лишився» → перевірте порядок: install після першого таймера сторінки дає невизначену поведінку. Виглядає як флак, а насправді засіб проти флаку вставлено не туди.
    • «Зафіксували час — і таймери стали» → так і має бути, якщо таймери залежать від Date.now(). Для цього випадку джерело радить не фіксований час, а встановлений годинник із перемотуванням.
    • «Вимкнули анімації — і флак зник» → вимкнули їх ви лише в асерті-знімку, де це дефолт. Поза знімком цей дефолт не діє, тож для звичайних дій усе тримається на перевірці стабільності елемента.
    • «Ретрай зробив тест зеленим» → ранер позначив його flaky, а не passed. Якщо звіт цю категорію не рахує окремо, бреше про свою стабільність.

    Підсумок

    • Ретраї — прилад, а не ліки. Вимкнені за замовчуванням, задаються глобально, для файла, групи або проєкту; штатний конфіг доки тримає їх лише в CI. Ранер розводить три категорії результату, і flaky — окрема від passed.
    • Ретрай платить часом і увагою. Він виконується в новому воркер-процесі, тож стан-винуватець зникає; а схему «падіння лише після трьох поспіль» сам Google називає далеко не ідеальною — 15-хвилинний тест покаже реальну поломку через 45 хвилин.
    • Підміна часу прибирає причину, а не симптом. Перевизначаються Date, таймери, requestAnimationFrame і performance; порядок вибору — фіксований час, потім установка годинника, і лише для складних випадків системний. install мусить стояти перед будь-яким іншим викликом, повʼязаним із часом.
    • «Вимкнути анімації» — вузький важіль. Це дефолт асерта-знімка: скінченні перемотуються до кінця, нескінченні скасовуються, каретка ховається. Поза візуальними порівняннями цей дефолт не діє.
    • Докази важливіші за зелений прогін. Для CI-падінь дока радить трейс замість відео й скріншотів і пише його на першому ретраї; trace: 'on' не рекомендований через вартість. Канон вимагає аудиторського сліду, а не одного скріншота.

    Можливі питання

    • «У вас флакі-тест. Що робите?» — сильна відповідь називає три варіанти, а не один: полагодити, посадити в карантин із заведеним багом, свідомо видалити. Обидва «прості» виходи джерело називає шкідливими: прибрати тест — це свідомо втрачений тест, лишити червоним — затулити інші падіння. Відповідь «ставлю retries: 3» читається як червоний прапорець.
    • «Де і скільки ретраїв ставите?» — сильна відповідь називає рівні (глобально, файл, група, проєкт) і різницю локально проти CI, а не число. Бонус — згадка, що ретрай іде в новому воркер-процесі, тож стан-винуватець зникає разом із доказом.
    • «Тест пройшов з другої спроби — він пройдений?» — перевіряють, чи ви знаєте про категорію flaky. Правильна рамка: інструмент дає цей сигнал безкоштовно, і якщо звіт його не рахує, метрика стабільності фіктивна.
    • «Чим погана схема "падає лише після трьох разів поспіль"?» — тут цінують саме те, що це не ваш смак, а визнана ціна: вона заохочує ігнорувати власний флак, а справжня поломка проявляється втричі довше.
    • «Як протестувати таймер сесії на 30 хвилин, не чекаючи 30 хвилин?» — питання рівно про підміну часу. Відповідь «збільшити таймаут тесту» протилежна за змістом. Плюс бали за перелік перевизначених глобалів і за вимогу порядку виклику.
    • «Ми поставили seed — дані детерміновані?» — неповна відповідь. Очікують, що ви назвете дві межі: оновлення бібліотеки може дати інші значення на тому самому зерні, а відносні дати потребують фіксованої опорної дати.
    • «Що прикладаєте до тікета про нестабільний тест?» — слабкий рівень — «скріншот падіння». Сильний — трейс першого ретраю плюс аудиторський слід, який можна звести з логами застосунку за часовими мітками.
    • «Тест падає лише в сюїті — як шукаєте причину?» — тут перевіряють порядок, а не здогад. Одне з перших питань діагностики — чи падає тест наодинці: воно розділяє залежність від інших тестів від решти причин, а корінь такої залежності — спільна фікстура.

    Джерела

    Що інструмент лікує, а що лише показує

    Ретраї: конфіг, проєкт і три категорії результату

    • Playwright — Test retries — ретраї вимкнені за замовчуванням, три категорії результату, ретрай у новому воркер-процесі, testInfo.retry, ретраї для групи чи файла.
    • Playwright — Test configuration — штатний конфіг доки: ретраї лише в CI, трейс на ретраї, два рівні опцій.
    • Playwright — Projects — проєкт як логічна група з власною конфігурацією: різні таймаути, різні ретраї, різні середовища.
    • Playwright — Browsers — кросбраузерний прогін як список проєктів у конфізі, тобто той самий рівень, на якому задаються ретраї.
    • Cypress — Test Retries — ретраї як засіб виявити флак, а не сховати; вимкнені за замовчуванням.
    • Google Testing Blog — Flaky Tests at Google and How We Mitigate Them — «далеко не ідеальне рішення», заохочення ігнорувати флак і ціна в 45 хвилин.

    Підміна часу: page.clock

    • Playwright — Clock — навіщо керувати часом, перелік перевизначених глобалів, порядок setFixedTimeinstallsetSystemTime, вимога MUST і два режими підміни.
    • Playwright — API: PageAssertions — анімації й каретка вимикаються за замовчуванням саме в асерті-знімку; різне поводження скінченних і нескінченних анімацій.
    • Playwright — Auto-waiting (actionability) — стабільність елемента: незмінний bounding box щонайменше протягом двох послідовних кадрів анімації.
    • Playwright — Test retries — контраст: ретрай лише повторює тест, тоді як підміна часу прибирає причину.

    Детермінізм у фікстурах: стан і дані

    • ISTQB® Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — §4.2: фікстури як опора повторюваності й атомарності; §3.1.4, §4.3: data-driven поверх структурного скриптингу і потреба в керуванні тестовими даними.
    • xUnit Test Patterns — Fresh Fixture — означення свіжої фікстури, порядок відступу і те, що приватна пісочниця бази свіжою фікстурою не є.
    • xUnit Test Patterns — Erratic Test — неповторюваний тест і «війна прогонів» від спільної фікстури; згенероване значення на вході алгоритму проти унікальних ключів.
    • Playwright — Test fixtures — скоупи test і worker та воркера, поки воркерні фікстури збігаються.
    • Playwright — Test Isolation (browser contexts) — чому стратегія «прибирати між тестами» програє свіжому стану.
    • Faker (@faker-js/faker) — Usage — різні значення щоразу, зерно для сталості й межі відтворюваності: версія бібліотеки та відносні дати.
    • Martin Fowler — Object Mother — фабрика тестових даних як Object Mother і «фікстура» у сенсі набору даних.

    Трейс і відео як докази флаку

    • Playwright — Trace viewer — трейс як post-mortem-розбір, його склад, запис на першому ретраї, автономність у браузері та автоматичне трейсування кожного тесту в UI Mode.
    • Playwright — Best Practices — для CI-падінь трейс замість відео й скріншотів; trace: 'on' на кожен тест не рекомендований через вартість.
    • ISTQB® Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — §4.2, §6.1.1: джерела даних, логи фреймворку як аудиторський слід, шість рівнів логування і вимога зберегти все потрібне для аналізу.
    • Playwright — Debugging Tests--debug знімає таймаут і відкриває браузер видимим; журнал придатності та статус pending.
    • Playwright — UI Mode — обмеження, назване прямо: setup-тести режим не враховує.
    • Playwright — Auto-waiting (actionability) — склад перевірок придатності, які й пише журнал.

    Типові помилки

    • Playwright — Timeouts — незалежність рівнів таймаутів і застереження, що для флаку рішення шукати не в них.
    • Playwright — Test assertions (expect.poll, toPass) — ретрайні проти неретрайних асертів, порядок вибору й таймаут toPass.
    • Playwright — Library — модель бібліотеки (30 секунд на більшість операцій) проти моделі ранера.
    • Playwright — Clock — вимога MUST щодо порядку install і вибір між фіксованим часом та перемотуванням.
    • Playwright — API: PageAssertions — анімації й каретка як дефолт саме асерта-знімка.
    • Playwright — Test retries — категорія flaky для тесту, що пройшов із повтору.

    Підсумок

    Можливі питання

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.