惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
L
LINUX DO - 最新话题
The Register - Security
The Register - Security
T
Threatpost
Y
Y Combinator Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Attack and Defense Labs
Attack and Defense Labs
T
Tailwind CSS Blog
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
H
Heimdal Security Blog
小众软件
小众软件
D
Docker
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Exploit Database - CXSecurity.com
AWS News Blog
AWS News Blog
腾讯CDC
博客园 - 司徒正美
美团技术团队
L
LINUX DO - 热门话题
N
Netflix TechBlog - Medium
Stack Overflow Blog
Stack Overflow Blog
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
N
News and Events Feed by Topic
J
Java Code Geeks
F
Fortinet All Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
U
Unit 42
V2EX - 技术
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tor Project blog
H
Help Net Security
The GitHub Blog
The GitHub Blog
L
Lohrmann on Cybersecurity
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
PCI Perspectives
PCI Perspectives
W
WeLiveSecurity
A
About on SuperTechFans
N
News and Events Feed by Topic
博客园 - 叶小钗
Cloudbric
Cloudbric
L
LangChain Blog
WordPress大学
WordPress大学
B
Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Хотел протестировать веб-приложение через AI — за три дня собрал свой инструмент
Creatman · 2026-05-03 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение6 мин

Охват и читатели969

Кейс

Задача была простая: протестировать два веб-приложения перед деплоем. Next.js-портфолио и SaaS-чат — accessibility, консольные ошибки, отзывчивость на мобильных. Рутина.

Открыл Claude Code, подключил Playwright MCP, написал «протестируй приложение». Агент начал работать, делать скриншоты, проверять элементы. На 51-м снапшоте /compact сработал. Текстовый контекст был заполнен на 18%. Я не понял что произошло.

Через час разбирательств я нашёл невидимый image-лимит. Через три часа — понял, что Playwright MCP сжигает в 50 раз больше токенов чем CLI на том же workflow. Через три дня — у меня был рабочий инструмент, который уже тестируют реальные пользователи.

Эта статья — про путь от «хочу просто протестировать» до open-source инструмента, и про архитектурные проблемы, которые заставили его собрать.

Проблема первая: MCP сжигает токены как не в себя

В ноябре 2025 Pramod Dutta опубликовал анализ, который разошёлся по всему AI-testing сообществу: Playwright MCP сжигает ~114k токенов на один тест. Бенчмарк Özal на GitHub Microsoft показывает, что workflow verify для e-commerce упирается в ~1.5M токенов через MCP. Playwright CLI? Те же ~27k.

Асимметрия 50–60×. Причина архитектурная: MCP держит LLM в browser-loop'е на каждом действии — навигация, клик, ожидание, скриншот, анализ, повтор. Отлично для исследования незнакомого интерфейса. Катастрофически дорого для повторного прогона того же сценария.

Microsoft в собственном README обновил рекомендацию: для coding-агентов — CLI + Skills, а не MCP. Официальная документация Test Agents теперь предлагает триплет Planner / Generator / Healer как основную архитектуру — не «агент сидит в MCP всю сессию».

Вывод: фикс — не «использовать меньше Playwright MCP». Фикс — разделить исследование и воспроизведение по фазам.

Проблема вторая: невидимый image-лимит

Пока я разбирался с токенами, нашёл проблему хуже. В Claude Code есть второй контекстный лимит — бюджет на inline-image блоки. Примерно 50–100 блоков за сессию. Без счётчика. Без предупреждения.

Каждый Playwright:browser_take_screenshot возвращает один image-блок в контекст. 50 скриншотов — и ты использовал 0.4% текстового бюджета и 100% image-бюджета. /compact срабатывает при пустом на 80% текстовом контексте. Агент теряет всё что не было сохранено на диск.

Инструмент

Что возвращает

Стоимость

browser_take_screenshot

Изображение inline

1 блок

Read на .png

Изображение inline

1 блок

browser_snapshot

ARIA-дерево как текст

0

toHaveScreenshot() через CLI

diff% как JSON

0

Я попробовал три «очевидных» фикса:

«Просто меньше скриншотов» — дисциплина не выживает 30+ ходов в реальной исследовательской сессии. Счётчика нет — ты видишь только /compact.

Мягкое правило в CLAUDE.md — «никогда не делай скриншоты, используй ARIA». Работает ходов 30. Когда агент застревает на модалке — тянется за скриншотом и тут же рационализирует нарушение правила.

context: fork во frontmatter скилла — официально документированный фикс. На Claude Code 2.1.x под Windows не парсится. Скилл просто не появляется в списке. 90 минут отладки — потом сдался.

Что работает: субагенты (Task tool) имеют изолированный image-бюджет. Всё что субагент читает, не учитывается в родительском контексте. Проверил эмпирически: субагент прочитал 6 PNG, вернул 6 текстовых описаний — счётчик родительского чата не вырос.

День третий: рабочий инструмент

К концу третьего дня у меня был skill для Claude Code, построенный вокруг одного архитектурного инварианта: родительский чат никогда не получает изображение.

Четыре паттерна это обеспечивают:

Паттерн A (90% работы): исследование через ARIA-дерево. browser_snapshot возвращает accessibility tree как текст — те же данные о локаторах что и скриншот, но в текстовом виде. Стоимость в image-бюджете: ноль.

Паттерн B (3–5 раз за прогон): когда vision действительно нужен — pixel-diff сработал, нужна визуальная проверка layout'а — субагент читает ОДНО изображение и возвращает ОДНУ текстовую строку. Субагент сжигает свой бюджет, родительский чат чист.

Паттерн C: встроенный toHaveScreenshot() возвращает diff% как JSON через npx playwright test. Текст по всему пайплайну. Vision-токены жгутся только если diff реально сработал — и даже тогда через Паттерн B.

Паттерн D: скриншоты на диске (артефакты Playwright, кэш MCP) стоят ноль пока их не прочитали явно. Файл на диске ≠ файл в контексте.

Поток работы: первый прогон → субагент через Playwright MCP ходит по приложению через ARIA-снапшоты, генерирует *.spec.ts. Каждый последующий прогон → npx playwright test напрямую — детерминированно, ~ноль расхода токенов. Поверх — fingerprinting багов с SHA-256 ключами и классификация между прогонами: new / regression / persisting / fixed.

Паттерн issues-коллектора

Каждый сгенерированный spec собирает все мягкие проверки в один массив:

test('home page baseline', async ({ page }) => {
  const consoleErrors: string[] = [];
  const failedRequests: string[] = [];
  const issues: string[] = [];

  page.on('pageerror', (e) => consoleErrors.push(`pageerror: ${e.message}`));
  page.on('console', (m) => m.type() === 'error' && consoleErrors.push(`console: ${m.text()}`));
  page.on('response', (r) => r.status() >= 400 && failedRequests.push(`${r.status()} ${r.url()}`));

  await page.goto('/');

  const a11y = await new AxeBuilder({ page })
    .withTags(['wcag2a','wcag2aa','wcag21aa','wcag22aa']).analyze();
  a11y.violations.forEach((v) =>
    issues.push(`a11y[${v.impact}] ${v.id}: ${v.help} (${v.nodes.length}x nodes)`));

  // overflow, heading hierarchy, touch targets, html-lang — всё в issues[]

  expect(issues, `${issues.length} issues found:\n  - ${issues.join('\n  - ')}`).toEqual([]);
  expect(consoleErrors).toEqual([]);
  expect(failedRequests).toEqual([]);
});

Когда тест падает — ты получаешь все проблемы в одном сообщении, а не первую попавшуюся. Пост-обработка парсит результат и генерирует по одной баг-записи на каждый issue с стабильным отпечатком для сравнения между прогонами.

Что тестируется из коробки

Каждый spec включает: слушатели консольных ошибок (подключаются до page.goto(), с фильтром шума для GTM/Stripe/Sentry/Next.js/Supabase/ResizeObserver), axe-core WCAG аудит (теги wcag2a через wcag22aa), иерархию заголовков (прыжки h1 → h3), размеры touch-target (WCAG 2.5.8 AA = 24×24 CSS px), горизонтальное переполнение, наличие html lang. Visual regression через встроенный toHaveScreenshot() без внешних зависимостей.

Severity назначается автоматически из axe impact и класса ошибки, с тремя механизмами override: [severity:S0] inline в коллекторе, в имени теста, или // @severity: S0 комментарием перед test().

Честная картина рынка

Octomind 30 апреля 2026 опубликовал прощальное письмо. Платные сервисы AI-тестирования которые ещё на месте — QA Wolf (типичные контракты $60–250k/год), Mabl, BrowserStack AI — продают реальную ценность: облачный параллелизм, человеческую проверку, SOC 2, SLA.

Мой инструмент не конкурирует с этим. Нет управляемого облака, нет человеческой проверки, нет сертификации. Для соло-разработчиков и маленьких команд уже на Claude Code с нулевым QA-бюджетом — это рабочая замена при $0/мес. Для команды на 50 человек с cross-browser nightly regression — нет, и притворяться иначе нечестно.

Честная группа сравнения — бесплатный OSS-tier: нативный playwright init-agents --loop=claude от Microsoft (триплет Planner/Generator/Healer) и Magnitude. Отличия моего инструмента: встроенный axe-core + console + network аудит, fingerprinting багов с классификацией между прогонами, маппинг на трекеры Linear/GitHub/Jira. Ничего из этого свободные альтернативы не делают.

Что я намеренно не делал

Никакого self-healing. QA-сообщество весь последний год критикует self-healing как маркетинг — задокументированный failure mode: healer выбирает похожий-но-неправильный элемент, тест зеленеет, баг уходит в продакшн. Инструмент предпочитает красный тест ложнозелёному.

Никакого облака. Тесты остаются в репозитории. Отчёты — в файловой системе. Если npm-пакет завтра исчезнет — suite продолжит работать.

Никаких обещаний «AI напишет все тесты». Это дополнение к инженерному суждению, не замена. Особенно хорош на скучных 80%: a11y, console, network, responsive, regression diffs.

Результаты на реальных приложениях

Оба приложения публичные на GitHub — это не синтетические бенчмарки.

Статический Next.js-портфолио, mobile viewport. Найдено 4 реальных бага, 0 ложных срабатываний: axe-core color-contrast — 8 элементов не проходят WCAG 1.4.3 AA (S1), два touch-target под 24×24 px (S2), прыжок заголовков h1→h3 на странице проектов (S2). Image-бюджет в родительском чате: ноль.

Voice-first AI SaaS-чат (Next.js + FastAPI + Supabase + WebSocket). 11 спеков на login, чат, перевод, TTS, настройки, библиотеку фраз, сценарный режим, статистику, logout. 10 из 10 прошли после 4 итераций, ~12 минут от установки до первого зелёного assertion'а. Прогон выявил 6 проблем, которые стали фиксами версии 0.2.0.

Установка

npx webtest-orch@beta install

Создаёте .env.test с TEST_BASE_URL в проекте, перезапускаете Claude Code, говорите «протестируй приложение». Инструмент сам определит аутентифицированный vs публичный сайт, соберёт Playwright + axe-core, прогонит первый исследовательский pass, запишет отчёт.

Версия 0.3.1-beta, 113 тестов, CI на Linux/macOS/Windows. MIT.

Полезные ссылки