[{"data":1,"prerenderedAt":323},["ShallowReactive",2],{"blog-/blog/beyond-brittle-automation-ui-regression-testing":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"image":19,"draft":6,"body":20,"_type":317,"_id":318,"_source":319,"_file":320,"_stem":321,"_extension":322},"/blog/beyond-brittle-automation-ui-regression-testing","blog",false,"","Agent Skills in Cartagena, Colombia","GDE Alexander Amin breaks down how to use Gemini CLI, Chrome DevTools MCP, and Agentic Skills to build resilient QA testing agents.","2026-05-03",[12,13,14,15,16,17,18],"Generative AI","Gemini CLI","Model Context Protocol","Software Testing","Google Cloud","GDE","Cloud Run","/images/blog/cartagena-gde-talk.webp",{"type":21,"children":22,"toc":311},"root",[23,31,44,49,54,58,65,78,104,107,113,137,151,160,178,191,264,269,272,278,283,295,300,303],{"type":24,"tag":25,"props":26,"children":27},"element","p",{},[28],{"type":29,"value":30},"text","Talking about AI architecture is one thing. Doing it entirely in Spanish is another.",{"type":24,"tag":25,"props":32,"children":33},{},[34,36,42],{"type":29,"value":35},"While working on a project in El Salvador, I took a detour to Colombia to speak at GDG Cartagena’s ",{"type":24,"tag":37,"props":38,"children":39},"em",{},[40],{"type":29,"value":41},"Build with AI",{"type":29,"value":43}," event. It was my first talk as a Google Developer Expert (Cloud & AI), and my first time presenting deep technical architecture in a foreign language.",{"type":24,"tag":25,"props":45,"children":46},{},[47],{"type":29,"value":48},"(Duolingo, if you are reading this—please sponsor me already 🦉).",{"type":24,"tag":25,"props":50,"children":51},{},[52],{"type":29,"value":53},"It was such an honor to be invited to speak in Cartagena. Instead of high-level AI theories, we focused on a pain point every developer knows too well: the constant tax of brittle end-to-end testing.",{"type":24,"tag":55,"props":56,"children":57},"hr",{},[],{"type":24,"tag":59,"props":60,"children":62},"h2",{"id":61},"the-universal-developer-tax-brittle-e2e-testing",[63],{"type":29,"value":64},"The Universal Developer Tax: Brittle E2E Testing",{"type":24,"tag":25,"props":66,"children":67},{},[68,70,76],{"type":29,"value":69},"Using my side project, ",{"type":24,"tag":71,"props":72,"children":73},"strong",{},[74],{"type":29,"value":75},"thebookingsapp",{"type":29,"value":77}," (a high-volume restaurant reservation system that I use as a live playground for agentic experimentation), as a live demo, we looked at what happens when frontend builds regenerate dynamic HTML IDs (like in Vue or Nuxt).",{"type":24,"tag":25,"props":79,"children":80},{},[81,83,88,90,95,97,102],{"type":29,"value":82},"Hardcoded Playwright or Selenium scripts break. You end up spending more time fixing your test suite than shipping features. Traditional scripts fail because they lack ",{"type":24,"tag":71,"props":84,"children":85},{},[86],{"type":29,"value":87},"context",{"type":29,"value":89},"—they know ",{"type":24,"tag":37,"props":91,"children":92},{},[93],{"type":29,"value":94},"what code to click",{"type":29,"value":96},", but they don't understand ",{"type":24,"tag":37,"props":98,"children":99},{},[100],{"type":29,"value":101},"what they are trying to achieve",{"type":29,"value":103},".",{"type":24,"tag":55,"props":105,"children":106},{},[],{"type":24,"tag":59,"props":108,"children":110},{"id":109},"the-solution-building-autonomous-qa-agents",[111],{"type":29,"value":112},"The Solution: Building Autonomous QA Agents",{"type":24,"tag":25,"props":114,"children":115},{},[116,118,122,124,129,131,136],{"type":29,"value":117},"The fix isn't better scripts; it's autonomy. I demonstrated how to wire up ",{"type":24,"tag":71,"props":119,"children":120},{},[121],{"type":29,"value":13},{"type":29,"value":123}," and ",{"type":24,"tag":71,"props":125,"children":126},{},[127],{"type":29,"value":128},"Chrome DevTools MCP",{"type":29,"value":130}," with ",{"type":24,"tag":71,"props":132,"children":133},{},[134],{"type":29,"value":135},"\"Agentic Skills\"",{"type":29,"value":103},{"type":24,"tag":25,"props":138,"children":139},{},[140,142,149],{"type":29,"value":141},"An Agentic Skill is an open-standard, Markdown-first specification that packages human procedural knowledge, rules, and edge cases into a format that a modern AI agent can consume. By structuring instructions within a simple ",{"type":24,"tag":143,"props":144,"children":146},"code",{"className":145},[],[147],{"type":29,"value":148},".agents/skills/",{"type":29,"value":150}," directory inside your repository, you supply the agent with a dedicated playbook:",{"type":24,"tag":152,"props":153,"children":155},"pre",{"code":154},"your-project/\n├── .agents/\n│   └── skills/\n│       └── web-qa-agent/\n│           ├── SKILL.md          \u003C-- Metadata, rules, entry point\n│           ├── references/       \u003C-- Deep documentation & snippets\n│           └── scripts/          \u003C-- Helper automation tools\n",[156],{"type":24,"tag":143,"props":157,"children":158},{"__ignoreMap":7},[159],{"type":29,"value":154},{"type":24,"tag":25,"props":161,"children":162},{},[163,165,169,171,176],{"type":29,"value":164},"To make this autonomous, we combine the open-source ",{"type":24,"tag":71,"props":166,"children":167},{},[168],{"type":29,"value":13},{"type":29,"value":170}," tool with the ",{"type":24,"tag":71,"props":172,"children":173},{},[174],{"type":29,"value":175},"Chrome DevTools Model Context Protocol (MCP)",{"type":29,"value":177}," server. This allows the model to spin up a headless browser instance, inspect layout rendering, and dynamically interact with DOM elements using semantic understanding rather than brittle CSS selectors.",{"type":24,"tag":25,"props":179,"children":180},{},[181,183,189],{"type":29,"value":182},"Instead of writing brittle locators, you write a Markdown playbook (",{"type":24,"tag":143,"props":184,"children":186},{"className":185},[],[187],{"type":29,"value":188},"SKILL.md",{"type":29,"value":190},") that teaches an LLM how to systematically stress-test your specific reservation flow, validate fields, and check mobile responsiveness multimodally across six critical scenarios:",{"type":24,"tag":192,"props":193,"children":194},"ul",{},[195,206,216,226,236,254],{"type":24,"tag":196,"props":197,"children":198},"li",{},[199,204],{"type":24,"tag":71,"props":200,"children":201},{},[202],{"type":29,"value":203},"The Happy Path:",{"type":29,"value":205}," Open the widget, dynamically select an open date, fill customer details, and confirm success.",{"type":24,"tag":196,"props":207,"children":208},{},[209,214],{"type":24,"tag":71,"props":210,"children":211},{},[212],{"type":29,"value":213},"Dynamic Party Sizes:",{"type":29,"value":215}," Validate that the available times automatically adapt when switching between 1, 4, and 8 guests.",{"type":24,"tag":196,"props":217,"children":218},{},[219,224],{"type":24,"tag":71,"props":220,"children":221},{},[222],{"type":29,"value":223},"Field Validation Hardening:",{"type":29,"value":225}," Submit incomplete data to confirm the UI returns clear validation errors.",{"type":24,"tag":196,"props":227,"children":228},{},[229,234],{"type":24,"tag":71,"props":230,"children":231},{},[232],{"type":29,"value":233},"Responsive Mobile Testing:",{"type":29,"value":235}," Force the browser viewport to a mobile profile (375x812) to verify layout integrity.",{"type":24,"tag":196,"props":237,"children":238},{},[239,244,246,252],{"type":24,"tag":71,"props":240,"children":241},{},[242],{"type":29,"value":243},"Localization:",{"type":29,"value":245}," Load the system with and without localization parameters (e.g., ",{"type":24,"tag":143,"props":247,"children":249},{"className":248},[],[250],{"type":29,"value":251},"?lang=es",{"type":29,"value":253},") to confirm semantic content shifts accurately.",{"type":24,"tag":196,"props":255,"children":256},{},[257,262],{"type":24,"tag":71,"props":258,"children":259},{},[260],{"type":29,"value":261},"Boundary Dates:",{"type":29,"value":263}," Attempt reservations for the current minute, or 30 days out, to verify graceful system degradation.",{"type":24,"tag":25,"props":265,"children":266},{},[267],{"type":29,"value":268},"Because Gemini is multimodal, it doesn't just read the HTML source—it evaluates visual rendering to ensure elements don't overlap or break.",{"type":24,"tag":55,"props":270,"children":271},{},[],{"type":24,"tag":59,"props":273,"children":275},{"id":274},"skills-are-the-api-docs-for-the-agent-era",[276],{"type":29,"value":277},"Skills are the API Docs for the Agent Era",{"type":24,"tag":25,"props":279,"children":280},{},[281],{"type":29,"value":282},"The takeaway: AI agents already know how to use a browser, fill a form, or generate a report. What they need is your operational context.",{"type":24,"tag":25,"props":284,"children":285},{},[286,288,293],{"type":29,"value":287},"A decade ago, we focused intensely on writing clean API documentation so that software applications could talk to other software applications. In the era of AI engineering, ",{"type":24,"tag":71,"props":289,"children":290},{},[291],{"type":29,"value":292},"Agentic Skills are rapidly becoming the new API documentation for the agent era.",{"type":29,"value":294}," They bridge the gap between human institutional business logic and autonomous execution.",{"type":24,"tag":25,"props":296,"children":297},{},[298],{"type":29,"value":299},"Huge thanks to Giselle Ulloa and the entire GDG Cartagena team for a flawless event.",{"type":24,"tag":55,"props":301,"children":302},{},[],{"type":24,"tag":25,"props":304,"children":305},{},[306],{"type":24,"tag":71,"props":307,"children":308},{},[309],{"type":29,"value":310},"Are you still maintaining hardcoded E2E scripts, or are you experimenting with agentic QA? Let me know! 👇",{"title":7,"searchDepth":312,"depth":312,"links":313},2,[314,315,316],{"id":61,"depth":312,"text":64},{"id":109,"depth":312,"text":112},{"id":274,"depth":312,"text":277},"markdown","content:blog:beyond-brittle-automation-ui-regression-testing.md","content","blog/beyond-brittle-automation-ui-regression-testing.md","blog/beyond-brittle-automation-ui-regression-testing","md",1780131793291]