<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aegis Runner</title>
    <description>The latest articles on DEV Community by Aegis Runner (@aegis_runner_1fe3db6ef2bd).</description>
    <link>https://dev.to/aegis_runner_1fe3db6ef2bd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3830373%2F2147f64e-2bb6-4f40-b037-a65e0ea62b19.png</url>
      <title>DEV Community: Aegis Runner</title>
      <link>https://dev.to/aegis_runner_1fe3db6ef2bd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aegis_runner_1fe3db6ef2bd"/>
    <language>en</language>
    <item>
      <title>AegisRunner vs Playwright — Get Playwright Tests Without Writing Them</title>
      <dc:creator>Aegis Runner</dc:creator>
      <pubDate>Thu, 26 Mar 2026 12:16:33 +0000</pubDate>
      <link>https://dev.to/aegis_runner_1fe3db6ef2bd/aegisrunner-vs-playwright-get-playwright-tests-without-writing-them-4ijd</link>
      <guid>https://dev.to/aegis_runner_1fe3db6ef2bd/aegisrunner-vs-playwright-get-playwright-tests-without-writing-them-4ijd</guid>
      <description>&lt;p&gt;Playwright is arguably the best browser automation framework available today. Cross-browser support, auto-waiting, network interception, and excellent TypeScript support make it the tool of choice for modern test automation.&lt;/p&gt;

&lt;p&gt;But Playwright is a &lt;strong&gt;framework, not a solution&lt;/strong&gt;. It gives you the building blocks — you still need to architect, write, and maintain your tests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aegisrunner.com" rel="noopener noreferrer"&gt;AegisRunner&lt;/a&gt; uses Playwright under the hood. Same engine, same reliability, same cross-browser support. The difference: &lt;strong&gt;you never write a line of Playwright code.&lt;/strong&gt; The AI does it for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playwright: The Power and the Cost
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init playwright@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple to install. Then the work begins:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Design your test structure — page objects, fixtures, helpers&lt;/li&gt;
&lt;li&gt;Write test files — one per feature area&lt;/li&gt;
&lt;li&gt;Add assertions — what to check on each page&lt;/li&gt;
&lt;li&gt;Handle authentication — login flows, session management&lt;/li&gt;
&lt;li&gt;Configure CI — GitHub Actions, parallel workers, sharding&lt;/li&gt;
&lt;li&gt;Maintain tests — fix broken selectors, update assertions, add new tests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a 50-page application, expect &lt;strong&gt;80-160 hours of initial test writing&lt;/strong&gt;, plus ongoing maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  AegisRunner: Playwright Without the Code
&lt;/h2&gt;

&lt;p&gt;AegisRunner runs the same Playwright browser engine. When you start a crawl, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Launches Playwright Chromium (or Firefox, or WebKit)&lt;/li&gt;
&lt;li&gt;Navigates to your URL&lt;/li&gt;
&lt;li&gt;Discovers every page via links and sitemap&lt;/li&gt;
&lt;li&gt;Interacts with every element — clicks, fills, toggles, hovers&lt;/li&gt;
&lt;li&gt;Captures screenshots and DOM snapshots&lt;/li&gt;
&lt;li&gt;Generates Playwright-compatible test cases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The generated tests use real CSS selectors, text matchers, and role-based locators — the same best practices Playwright recommends.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Get vs What You Build
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Playwright (DIY)&lt;/th&gt;
&lt;th&gt;AegisRunner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Test creation time&lt;/td&gt;
&lt;td&gt;1-2 hours per page&lt;/td&gt;
&lt;td&gt;Minutes (automatic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selector strategy&lt;/td&gt;
&lt;td&gt;You choose&lt;/td&gt;
&lt;td&gt;Auto-selected (CSS, text, role)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-browser&lt;/td&gt;
&lt;td&gt;Configure yourself&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual regression&lt;/td&gt;
&lt;td&gt;Plugin required&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility&lt;/td&gt;
&lt;td&gt;@axe-core/playwright plugin&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test maintenance&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Auto-healing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD setup&lt;/td&gt;
&lt;td&gt;Write YAML yourself&lt;/td&gt;
&lt;td&gt;One-click webhook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel execution&lt;/td&gt;
&lt;td&gt;Configure sharding&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page discovery&lt;/td&gt;
&lt;td&gt;You list the pages&lt;/td&gt;
&lt;td&gt;Automatic crawl + sitemap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Best of Both Worlds
&lt;/h2&gt;

&lt;p&gt;AegisRunner doesn't replace Playwright — it uses it. If you're a Playwright power user, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let AegisRunner generate the initial test suite&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export tests as &lt;code&gt;.spec.ts&lt;/code&gt; files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Customize and extend them in your own codebase&lt;/li&gt;
&lt;li&gt;Use AegisRunner for regression monitoring alongside your custom tests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives you the speed of AI generation with the flexibility of hand-written tests when you need them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Use Raw Playwright
&lt;/h2&gt;

&lt;p&gt;Stick with raw Playwright if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You enjoy writing tests and have the time&lt;/li&gt;
&lt;li&gt;You need extremely custom test logic (complex state machines, mock servers)&lt;/li&gt;
&lt;li&gt;You're building a testing framework for others to use&lt;/li&gt;
&lt;li&gt;You want to learn browser automation deeply&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who Should Use AegisRunner
&lt;/h2&gt;

&lt;p&gt;Use &lt;a href="https://aegisrunner.com" rel="noopener noreferrer"&gt;AegisRunner&lt;/a&gt; if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want Playwright-quality tests without writing code&lt;/li&gt;
&lt;li&gt;You need comprehensive coverage quickly&lt;/li&gt;
&lt;li&gt;Your team lacks dedicated test engineers&lt;/li&gt;
&lt;li&gt;You want accessibility, SEO, and security bundled with regression tests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Your existing Playwright knowledge isn't wasted. AegisRunner generates the same kind of tests you'd write — just faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aegisrunner.com/scan" rel="noopener noreferrer"&gt;Try it free&lt;/a&gt;&lt;/strong&gt; — paste your URL and see the Playwright tests it generates.&lt;/p&gt;

</description>
      <category>playwright</category>
      <category>testing</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AegisRunner vs Meticulous.ai — Two Opposite Approaches to Killing Manual Tests</title>
      <dc:creator>Aegis Runner</dc:creator>
      <pubDate>Mon, 23 Mar 2026 16:57:18 +0000</pubDate>
      <link>https://dev.to/aegis_runner_1fe3db6ef2bd/aegisrunner-vs-meticulousai-two-opposite-approaches-to-killing-manual-tests-2035</link>
      <guid>https://dev.to/aegis_runner_1fe3db6ef2bd/aegisrunner-vs-meticulousai-two-opposite-approaches-to-killing-manual-tests-2035</guid>
      <description>&lt;p&gt;The testing industry is converging on a shared belief: manually writing tests doesn't scale. Two companies are attacking this problem from opposite directions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meticulous.ai&lt;/strong&gt; records real user interactions from production traffic and replays them as tests. Their pitch: "tests are dead" — replaced by production recordings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aegisrunner.com" rel="noopener noreferrer"&gt;AegisRunner&lt;/a&gt;&lt;/strong&gt; crawls your application with an AI-driven browser and generates tests from the discovered page structure. The pitch: paste a URL, get a complete test suite.&lt;/p&gt;

&lt;p&gt;Both eliminate manual test writing. But the approaches have fundamentally different trade-offs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Meticulous Works
&lt;/h2&gt;

&lt;p&gt;Meticulous installs a JavaScript snippet on your production site. This snippet records every user session — clicks, scrolls, form fills, navigation. The recorded sessions are then replayed as tests against new deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The advantage:&lt;/strong&gt; tests reflect real user behavior, not hypothetical scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trade-offs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requires production traffic.&lt;/strong&gt; New features with no production usage have no tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy concerns.&lt;/strong&gt; Recording production sessions raises GDPR and privacy questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production dependency.&lt;/strong&gt; Your testing pipeline depends on your production environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No pre-production testing.&lt;/strong&gt; You can't test staging or dev environments without real traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How AegisRunner Works
&lt;/h2&gt;

&lt;p&gt;AegisRunner visits your application with an automated browser, discovers every page and interactive element, and generates tests based on the page structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The advantage:&lt;/strong&gt; works on any environment — production, staging, development, localhost. No real user traffic needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trade-offs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synthetic interactions.&lt;/strong&gt; The crawler explores every possible interaction, not just the ones real users take.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovery-based.&lt;/strong&gt; Tests are based on what's on the page, not user intent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feature Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Meticulous.ai&lt;/th&gt;
&lt;th&gt;AegisRunner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Test source&lt;/td&gt;
&lt;td&gt;Production traffic recordings&lt;/td&gt;
&lt;td&gt;AI-driven crawl and discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works on staging/dev&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Yes — any URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires production snippet&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy concerns&lt;/td&gt;
&lt;td&gt;Yes (recording user sessions)&lt;/td&gt;
&lt;td&gt;No (synthetic crawl)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New feature coverage&lt;/td&gt;
&lt;td&gt;Only after users interact&lt;/td&gt;
&lt;td&gt;Immediate (crawl discovers it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual regression&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility testing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (WCAG 2.1, axe-core)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO auditing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security scanning&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance monitoring&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;Install snippet + wait for traffic&lt;/td&gt;
&lt;td&gt;Paste URL + start crawl&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The "Tests Are Dead" Debate
&lt;/h2&gt;

&lt;p&gt;Meticulous's marketing claims tests are dead — that recording and replaying production behavior makes traditional tests obsolete.&lt;/p&gt;

&lt;p&gt;There's a compelling argument there. Production recordings capture real user workflows that test engineers might never think to write.&lt;/p&gt;

&lt;p&gt;But there's a counter-argument: &lt;strong&gt;production recordings only cover what users have already done.&lt;/strong&gt; They don't test edge cases, error states, or new features that haven't been used yet.&lt;/p&gt;

&lt;p&gt;AegisRunner's approach covers both. The crawler explores every discoverable path — including error states, empty states, and edge cases that real users haven't triggered yet. It finds the broken "Add to Cart" button before any customer encounters it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Choose Meticulous
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You have significant production traffic&lt;/li&gt;
&lt;li&gt;Your primary concern is ensuring existing workflows don't break&lt;/li&gt;
&lt;li&gt;You're comfortable with a production JavaScript snippet recording sessions&lt;/li&gt;
&lt;li&gt;Privacy regulations aren't a concern&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Choose AegisRunner
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need to test staging or development environments&lt;/li&gt;
&lt;li&gt;You want testing before you have production traffic&lt;/li&gt;
&lt;li&gt;Privacy regulations prevent recording user sessions&lt;/li&gt;
&lt;li&gt;You need accessibility, SEO, and security testing alongside regression tests&lt;/li&gt;
&lt;li&gt;You want a free tier to evaluate before committing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Can You Use Both?
&lt;/h2&gt;

&lt;p&gt;Yes. Meticulous covers real user workflows from production. AegisRunner covers synthetic exploration of every possible interaction. Together, they provide the most comprehensive coverage.&lt;/p&gt;

&lt;p&gt;But if you have to choose one: do you have enough production traffic to make Meticulous effective? If not, &lt;a href="https://aegisrunner.com" rel="noopener noreferrer"&gt;AegisRunner&lt;/a&gt; gives you full coverage from day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aegisrunner.com/scan" rel="noopener noreferrer"&gt;Try it free&lt;/a&gt;&lt;/strong&gt; — paste your URL and see what AegisRunner discovers. No signup, no snippet installation.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>Why Your UI Tests Break Every Sprint (And How to Fix It for Good)</title>
      <dc:creator>Aegis Runner</dc:creator>
      <pubDate>Wed, 18 Mar 2026 06:55:15 +0000</pubDate>
      <link>https://dev.to/aegis_runner_1fe3db6ef2bd/why-your-ui-tests-break-every-sprint-and-how-to-fix-it-for-good-5cbk</link>
      <guid>https://dev.to/aegis_runner_1fe3db6ef2bd/why-your-ui-tests-break-every-sprint-and-how-to-fix-it-for-good-5cbk</guid>
      <description>&lt;p&gt;You push a design update. The button still works. The user flow is unchanged. But your CI is red.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;This is the daily reality for teams whose test suites are built on CSS selectors. Someone renames &lt;code&gt;.btn-primary&lt;/code&gt; to &lt;code&gt;.btn-primary-v2&lt;/code&gt;, restructures a form, or swaps a&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;for a &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; — and suddenly 60 tests fail. Not because anything is broken. Because the tests were looking for the wrong thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Root Cause: Tests That Know Too Much&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you write a selector like this:&lt;br&gt;
&lt;code&gt;document.querySelector('#checkout &amp;gt; div:nth-child(3) &amp;gt; input.form-control')&lt;/code&gt;&lt;br&gt;
you're not describing what the user experiences. You're describing how a developer happened to structure the DOM on a particular Tuesday.&lt;/p&gt;

&lt;p&gt;That's a snapshot, not a contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: Test What the User Sees&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern testing best practice flips the model: target elements by ARIA role and visible text, not by class names or DOM position.&lt;br&gt;
// Fragile ❌&lt;br&gt;
&lt;code&gt;cy.get('.btn-primary-v2').click()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;// Resilient ✅&lt;br&gt;
&lt;code&gt;cy.findByRole('button', { name: 'Submit Order' }).click()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The second selector survives any redesign. As long as the button still says "Submit Order" and has role="button", it will be found — regardless of what happened to the surrounding markup.&lt;/p&gt;

&lt;p&gt;This approach, sometimes called selector resilience, is the difference between a test suite that helps you ship faster and one that slows you down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hidden Benefit: Accessibility Auditing Built In&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the part most teams don't realise: if your test can't find an element by role or label, that's a real bug — not just a test failure.&lt;/p&gt;

&lt;p&gt;A button without an accessible name is invisible to screen readers and to your test runner. Your test suite becomes a live accessibility audit, catching issues before they reach users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applying This at Scale&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manually refactoring hundreds of selectors is painful. The better approach is to generate tests that are resilient from the start — crawling your app and writing selectors against roles and labels automatically.&lt;/p&gt;

&lt;p&gt;That's exactly what &lt;a href="https://aegisrunner.com" rel="noopener noreferrer"&gt;AegisRunner &lt;/a&gt;does. It crawls your application, discovers interactive states, and generates Playwright tests that use ARIA roles and visible text — so they don't break when your designers do their job.&lt;/p&gt;

&lt;p&gt;If you're evaluating tools, &lt;a href="https://aegisrunner.com/blog/best-regression-testing-software-2026" rel="noopener noreferrer"&gt;this 2026 roundup of regression testing software&lt;/a&gt; is worth a read — it covers how different tools handle selector stability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Checklist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before your next sprint, audit your selectors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Replace index-based queries (nth-child) with role queries&lt;/li&gt;
&lt;li&gt; Replace class-based selectors with label/text queries&lt;/li&gt;
&lt;li&gt; Any element your test can't find by role → file an accessibility ticket&lt;/li&gt;
&lt;li&gt; Add a linting rule to ban .querySelector in test files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop writing tests that know your implementation. Write tests that know your product.&lt;/p&gt;

&lt;p&gt;If you want a tool that handles this automatically, &lt;a href="https://aegisrunner.com/pricing" rel="noopener noreferrer"&gt;AegisRunner's pricing starts free&lt;/a&gt; — no credit card required.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have a selector horror story? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
