<?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.us-east-2.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>Automated Regression Testing: The Complete 2026 Guide</title>
      <dc:creator>Aegis Runner</dc:creator>
      <pubDate>Sun, 26 Jul 2026 11:48:39 +0000</pubDate>
      <link>https://dev.to/aegis_runner_1fe3db6ef2bd/automated-regression-testing-the-complete-2026-guide-4538</link>
      <guid>https://dev.to/aegis_runner_1fe3db6ef2bd/automated-regression-testing-the-complete-2026-guide-4538</guid>
      <description>&lt;p&gt;Every team I've talked to hits the same wall.&lt;/p&gt;

&lt;p&gt;You ship daily. Your QA checklist has 80 items. Nobody has time to run them all. You skip a few. Then you skip more. Then production breaks because a form you forgot to check stopped submitting three deploys ago.&lt;/p&gt;

&lt;p&gt;That's the regression problem. This guide covers how to solve it properly in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is automated regression testing?
&lt;/h2&gt;

&lt;p&gt;Automated regression testing uses software to re-run tests after code changes. It confirms that functionality which previously worked still works. A "regression" is any bug where a working feature breaks.&lt;/p&gt;

&lt;p&gt;The automation part means a machine does the verification — on every commit, deploy, or schedule. It's the backbone of any real CI/CD pipeline. Without it, every release is a gamble. You fix one bug and silently break three others.&lt;/p&gt;

&lt;p&gt;Modern regression suites cover the flows that matter most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication (login, logout, session expiry, 2FA)&lt;/li&gt;
&lt;li&gt;Core user journeys (signup, checkout, key CRUD operations)&lt;/li&gt;
&lt;li&gt;API contracts (status codes, response shapes, error handling)&lt;/li&gt;
&lt;li&gt;UI interactions (forms, navigation, dynamic content)&lt;/li&gt;
&lt;li&gt;Edge cases (empty states, error states, permission boundaries)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why manual regression testing fails at scale
&lt;/h2&gt;

&lt;p&gt;Manual regression works for monthly deploys. It collapses when you're shipping several times a day. The failure modes are predictable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't scale with deploy frequency.&lt;/strong&gt; A 2-hour manual checklist made sense when you shipped monthly. At 5 deploys a day, that's 10 engineer-hours just in regression checks — before any real work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Humans skip things under pressure.&lt;/strong&gt; Especially the boring flows. The checkout you've tested 200 times. The password reset nobody ever uses. Until a customer does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage degrades silently.&lt;/strong&gt; New features get added. The regression checklist doesn't. Six months later, 30% of your product has no regression coverage and nobody knows which 30%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It blocks shipping.&lt;/strong&gt; When regression is a human task, it becomes the bottleneck. Developers wait. Deploys queue up. The pressure to skip builds.&lt;/p&gt;

&lt;p&gt;The math is simple: as deploy frequency rises, manual regression becomes the bottleneck. Teams have hit this wall, which is why search volume for automated regression testing has surged in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  The classic automated approaches (and their limits)
&lt;/h2&gt;

&lt;p&gt;For years, automating regression meant two paths. Both have significant friction.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Code-first frameworks (Playwright, Cypress, Selenium)
&lt;/h3&gt;

&lt;p&gt;Full control. You write every test in TypeScript, JavaScript, or Python. The suite is yours — no vendor lock-in, runs anywhere.&lt;/p&gt;

&lt;p&gt;The cost concentrates in authoring and maintenance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// You write this for every flow, every page, every edge case&lt;/span&gt;
&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;checkout completes successfully&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="add-to-cart"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="checkout-btn"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#card-number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4242424242424242&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 20 more lines&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.order-confirmation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the UI changes. The &lt;code&gt;[data-testid="checkout-btn"]&lt;/code&gt; becomes &lt;code&gt;[data-testid="proceed-to-checkout"]&lt;/code&gt;. Or the card form moves to a modal. Your test breaks. You fix it. A week later, it breaks again.&lt;/p&gt;

&lt;p&gt;Selectors are fragile. Suites need a dedicated owner. Coverage only grows as fast as engineers write scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Record-and-playback tools (Katalon, Mabl, old Testim)
&lt;/h3&gt;

&lt;p&gt;Faster to start. Click through your app, the tool records it, generates a test. No code needed upfront.&lt;/p&gt;

&lt;p&gt;But recordings are brittle in a different way. They capture what happened, not what you meant. The moment your DOM structure changes, the recording breaks. And now your tests live in a proprietary format you can't version-control properly or run without the vendor's cloud.&lt;/p&gt;

&lt;p&gt;You trade code ownership for a monthly bill and a suite that still needs constant babysitting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both approaches automate execution. Neither automates the two things that cost the most: writing and maintaining tests.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How AI changes automated regression testing in 2026
&lt;/h2&gt;

&lt;p&gt;The 2026 shift is from scripting tests to generating them. You no longer write &lt;code&gt;test('should log in', ...)&lt;/code&gt; by hand. You point an AI agent at your app. It does the discovery and authoring for you.&lt;/p&gt;

&lt;p&gt;Here's what that actually looks like:&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic discovery
&lt;/h3&gt;

&lt;p&gt;Instead of you deciding what to test, the AI crawls your entire application like a first-time user. It finds every page, form, authentication flow, and interactive element — including edge cases you wouldn't think to script and states that only appear after specific sequences of actions.&lt;/p&gt;

&lt;p&gt;On a typical SaaS app, AI discovery finds 30–40% more testable states than a manually authored suite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generated tests that use stable selectors
&lt;/h3&gt;

&lt;p&gt;The AI generates tests using semantic selectors — text content, ARIA roles, &lt;code&gt;data-testid&lt;/code&gt; attributes — rather than brittle CSS class chains. When your UI refactors, the tests survive because they target meaning, not implementation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AI-generated: targets semantic meaning, not CSS structure&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Complete purchase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Order confirmed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Human-written: breaks when styling changes&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.btn-primary.checkout-flow__submit--v2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.order-success-modal__heading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Self-healing on UI changes
&lt;/h3&gt;

&lt;p&gt;When a selector does fail, the AI tries fallback selectors before reporting a failure. Minor UI changes stop producing false positives. Real regressions still surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playwright export
&lt;/h3&gt;

&lt;p&gt;You're never locked in. Export your entire test suite as clean Playwright TypeScript and run it anywhere — your own CI, locally, or in any test cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to set up a suite in 15 minutes
&lt;/h2&gt;

&lt;p&gt;This is what the AI-generated approach looks like in practice with &lt;a href="https://aegisrunner.com" rel="noopener noreferrer"&gt;AegisRunner&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Paste your URL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No SDK to install. No config file. No browser extension. Paste your site URL (including localhost if you're testing pre-deploy).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Configure auth (if needed)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your app has a login wall, provide credentials. The crawler authenticates, then tests everything behind the auth boundary too — not just public pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Run the crawl&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI explores your application. For a typical SaaS (20–50 pages):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawl time: 7–18 minutes&lt;/li&gt;
&lt;li&gt;Pages discovered: all of them, including dynamic routes&lt;/li&gt;
&lt;li&gt;Test cases generated: 50–200 depending on interactive surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Review and run&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You get a report of what was found and what was generated. Review the tests, disable any you don't want, run the suite. Failures come with screenshots and traces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Drop it into CI&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Trigger a test run from your pipeline&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://app.aegisrunner.com/api/v1/runs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_CI_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"projectId": "your-project-id"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One API call. Results to Slack, Discord, Jira, or webhook — wherever your team lives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best practices for 2026
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Test at the right level.&lt;/strong&gt; Regression suites should focus on user-facing flows, not internal implementation. If your test breaks because a CSS class name changed, you're testing the wrong thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on every deploy, not just nightly.&lt;/strong&gt; Nightly builds tell you something broke 12 hours ago. Deploy-triggered tests tell you immediately, before users hit it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat flaky tests as bugs.&lt;/strong&gt; A test that sometimes passes and sometimes fails is worse than no test. It erodes trust in the entire suite. Fix or delete flaky tests immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep your suite fast.&lt;/strong&gt; A suite that takes 90 minutes to run will be skipped under pressure. Use parallelism. Target &amp;lt; 15 minutes for core regression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate regression from exploratory.&lt;/strong&gt; Regression confirms known flows work. Exploratory testing finds new issues. They're different activities. Don't confuse them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version control your tests.&lt;/strong&gt; Whether you write them or generate them, tests belong in Git. Treat them like production code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chasing 100% coverage.&lt;/strong&gt; It doesn't exist and the pursuit of it produces low-value tests. Cover your critical paths deeply. Cover the rest shallowly or not at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never updating the suite.&lt;/strong&gt; Tests rot. As features change, old tests become irrelevant or incorrect. Audit your suite quarterly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing only the happy path.&lt;/strong&gt; Most bugs live in edge cases — empty states, error handling, permission boundaries, concurrent actions. Your regression suite should cover them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping regression on "small" changes.&lt;/strong&gt; Most production incidents are caused by changes that seemed small. A one-line config change can break authentication. Run regression on everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building without CI integration.&lt;/strong&gt; A regression suite that runs locally is better than nothing. A suite that runs automatically on every deploy is what actually prevents regressions in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How is automated regression testing different from unit testing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unit tests verify isolated functions in isolation, with mocked dependencies. Regression tests verify real user flows in a real browser against a real app. Both matter. Regression tests catch integration failures unit tests can't see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often should regression tests run?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On every deploy to staging at minimum. On every commit to main branches in mature pipelines. Nightly for full-suite runs on large apps where the complete suite is too slow to run on every commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between regression testing and end-to-end testing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Regression testing is a goal (confirm nothing that worked has broken). End-to-end testing is a method (test complete user journeys through the full stack). Most regression suites use end-to-end tests as their primary mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can AI-generated tests replace manually written tests?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For regression coverage of existing flows, yes — AI-generated tests are faster to produce and easier to maintain. For complex business logic with specific assertions, hand-written tests still have their place. The practical answer for most teams: use AI for coverage breadth, hand-write for critical depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when the AI generates a bad test?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Review and disable it. Every AI-generated suite has a review step where you approve, reject, or modify tests before they run in CI. Bad tests don't make it to your pipeline unless you approve them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the&lt;/em&gt; &lt;a href="https://aegisrunner.com/blog/automated-regression-testing" rel="noopener noreferrer"&gt;&lt;em&gt;AegisRunner blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. AegisRunner generates complete regression test suites from a URL — no code, no config, no recording.&lt;/em&gt; &lt;a href="https://app.aegisrunner.com/register" rel="noopener noreferrer"&gt;&lt;em&gt;Free tier available.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
      <category>playwright</category>
      <category>devops</category>
    </item>
    <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>
