<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Test Management Blog &#8211; Test Management</title>
	<atom:link href="https://www.testmanagement.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.testmanagement.com</link>
	<description></description>
	<lastBuildDate>Fri, 07 Nov 2025 07:55:45 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.12</generator>

<image>
	<url>https://www.testmanagement.com/wp-content/uploads/2019/04/Favicon-Transparent-150x150.png</url>
	<title>Test Management Blog &#8211; Test Management</title>
	<link>https://www.testmanagement.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AI Document Consistency and Reducing Conflicts</title>
		<link>https://www.testmanagement.com/blog/2025/11/ai-document-consistency/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Thu, 06 Nov 2025 23:21:55 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12764</guid>

					<description><![CDATA[<p>Document Consistency and Building the System That Prevents AI Conflict Why Your AI Agent Keeps Changing Its Mind One of the quickest ways to send your AI agent off track is to give it conflicting information. Conflicting information in files, memory, or context almost guarantees unreliable results. One run it&#8217;ll do X, the next run [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/11/ai-document-consistency/">AI Document Consistency and Reducing Conflicts</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1 data-line="0" class="code-line" dir="auto" id="document-consistency-analysis-building-the-system-that-prevents-conflict">Document Consistency and Building the System That Prevents AI Conflict</h1>
<h2 data-line="2" class="code-line" dir="auto" id="why-your-ai-agent-keeps-changing-its-mind">Why Your AI Agent Keeps Changing Its Mind</h2>
<p data-line="4" class="code-line" dir="auto">One of the quickest ways to send your AI agent off track is to give it conflicting information. Conflicting information in files, memory, or context almost guarantees unreliable results. One run it&#8217;ll do X, the next run it&#8217;ll go off and do Y.</p>
<p data-line="6" class="code-line" dir="auto">Now this might seem, on the surface, like quite an easy thing to avoid. However, when you&#8217;re getting AI agents to generate information in the first place, you can (most likely will) end up with a lot of data and files. And let&#8217;s face it — we don&#8217;t always read and review all of the content that&#8217;s generated.</p>
<p data-line="8" class="code-line" dir="auto">As you create all these documents you&#8217;re not just creating documents. You&#8217;re building an information system that shapes your AI&#8217;s behavior. That behaviour becomes more unpredictable the more conflict it&#8217;s exposed to. Conversely the more consistency you provide the more predictability you&#8217;ll get.</p>
<p data-line="10" class="code-line" dir="auto">The content in your system MUST be consistent if you want to build a good system.</p>
<h2 data-line="12" class="code-line" dir="auto" id="two-fast-exercises-to-see-the-problem">Two Fast Exercises to See the Problem</h2>
<p data-line="14" class="code-line" dir="auto">I&#8217;ve designed two exercises so you can experience this immediately. You just need a browser and a claude.ai or ChatGPT account. Each exercise takes under 10 minutes.</p>
<ul data-line="16" class="code-line" dir="auto">
<li data-line="16" class="code-line" dir="auto"><strong>Exercise 1:</strong><span> </span>Simple personal fitness project (blindingly obvious conflicts)</li>
<li data-line="17" class="code-line" dir="auto"><strong>Exercise 2:</strong><span> </span>Test case development system (realistic professional scenario)</li>
</ul>
<p data-line="19" class="code-line" dir="auto">Each exercise focuses on creating WHAT, HOW, and WHO/WHEN/WHERE documents, then analyzing them for conflicts. More on this later.</p>
<p data-line="22" class="code-line" dir="auto">To see what I&#8217;m talking about, try the following exercise.</p>
<h2 data-line="24" class="code-line" dir="auto" id="exercise-1--simple-personal-fitness-plan">Exercise 1 : Simple Personal Fitness Plan</h2>
<p data-line="26" class="code-line" dir="auto">This exercise gets you to build a personal fitness plan. It&#8217;s based on creating 3 documents:</p>
<ul data-line="28" class="code-line" dir="auto">
<li data-line="28" class="code-line" dir="auto">WHAT document for my fitness goals</li>
<li data-line="29" class="code-line" dir="auto">HOW document for my fitness training approach</li>
<li data-line="30" class="code-line" dir="auto">WHO/WHEN/WHERE context document for my fitness situation</li>
</ul>
<p data-line="32" class="code-line" dir="auto">This is a simple exercise with blindingly obvious discrepancies. The idea is to force home the concept and technique &#8230; not actually help you run a 10k race!</p>
<p data-line="34" class="code-line" dir="auto">You can do this entire exercise in a single browser session (with 4 tabs open). It&#8217;s designed to give you the &#8220;aha moment&#8221; in under 10 minutes.</p>
<h4 data-line="37" class="code-line" dir="auto" id="the-setup--open-a-browser-with-4-tabs">The Setup : Open a Browser with 4 Tabs</h4>
<p data-line="39" class="code-line" dir="auto">Complete these actions:</p>
<ul data-line="40" class="code-line" dir="auto">
<li data-line="40" class="code-line" dir="auto">open a browser</li>
<li data-line="41" class="code-line" dir="auto">open 4 tabs</li>
<li data-line="42" class="code-line" dir="auto">navigate to Claude.ai or ChatGPT in all 4 tabs.</li>
</ul>
<h4 data-line="44" class="code-line" dir="auto" id="step-1-create-your-what-document">Step 1: Create Your WHAT Document</h4>
<p data-line="46" class="code-line" dir="auto">Open claude.ai or ChatGPT in a browser (Tab 1) and use this exact prompt:</p>
<pre><code data-line="48" class="code-line" dir="auto">"Please create a WHAT document for my fitness goals. I want to:
- Lose 15 pounds over 6 months
- Complete a 10K race 
- Improve overall strength and muscle tone

Define what success looks like for each goal, what the finished state looks like, and what standards I need to meet. Format this as a clear and concise document I can reference."
</code></pre>
<p data-line="57" class="code-line" dir="auto">Save this response as a document called<span> </span><code>what.md</code></p>
<h4 data-line="59" class="code-line" dir="auto" id="step-2-create-your-how-document">Step 2: Create Your HOW Document</h4>
<p data-line="60" class="code-line" dir="auto">Open a second browser tab with claude.ai or ChatGPT (Tab 2) and use this exact prompt:</p>
<pre><code data-line="62" class="code-line" dir="auto">"Please create a HOW document for my fitness training approach. My methods are:
- Running 4 times per week building up distance gradually
- Strength training 3 times per week focusing on compound movements
- Calorie deficit of 500 calories per day through portion control

Describe how I'll approach training, how I'll structure my week, and how I'll execute this plan. Format this as a clear and concise document."
</code></pre>
<p data-line="71" class="code-line" dir="auto">Save this response as a document called<span> </span><code>how.md</code></p>
<h4 data-line="73" class="code-line" dir="auto" id="step-3-create-your-whowhenwhere-document">Step 3: Create Your WHO/WHEN/WHERE Document</h4>
<p data-line="75" class="code-line" dir="auto">Open a third browser tab with claude.ai or ChatGPT (Tab 3) and use this exact prompt:</p>
<pre><code data-line="77" class="code-line" dir="auto">"Please create a WHO/WHEN/WHERE context document for my fitness situation. My reality:
- I work standard 45-hour weeks with occasional evening meetings
- I have a 45-minute commute each way
- I enjoy exercise but struggle with early mornings
- I have a basic home gym setup (dumbbells, resistance bands, yoga mat)
- I typically go to bed around 11pm and wake at 7am
- I have family dinner commitments 4 evenings per week at 6:30pm

Describe my constraints, my current situation, and the resources and limitations I'm working with. Format this as a clear and concise document."
</code></pre>
<p data-line="89" class="code-line" dir="auto">Save this response as a document called<span> </span><code>who-when-where.md</code></p>
<h4 data-line="91" class="code-line" dir="auto" id="step-4-run-your-conflict-analysis">Step 4: Run Your Conflict Analysis</h4>
<p data-line="92" class="code-line" dir="auto">Open a fourth browser tab with claude.ai/chatGPT (Tab 4) :</p>
<p data-line="94" class="code-line" dir="auto">Upload the following documents or paste them into your AI tool of choice.</p>
<p data-line="96" class="code-line" dir="auto">what.md how.md who-when-where.md</p>
<p data-line="100" class="code-line" dir="auto">Then enter the following prompt:</p>
<pre><code data-line="102" class="code-line" dir="auto">"I have three documents about my fitness plan. Analyze them for conflicts, contradictions, and inconsistencies."

Identify:
1. Goal conflicts (goals that work against each other)
2. Method mismatches (approaches that don't support the goals)
3. Reality gaps (constraints that make goals/methods impossible)
4. Resource conflicts (time/access issues)

Be specific about which parts of which documents conflict with each other."
</code></pre>
<p data-line="114" class="code-line" dir="auto">From here you can work with your AI agent to create 3 updated documents that are consistent and work together.</p>
<hr data-line="116" class="code-line" dir="auto" />
<p data-line="118" class="code-line" dir="auto">This conflict analysis isn&#8217;t just debugging documentation for AI systems. In many ways it&#8217;s debugging your own decision-making process. The clearer your thought process is the clearer you can make it for an AI system.</p>
<p data-line="120" class="code-line" dir="auto">Maybe I could even go as far as saying humans and AI agents share very similar fundamental requirements. Consistent information produces consistent behavior. Contradictory information — whether in documents, plans, or your own thinking, produces conflict.</p>
<p data-line="122" class="code-line" dir="auto">Build consistency into your system, and you build reliability into your results.</p>
<h2 data-line="124" class="code-line" dir="auto" id="from-document-management-to-behavior-design">From Document Management to Behavior Design</h2>
<p data-line="126" class="code-line" dir="auto">Most people think about documentation as storage. However, if you start thinking about this from a higher-level you start to understand that your documentation is the<span> </span><strong>behavioral programming for AI system</strong>.</p>
<p data-line="128" class="code-line" dir="auto"><strong>Lower-Level Thinking:</strong><span> </span>&#8220;I need to organize my project documents better&#8221;</p>
<p data-line="131" class="code-line" dir="auto"><strong>Higher-Level Thinking:</strong><span> </span>&#8220;I need coherent and consistent documentation so that conflicting signals are minimised&#8221;</p>
<p data-line="134" class="code-line" dir="auto">This isn&#8217;t about being tidy. It&#8217;s about understanding that<span> </span><strong>every document is a behavior modifier</strong><span> </span>for your AI system. Conflicts create behavioral instability. Consistency creates predictable and powerful AI behavior.</p>
<h2 data-line="136" class="code-line" dir="auto" id="separating-what-from-how">Separating WHAT from HOW</h2>
<p data-line="138" class="code-line" dir="auto">After months of working with AI agents, and debugging when things are going wrong, I discovered this technique. It&#8217;s deceptively simple, but it&#8217;s the difference between AI that works and AI that works<span> </span><em>reliably</em>.</p>
<h3 data-line="140" class="code-line" dir="auto" id="the-architecture">The Architecture</h3>
<p data-line="142" class="code-line" dir="auto">You&#8217;ll see in that first exercise that I&#8217;ve structured my documents into distinct areas:</p>
<p data-line="144" class="code-line" dir="auto"><strong>Domain A: The WHAT Documents</strong><span> </span>(Templates/Examples/Specifications)</p>
<ul data-line="145" class="code-line" dir="auto">
<li data-line="145" class="code-line" dir="auto">What the output should look like</li>
<li data-line="146" class="code-line" dir="auto">What standards to follow</li>
<li data-line="147" class="code-line" dir="auto">What patterns to match</li>
<li data-line="148" class="code-line" dir="auto">What quality criteria to meet</li>
</ul>
<p data-line="150" class="code-line" dir="auto"><strong>Domain B: The HOW Documents</strong><span> </span>(Process/Instructions/Methods)</p>
<ul data-line="151" class="code-line" dir="auto">
<li data-line="151" class="code-line" dir="auto">How to approach the task</li>
<li data-line="152" class="code-line" dir="auto">How to make decisions</li>
<li data-line="153" class="code-line" dir="auto">How to handle edge cases</li>
<li data-line="154" class="code-line" dir="auto">How to iterate and improve</li>
</ul>
<p data-line="156" class="code-line" dir="auto"><strong>Domain C: The WHO/WHEN/WHERE Context</strong><span> </span>(Persistent Memory)</p>
<ul data-line="157" class="code-line" dir="auto">
<li data-line="157" class="code-line" dir="auto">Who is involved (roles, expertise)</li>
<li data-line="158" class="code-line" dir="auto">When things happen (schedules, triggers)</li>
<li data-line="159" class="code-line" dir="auto">Where resources exist (tools, systems)</li>
<li data-line="160" class="code-line" dir="auto">Why certain choices were made (decisions, history)</li>
</ul>
<p data-line="162" class="code-line" dir="auto">In many ways this approach helps ME as much as it helps the AI engine.</p>
<p data-line="164" class="code-line" dir="auto">That&#8217;s because I can break down what I&#8217;m trying to do into easier to manage and understand components. When you separate WHAT from HOW, you&#8217;re creating clear lanes where different aspects of your information can be created with clarity and consistency.</p>
<p data-line="166" class="code-line" dir="auto">One of the big reasons I do this is because it makes it easier to pick up on conflicts and build consistency.</p>
<p data-line="168" class="code-line" dir="auto">Now let&#8217;s try this with something more realistic.</p>
<h3 data-line="170" class="code-line" dir="auto" id="exercise-2-the-test-case-creation-system">Exercise 2: The Test Case Creation System</h3>
<p data-line="172" class="code-line" dir="auto">In this exercise we create the document set that builds a system to create test cases for a software testing project. We&#8217;ll create the following documents:</p>
<ul data-line="174" class="code-line" dir="auto">
<li data-line="174" class="code-line" dir="auto">WHAT : a template that shows what a test case should look like</li>
<li data-line="175" class="code-line" dir="auto">HOW : a set of principles for creating good test cases</li>
<li data-line="176" class="code-line" dir="auto">WHO/WHEN/WHERE : other constraints and useful context</li>
</ul>
<h4 data-line="178" class="code-line" dir="auto" id="the-setup--open-a-browser-with-4-tabs-1">The Setup : Open a Browser with 4 Tabs</h4>
<p data-line="180" class="code-line" dir="auto">Complete these actions:</p>
<ul data-line="181" class="code-line" dir="auto">
<li data-line="181" class="code-line" dir="auto">open a browser</li>
<li data-line="182" class="code-line" dir="auto">open 4 tabs</li>
<li data-line="183" class="code-line" dir="auto">navigate to Claude.ai or ChatGPT in all 4 tabs.</li>
</ul>
<h4 data-line="185" class="code-line" dir="auto" id="step-1-create-your-what-document-1">Step 1: Create Your WHAT Document</h4>
<p data-line="187" class="code-line" dir="auto">Open claude.ai or ChatGPT in a browser (Tab 1) and enter the following prompt:</p>
<pre><code data-line="189" class="code-line language-markdown" dir="auto">Create a test case template that shows the standard structure and format for writing software test cases. Include:
<span class="hljs-bullet">-</span> All essential fields (ID, title, preconditions, steps, expected results, etc.)
<span class="hljs-bullet">-</span> 2-3 concrete examples showing the template in use
<span class="hljs-bullet">-</span> Clear formatting that makes it easy to replicate

Keep it practical and scannable.
</code></pre>
<p data-line="198" class="code-line" dir="auto">Save this response to a file called<span> </span><code>test-case-format.md</code>.</p>
<h4 data-line="200" class="code-line" dir="auto" id="step-2-create-your-how-document-1">Step 2: Create Your HOW Document</h4>
<p data-line="202" class="code-line" dir="auto">Open claude.ai or ChatGPT in a browser (Tab 2) and use this exact prompt:</p>
<pre><code data-line="204" class="code-line language-markdown" dir="auto">Define 5-7 core principles for writing effective test cases. For each principle:
<span class="hljs-bullet">-</span> State the principle clearly (e.g., "Test one thing at a time")
<span class="hljs-bullet">-</span> Explain why it matters in 1-2 sentences
<span class="hljs-bullet">-</span> Give a brief example or counter-example

Focus on principles that lead to maintainable, clear, and valuable test cases.
</code></pre>
<p data-line="213" class="code-line" dir="auto">Save this response to a file named<span> </span><code>test-principles.md</code>.</p>
<h4 data-line="215" class="code-line" dir="auto" id="step-3-create-your-context">Step 3: Create Your Context</h4>
<p data-line="217" class="code-line" dir="auto">For this one you can just create the markdown document with the following content.</p>
<p data-line="219" class="code-line" dir="auto"><strong>You don&#8217;t need to get AI to generate anything here &#8211; just use this as it is</strong></p>
<pre><code data-line="221" class="code-line language-markdown" dir="auto"><span class="hljs-section"># Project Context</span>

<span class="hljs-section">## Team</span>
<span class="hljs-bullet">-</span> 4 developers with varying TDD experience
<span class="hljs-bullet">-</span> QA lead reviews all test PRs
<span class="hljs-bullet">-</span> Product owner reads test names for validation

<span class="hljs-section">## Environment</span>
<span class="hljs-bullet">-</span> JavaScript/Node.js project
<span class="hljs-bullet">-</span> Jest test framework
<span class="hljs-bullet">-</span> CI/CD runs tests on every commit
<span class="hljs-bullet">-</span> Test coverage target: 80%

<span class="hljs-section">## History</span>
<span class="hljs-bullet">-</span> Previous tests were inconsistent
<span class="hljs-bullet">-</span> Team agreed to define structure in last retro
</code></pre>
<p data-line="240" class="code-line" dir="auto">Save this content to a file called<span> </span><code>project-context.md</code>.</p>
<h4 data-line="242" class="code-line" dir="auto" id="step-4-run-the-consistency-analysis">Step 4: Run the Consistency Analysis</h4>
<p data-line="244" class="code-line" dir="auto">Open claude.ai or ChatGPT in a browser (Tab 4).</p>
<p data-line="246" class="code-line" dir="auto">Then copy and paste the contents of these three documents into the chat (one after another), or if your AI tool supports it, upload them as files:</p>
<ul data-line="248" class="code-line" dir="auto">
<li data-line="248" class="code-line" dir="auto">test-case-format.md</li>
<li data-line="249" class="code-line" dir="auto">test-principles.md</li>
<li data-line="250" class="code-line" dir="auto">project-context.md</li>
</ul>
<p data-line="252" class="code-line" dir="auto">Then use this exact prompt:</p>
<pre><code data-line="254" class="code-line" dir="auto">Analyze these three test documentation files for conflicts or inconsistencies:
1. test-case-format.md (WHAT we build)
2. test-principles.md (HOW we build)
3. project-context.md (WHO/WHEN/WHERE constraints)

Specifically identify:
- BLOCKING conflicts: Where HOW contradicts WHAT
- TENSION points: Where following one might compromise another
- GAPS: What's undefined that could cause inconsistency

Then create a test case following all three documents and show me where you had to make judgment calls.
</code></pre>
<p data-line="268" class="code-line" dir="auto">You&#8217;ll probably find significant conflicts here – and that&#8217;s precisely the point!</p>
<p data-line="270" class="code-line" dir="auto"><strong>You&#8217;ve just experienced what your AI experiences every time it reads your project documents.</strong></p>
<p data-line="272" class="code-line" dir="auto">Those contradictions between template structure and guiding principles? That tension between comprehensive documentation and incomplete examples? Your AI navigates these conflicts constantly, making different choices each run.</p>
<p data-line="274" class="code-line" dir="auto">Build consistency into your process, not after it. Create documents sequentially, each informing the next.</p>
<p data-line="276" class="code-line" dir="auto">You&#8217;re not organizing information – you&#8217;re architecting behavior.</p>
<h2 data-line="278" class="code-line" dir="auto" id="youre-building-a-behavioral-operating-system">You&#8217;re Building a Behavioral Operating System</h2>
<p data-line="280" class="code-line" dir="auto">This isn&#8217;t really about documents. It&#8217;s about understanding that<span> </span><strong>you&#8217;re designing a system to control AI behavior</strong>.</p>
<p data-line="282" class="code-line" dir="auto">Every document is a behavioral instruction. Every conflict is a defect in that system. Every consistency check is behavioral debugging.</p>
<p data-line="284" class="code-line" dir="auto">When you think this way, you stop being a prompt writer and become a<span> </span><strong>behavior architect</strong>.</p>
<h2 data-line="287" class="code-line" dir="auto" id="the-challenge-i-leave-you-with">The Challenge I Leave You With</h2>
<p data-line="289" class="code-line" dir="auto">Tomorrow, before you create your next AI prompt, ask yourself:</p>
<p data-line="291" class="code-line" dir="auto"><strong><em>&#8220;What behavior am I programming? Then check your documents for conflicts before your AI does.&#8221;</em></strong></p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/11/ai-document-consistency/">AI Document Consistency and Reducing Conflicts</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Experiment #5: Can Test Automation AI Learn From Its Own Failures?</title>
		<link>https://www.testmanagement.com/blog/2025/11/ai-test-automation-with-lessons-learnt-loops/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Mon, 03 Nov 2025 22:08:32 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12762</guid>

					<description><![CDATA[<p>Can this prompt-driven test automation system scale with complex applications using lessons learnt loops? I wondered if AI could fail at automating a complex test case, learn from that failure, and succeed on the second try. Here&#8217;s my attempt at building a process with a feedback loop that acheives that. The Question Can this prompt-driven [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/11/ai-test-automation-with-lessons-learnt-loops/">AI Experiment #5: Can Test Automation AI Learn From Its Own Failures?</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="part" data-startline="3" data-endline="3" data-position="73" data-size="0"><strong data-position="73" data-size="0"><span data-position="75" data-size="105">Can this prompt-driven test automation system scale with complex applications using lessons learnt loops?</span></strong></p>
<p class="part" data-startline="5" data-endline="5" data-position="184" data-size="0"><span data-position="184" data-size="199">I wondered if AI could fail at automating a complex test case, learn from that failure, and succeed on the second try. Here&#8217;s my attempt at building a process with a feedback loop that acheives that.</span></p>
<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/WXliKeeZdKQ?si=OABYq51UldGpoplA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="" />
<h2 class="part" data-startline="9" data-endline="9" id="The-Question" data-id="The-Question"><a class="anchor hidden-xs" href="#The-Question" title="The-Question" data-size="12" data-position="393" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="393" data-size="12">The Question</span></h2>
<p class="part" data-startline="11" data-endline="11" data-position="407" data-size="0"><span data-position="407" data-size="339">Can this prompt-driven test automation system scale with complex applications using lessons learnt loops? I know from experience that AG Grid scenarios are really difficult to automate &#8211; drag-and-drop, row grouping, complex UI interactions. They&#8217;re automation nightmares. So what happens when AI comes up against these sorts of challenges?</span></p>
<p class="part" data-startline="13" data-endline="13" data-position="748" data-size="0"><span data-position="748" data-size="392">What I&#8217;m looking at is scenarios where you encounter a complex application that defeats standard automation approaches. Where you can get Claude Code to complete some deep research and work out solutions. Solutions you can then build into a learning loop. And then, maybe creating a growing knowledge base of lessons that gets better over time, making each subsequent test easier to automate.</span></p>
<p class="part" data-startline="15" data-endline="15" data-position="1142" data-size="0"><span data-position="1142" data-size="37">Let&#8217;s see if we can get this to work.</span></p>
<hr class="" />
<h2 class="part" data-startline="19" data-endline="19" id="What-Im-Using" data-id="What-Im-Using"><a class="anchor hidden-xs" href="#What-Im-Using" title="What-Im-Using" data-size="14" data-position="1189" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1189" data-size="14">What I&#8217;m Using</span></h2>
<ul class="part" data-startline="21" data-endline="26" data-position="1205" data-size="0">
<li class="" data-startline="21" data-endline="21" data-position="1207" data-size="0"><span data-position="1207" data-size="42">Chrome DevTools MCP for browser automation</span></li>
<li class="" data-startline="22" data-endline="22" data-position="1252" data-size="0"><span data-position="1252" data-size="60">Claude Code with ultra-thinking capability for deep research</span></li>
<li class="" data-startline="23" data-endline="23" data-position="1315" data-size="0"><span data-position="1315" data-size="71">AG Grid example application (demanding complex automation interactions)</span></li>
<li class="" data-startline="24" data-endline="24" data-position="1389" data-size="0"><span data-position="1389" data-size="50">Test case markdown documents from video recordings</span></li>
<li class="" data-startline="25" data-endline="26" data-position="1442" data-size="0"><span data-position="1442" data-size="71">The deterministic prompt-driven automation framework from Experiment #4</span></li>
</ul>
<p class="part" data-startline="27" data-endline="27" data-position="1515" data-size="0"><span data-position="1515" data-size="320">I picked AG Grid specifically because I know it&#8217;s going to fail with the standard, simple, approaches used with test automation. The drag-and-drop implementation in AGgrid is non-standard, the components are complex, and it&#8217;s exactly the kind of application that makes automation engineers question their career choices.</span></p>
<hr class="" />
<h2 class="part" data-startline="31" data-endline="31" id="The-Setup" data-id="The-Setup"><a class="anchor hidden-xs" href="#The-Setup" title="The-Setup" data-size="9" data-position="1845" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1845" data-size="9">The Setup</span></h2>
<p class="part" data-startline="33" data-endline="33" data-position="1856" data-size="0"><span data-position="1856" data-size="41">Here&#8217;s how the Lessons Learnt Loop works:</span></p>
<p class="part" data-startline="35" data-endline="35" data-position="1899" data-size="0"><strong data-position="1899" data-size="0"><span data-position="1901" data-size="20">The Core Philosophy:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="37" data-endline="41" data-infoprefix-length="0" data-position="1925">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>Test Case (Markdown) → Discovery (AI Execution) → Failure Analysis → Lessons Document → Enhanced Discovery
           ↑                                                                              ↓
           └──────────────────── Success with Learned Patterns ─────────────────────────┘
</code></pre>
</div>
<p class="part" data-startline="43" data-endline="43" data-position="2223" data-size="0"><span data-position="2223" data-size="243">Traditional test automation often fails when encountering complex UI patterns &#8211; and then you&#8217;re stuck. You either spend hours debugging selector strategies, or you give up and mark it as &#8220;manual only.&#8221; The Lessons Learnt Loop treats this as a </span><strong data-position="2466" data-size="0"><span data-position="2468" data-size="16">learning problem</span></strong><span data-position="2486" data-size="228"> instead. Your first execution attempt gathers data about what didn&#8217;t work. An ultra-thinking phase analyzes why it failed and documents solutions. The second attempt uses these lessons to succeed where the first attempt failed.</span></p>
<p class="part" data-startline="45" data-endline="45" data-position="2716" data-size="0"><span data-position="2716" data-size="438">This shift in thinking has interesting implications. Just like a student learns from mistakes, our automation system can build knowledge about specific testing challenges. The AG Grid drag-and-drop that defeats standard automation becomes a documented, solved problem. The lessons learnt document becomes organizational knowledge that can be shared across teams. The result: automation that gets smarter with each challenge it encounters.</span></p>
<p class="part" data-startline="47" data-endline="47" data-position="3156" data-size="0"><strong data-position="3156" data-size="0"><span data-position="3158" data-size="25">The Three Key Components:</span></strong></p>
<ol class="part" data-startline="49" data-endline="70" data-position="3187" data-size="0">
<li class="" data-startline="49" data-endline="55" data-position="3190" data-size="0">
<p data-position="3187" data-size="0"><strong data-position="3190" data-size="0"><span data-position="3192" data-size="30">Failure Detection and Analysis</span></strong></p>
<ul data-position="3228" data-size="0">
<li class="" data-startline="50" data-endline="50" data-position="3230" data-size="0"><span data-position="3230" data-size="36">Identify exactly what failed and why</span></li>
<li class="" data-startline="51" data-endline="51" data-position="3272" data-size="0"><span data-position="3272" data-size="36">Capture error patterns and behaviors</span></li>
<li class="" data-startline="52" data-endline="53" data-position="3314" data-size="0"><span data-position="3314" data-size="44">Document the gap between expected and actual</span></li>
</ul>
<p data-position="3360" data-size="0"><span data-position="3363" data-size="458">Not all failures are created equal. An &#8220;element not found&#8221; error is different from &#8220;drag started but drop didn&#8217;t register.&#8221; This approach captures the nuances of complex failures &#8211; particularly important with frameworks like AG Grid that implement custom event handling. The failure analysis isn&#8217;t just logging errors; it&#8217;s understanding the underlying cause. This deep understanding is what enables the ultra-thinking phase to generate meaningful solutions.</span></p>
</li>
<li class="" data-startline="56" data-endline="63" data-position="3826" data-size="0">
<p data-position="3823" data-size="0"><strong data-position="3826" data-size="0"><span data-position="3828" data-size="29">Ultra-Thinking Research Phase</span></strong></p>
<ul data-position="3863" data-size="0">
<li class="" data-startline="57" data-endline="57" data-position="3865" data-size="0"><span data-position="3865" data-size="38">Deep dive into framework documentation</span></li>
<li class="" data-startline="58" data-endline="58" data-position="3909" data-size="0"><span data-position="3909" data-size="30">Analyze alternative approaches</span></li>
<li class="" data-startline="59" data-endline="59" data-position="3945" data-size="0"><span data-position="3945" data-size="37">Generate multiple solution strategies</span></li>
<li class="" data-startline="60" data-endline="61" data-position="3988" data-size="0"><span data-position="3988" data-size="38">Document findings in structured format</span></li>
</ul>
<p data-position="4028" data-size="0"><span data-position="4031" data-size="455">The ultra-thinking capability is like having a senior automation engineer research the problem for you. It doesn&#8217;t just try random alternatives &#8211; it systematically investigates the framework&#8217;s architecture, understands the implementation choices, and proposes solutions based on that understanding. For AG Grid, this meant discovering the custom event system and proposing API-based alternatives. This isn&#8217;t trial and error; it&#8217;s informed problem-solving.</span></p>
</li>
<li class="" data-startline="64" data-endline="70" data-position="4491" data-size="0">
<p data-position="4488" data-size="0"><strong data-position="4491" data-size="0"><span data-position="4493" data-size="21">Knowledge Integration</span></strong></p>
<ul data-position="4520" data-size="0">
<li class="" data-startline="65" data-endline="65" data-position="4522" data-size="0"><span data-position="4522" data-size="32">Feed lessons back into discovery</span></li>
<li class="" data-startline="66" data-endline="66" data-position="4560" data-size="0"><span data-position="4560" data-size="35">Apply learned patterns in execution</span></li>
<li class="" data-startline="67" data-endline="68" data-position="4601" data-size="0"><span data-position="4601" data-size="29">Build reusable knowledge base</span></li>
</ul>
<p data-position="4632" data-size="0"><span data-position="4635" data-size="348">The lessons learnt document isn&#8217;t just a one-time fix &#8211; it becomes part of the automation&#8217;s knowledge base. Future test cases can reference these lessons, avoiding the same failures. Over time, you build a comprehensive understanding of your application&#8217;s quirks and complexities. This is organizational learning embedded in your automation system.</span></p>
</li>
</ol>
<p class="part" data-startline="71" data-endline="71" data-position="4985" data-size="0"><strong data-position="4985" data-size="0"><span data-position="4987" data-size="27">The Four Commands Enhanced:</span></strong></p>
<p class="part" data-startline="73" data-endline="73" data-position="5018" data-size="0"><span data-position="5018" data-size="130">Building on the Test Automation Compiler from Experiment #4, I&#8217;m using the same four commands but with lessons learnt integration:</span></p>
<ul class="part" data-startline="75" data-endline="79" data-position="5150" data-size="0">
<li class="raw" data-startline="75" data-endline="75" data-position="5152" data-size="0"><code data-position="5153" data-size="9">/discover</code><span data-position="5163" data-size="61"> &#8211; Discovery execution (now accepts lessons learnt documents)</span></li>
<li class="raw" data-startline="76" data-endline="76" data-position="5227" data-size="0"><code data-position="5228" data-size="6">/learn</code><span data-position="5235" data-size="53"> &#8211; Extract automation patterns (incorporates lessons)</span></li>
<li class="raw" data-startline="77" data-endline="77" data-position="5291" data-size="0"><code data-position="5292" data-size="9">/generate</code><span data-position="5302" data-size="60"> &#8211; Create YAML from learnings (uses lesson-based strategies)</span></li>
<li class="raw" data-startline="78" data-endline="79" data-position="5365" data-size="0"><code data-position="5366" data-size="9">/validate</code><span data-position="5376" data-size="55"> &#8211; Validation execution (confirms lesson effectiveness)</span></li>
</ul>
<hr />
<h2 class="part" data-startline="82" data-endline="82" id="The-Experiment" data-id="The-Experiment"><a class="anchor hidden-xs" href="#The-Experiment" title="The-Experiment" data-size="14" data-position="5441" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5441" data-size="14">The Experiment</span></h2>
<p class="part" data-startline="84" data-endline="84" data-position="5457" data-size="0"><span data-position="5457" data-size="136">I took an AG Grid test case through the complete learning loop process &#8211; expecting failure, researching solutions, and applying lessons.</span></p>
<h3 class="part" data-startline="86" data-endline="86" id="Step-1-The-Expected-Failure" data-id="Step-1-The-Expected-Failure"><a class="anchor hidden-xs" href="#Step-1-The-Expected-Failure" title="Step-1-The-Expected-Failure" data-size="28" data-position="5599" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5599" data-size="28">Step 1: The Expected Failure</span></h3>
<p class="part" data-startline="88" data-endline="88" data-position="5629" data-size="0"><strong data-position="5629" data-size="0"><span data-position="5631" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper" data-startline="89" data-endline="91" data-infoprefix-length="0" data-position="5647">
<pre><code>/discover TestManagement\test-cases\TC-002-aggrid-column-management-and-row-grouping.md
</code></pre>
</div>
<p class="part" data-startline="93" data-endline="93" data-position="5744" data-size="0"><strong data-position="5744" data-size="0"><span data-position="5746" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="95" data-endline="95" data-position="5764" data-size="0"><span data-position="5764" data-size="252">Claude Code attempted to execute the test case using standard Chrome DevTools MCP approaches. The test involved dragging column headers into the row grouping panel &#8211; a seemingly simple interaction that&#8217;s actually one of AG Grid&#8217;s most complex features.</span></p>
<p class="part" data-startline="97" data-endline="97" data-position="6018" data-size="0"><span data-position="6018" data-size="29">The discovery phase captured:</span></p>
<ul class="part" data-startline="98" data-endline="102" data-position="6048" data-size="0">
<li class="raw" data-startline="98" data-endline="98" data-position="6050" data-size="0"><span data-position="6050" data-size="44">Successful navigation to the AG Grid example</span></li>
<li class="raw" data-startline="99" data-endline="99" data-position="6097" data-size="0"><span data-position="6097" data-size="40">Correct identification of column headers</span></li>
<li class="raw" data-startline="100" data-endline="100" data-position="6140" data-size="0"><span data-position="6140" data-size="36">Successful initiation of drag events</span></li>
<li class="raw" data-startline="101" data-endline="102" data-position="6179" data-size="0"><strong data-position="6179" data-size="0"><span data-position="6181" data-size="35">Complete failure on the drop action</span></strong></li>
</ul>
<p class="part" data-startline="103" data-endline="103" data-position="6220" data-size="0"><span data-position="6220" data-size="124">&#8220;It&#8217;s not behaving in the way our AI agent was expecting. It&#8217;s a non-standard implementation of the drag and drop components</span><span class="smartypants" data-position="6344" data-size="3">…</span><span data-position="6347" data-size="42"> It can drag, but it can&#8217;t actually drop.&#8221;</span></p>
<p class="part" data-startline="105" data-endline="105" data-position="6391" data-size="0"><span data-position="6391" data-size="402">This wasn&#8217;t a surprise &#8211; I specifically chose AG Grid because I knew it would fail. AG Grid uses a custom drag-and-drop implementation that doesn&#8217;t respond to standard browser events. The drag appears to work visually, but the drop zone doesn&#8217;t accept the element. This is exactly the kind of complex scenario that makes automation engineers either write custom JavaScript handlers or give up entirely.</span></p>
<p class="part" data-startline="107" data-endline="107" data-position="6795" data-size="0"><span data-position="6795" data-size="45">The key insight here is that the failure was </span><strong data-position="6840" data-size="0"><span data-position="6842" data-size="11">informative</span></strong><span data-position="6856" data-size="85">. We learned exactly what doesn&#8217;t work and why &#8211; setting up the next phase perfectly.</span></p>
<hr />
<h3 class="part" data-startline="111" data-endline="111" id="Step-2-Ultra-Thinking-Research" data-id="Step-2-Ultra-Thinking-Research"><a class="anchor hidden-xs" href="#Step-2-Ultra-Thinking-Research" title="Step-2-Ultra-Thinking-Research" data-size="31" data-position="6951" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="6951" data-size="31">Step 2: Ultra-Thinking Research</span></h3>
<p class="part" data-startline="113" data-endline="113" data-position="6984" data-size="0"><strong data-position="6984" data-size="0"><span data-position="6986" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper" data-startline="114" data-endline="118" data-infoprefix-length="0" data-position="7002">
<pre><code>please can you examine why this drag-and-drop for the row grouping didn't work,
ultrathink and come up with solutions. Please write these solutions to the
file aggrid-lessons-learnt.md
</code></pre>
</div>
<p class="part" data-startline="120" data-endline="120" data-position="7196" data-size="0"><strong data-position="7196" data-size="0"><span data-position="7198" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="122" data-endline="122" data-position="7216" data-size="0"><span data-position="7216" data-size="178">Claude Code spent five minutes in deep research mode. This wasn&#8217;t just error analysis &#8211; it was comprehensive investigation into AG Grid&#8217;s architecture and implementation choices.</span></p>
<p class="part" data-startline="124" data-endline="124" data-position="7396" data-size="0"><span data-position="7396" data-size="36">The ultra-thinking phase discovered:</span></p>
<ul class="part" data-startline="125" data-endline="129" data-position="7433" data-size="0">
<li class="raw" data-startline="125" data-endline="125" data-position="7435" data-size="0"><strong data-position="7435" data-size="0"><span data-position="7437" data-size="10">Root Cause</span></strong><span data-position="7450" data-size="53">: AG Grid doesn&#8217;t use native HTML5 drag-and-drop APIs</span></li>
<li class="raw" data-startline="126" data-endline="126" data-position="7505" data-size="0"><strong data-position="7505" data-size="0"><span data-position="7507" data-size="14">Implementation</span></strong><span data-position="7524" data-size="45">: Custom event handling with synthetic events</span></li>
<li class="raw" data-startline="127" data-endline="127" data-position="7571" data-size="0"><strong data-position="7571" data-size="0"><span data-position="7573" data-size="10">Complexity</span></strong><span data-position="7586" data-size="57">: Multiple ambiguous drop zones with custom hit detection</span></li>
<li class="raw" data-startline="128" data-endline="129" data-position="7645" data-size="0"><strong data-position="7645" data-size="0"><span data-position="7647" data-size="14">Event Sequence</span></strong><span data-position="7664" data-size="73">: Specific order of mouse events required that standard automation misses</span></li>
</ul>
<p class="part" data-startline="130" data-endline="130" data-position="7738" data-size="0"><span data-position="7738" data-size="72">The research went deeper, analyzing AG Grid&#8217;s documentation and finding:</span></p>
<ul class="part" data-startline="131" data-endline="135" data-position="7811" data-size="0">
<li class="raw" data-startline="131" data-endline="131" data-position="7813" data-size="0"><span data-position="7813" data-size="61">The grid exposes a comprehensive API for programmatic control</span></li>
<li class="raw" data-startline="132" data-endline="132" data-position="7877" data-size="0"><span data-position="7877" data-size="50">Column state can be managed without UI interaction</span></li>
<li class="raw" data-startline="133" data-endline="133" data-position="7930" data-size="0"><span data-position="7930" data-size="36">Row grouping can be applied through </span><code data-position="7967" data-size="18">applyColumnState()</code><span data-position="7986" data-size="7"> method</span></li>
<li class="raw" data-startline="134" data-endline="135" data-position="7996" data-size="0"><span data-position="7996" data-size="61">The API approach is actually more reliable than UI automation</span></li>
</ul>
<p class="part" data-startline="136" data-endline="136" data-position="8059" data-size="0"><span data-position="8059" data-size="60">The output was a comprehensive lessons learnt document with:</span></p>
<ol class="part" data-startline="137" data-endline="142" data-position="8120" data-size="0">
<li class="raw" data-startline="137" data-endline="137" data-position="8123" data-size="0"><strong data-position="8123" data-size="0"><span data-position="8125" data-size="20">Detailed explanation</span></strong><span data-position="8147" data-size="32"> of why standard approaches fail</span></li>
<li class="raw" data-startline="138" data-endline="138" data-position="8183" data-size="0"><strong data-position="8183" data-size="0"><span data-position="8185" data-size="28">Multiple solution strategies</span></strong><span data-position="8215" data-size="22"> ranked by reliability</span></li>
<li class="raw" data-startline="139" data-endline="139" data-position="8241" data-size="0"><strong data-position="8241" data-size="0"><span data-position="8243" data-size="13">Code examples</span></strong><span data-position="8258" data-size="25"> for API-based approaches</span></li>
<li class="raw" data-startline="140" data-endline="140" data-position="8287" data-size="0"><strong data-position="8287" data-size="0"><span data-position="8289" data-size="19">Fallback strategies</span></strong><span data-position="8310" data-size="23"> if API isn&#8217;t available</span></li>
<li class="raw" data-startline="141" data-endline="142" data-position="8337" data-size="0"><strong data-position="8337" data-size="0"><span data-position="8339" data-size="21">Timing considerations</span></strong><span data-position="8362" data-size="33"> for animations and state changes</span></li>
</ol>
<p class="part" data-startline="143" data-endline="143" data-position="8397" data-size="0"><span data-position="8397" data-size="342">This research phase is transformative. Instead of blindly trying different selectors or timing strategies (the traditional debugging approach), we&#8217;re building understanding of the underlying system. The lessons learnt document isn&#8217;t just a workaround &#8211; it&#8217;s a knowledge artifact that captures expert-level understanding of AG Grid automation.</span></p>
<hr class="" />
<h3 class="part" data-startline="147" data-endline="147" id="Step-3-The-Informed-Second-Attempt" data-id="Step-3-The-Informed-Second-Attempt"><a class="anchor hidden-xs" href="#Step-3-The-Informed-Second-Attempt" title="Step-3-The-Informed-Second-Attempt" data-size="35" data-position="8750" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="8750" data-size="35">Step 3: The Informed Second Attempt</span></h3>
<p class="part" data-startline="149" data-endline="149" data-position="8787" data-size="0"><strong data-position="8787" data-size="0"><span data-position="8789" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper" data-startline="150" data-endline="153" data-infoprefix-length="0" data-position="8805">
<pre><code>/discover TestManagement\test-cases\TC-002-aggrid-column-management-and-row-grouping.md
          aggrid-lessons-learnt.md
</code></pre>
</div>
<p class="part" data-startline="155" data-endline="155" data-position="8937" data-size="0"><strong data-position="8937" data-size="0"><span data-position="8939" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="157" data-endline="157" data-position="8957" data-size="0"><span data-position="8957" data-size="167">I completely cleared the context &#8211; this was a fresh start with no memory of the previous failure. The only difference was the inclusion of the lessons learnt document.</span></p>
<p class="part" data-startline="159" data-endline="159" data-position="9126" data-size="0"><span data-position="9126" data-size="50">This second discovery run was radically different:</span></p>
<ul class="part" data-startline="160" data-endline="165" data-position="9177" data-size="0">
<li class="raw" data-startline="160" data-endline="160" data-position="9179" data-size="0"><span data-position="9179" data-size="59">Identified AG Grid&#8217;s API access pattern through React Fiber</span></li>
<li class="raw" data-startline="161" data-endline="161" data-position="9241" data-size="0"><span data-position="9241" data-size="5">Used </span><code data-position="9247" data-size="26">gridApi.applyColumnState()</code><span data-position="9274" data-size="25"> instead of drag-and-drop</span></li>
<li class="raw" data-startline="162" data-endline="162" data-position="9302" data-size="0"><span data-position="9302" data-size="53">Applied row grouping programmatically in milliseconds</span></li>
<li class="raw" data-startline="163" data-endline="163" data-position="9358" data-size="0"><span data-position="9358" data-size="33">Verified the UI updated correctly</span></li>
<li class="raw" data-startline="164" data-endline="165" data-position="9394" data-size="0"><span data-position="9394" data-size="28">Expanded grouped rows using </span><code data-position="9423" data-size="22">node.setExpanded(true)</code></li>
</ul>
<p class="part" data-startline="166" data-endline="166" data-position="9448" data-size="0"><span data-position="9448" data-size="110">&#8220;It&#8217;s been through all of the test steps. It says that it matches exactly what was expected in the test case.&#8221;</span></p>
<p class="part" data-startline="168" data-endline="168" data-position="9560" data-size="0"><span data-position="9560" data-size="399">The transformation was impressive. What failed completely in the first attempt now executing flawlessly. The drag-and-drop interaction that would have taken complex custom code was replaced with a simple API call. The visual result was identical &#8211; the Country column appeared in the row groups panel, the data reorganized into groups, and the Belgium group expanded to show Isabella Kingston&#8217;s data.</span></p>
<p class="part" data-startline="170" data-endline="170" data-position="9961" data-size="0"><span data-position="9961" data-size="30">But here&#8217;s the crucial point: </span><strong data-position="9991" data-size="0"><span data-position="9993" data-size="27">the test case didn&#8217;t change</span></strong><span data-position="10023" data-size="194">. The markdown still described dragging and dropping. The AI learned to interpret &#8220;drag Country to row groups&#8221; as &#8220;apply row grouping by Country&#8221; and implement it the most reliable way possible.</span></p>
<p class="part" data-startline="172" data-endline="172" data-position="10218" data-size="0"><span data-position="10218" data-size="25">That&#8217;s pretty impressive!</span></p>
<hr class="" />
<h3 class="part" data-startline="176" data-endline="176" id="Step-4-Complete-the-4-Phase-Workflow" data-id="Step-4-Complete-the-4-Phase-Workflow"><a class="anchor hidden-xs" href="#Step-4-Complete-the-4-Phase-Workflow" title="Step-4-Complete-the-4-Phase-Workflow" data-size="37" data-position="10254" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="10254" data-size="37">Step 4: Complete the 4-Phase Workflow</span></h3>
<p class="part" data-startline="178" data-endline="178" data-position="10293" data-size="0"><strong data-position="10293" data-size="0"><span data-position="10295" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper" data-startline="180" data-endline="182" data-infoprefix-length="0" data-position="10312">
<pre><code>/learn TestManagement\discoveries\TC-002-discovery-log.json aggrid-lessons-learnt.md
</code></pre>
</div>
<p class="part" data-startline="184" data-endline="184" data-position="10406" data-size="0"><span data-position="10406" data-size="37">Then generate the YAML specification:</span></p>
<div class="part code-block-wrapper" data-startline="185" data-endline="189" data-infoprefix-length="0" data-position="10444">
<pre><code>/generate TestManagement\learnings\TC-002-learnings.json
          TestManagement\test-cases\TC-002-aggrid-column-management-and-row-grouping.md
          aggrid-lessons-learnt.md
</code></pre>
</div>
<p class="part" data-startline="191" data-endline="191" data-position="10633" data-size="0"><span data-position="10633" data-size="42">Finally, validate the compiled automation:</span></p>
<div class="part code-block-wrapper" data-startline="192" data-endline="194" data-infoprefix-length="0" data-position="10676">
<pre><code>/validate TestManagement\specs\TC-002-test-spec.yaml
</code></pre>
</div>
<p class="part" data-startline="196" data-endline="196" data-position="10738" data-size="0"><strong data-position="10738" data-size="0"><span data-position="10740" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="198" data-endline="198" data-position="10758" data-size="0"><span data-position="10758" data-size="122">The complete 4-phase workflow (Discover → Learn → Generate → Validate) now incorporated the lessons learnt at every stage:</span></p>
<p class="part" data-startline="200" data-endline="201" data-position="10882" data-size="0"><strong data-position="10882" data-size="0"><span data-position="10884" data-size="29">Learning Extraction Enhanced:</span></strong><br />
<span data-position="10916" data-size="4">The </span><code data-position="10921" data-size="6">/learn</code><span data-position="10928" data-size="458"> command didn&#8217;t just extract patterns from the discovery log &#8211; it cross-referenced them with the lessons learnt document. It understood that certain UI interactions should be replaced with API calls. It learned that timing for AG Grid animations needs special handling. It identified which selectors were reliable and which were fragile. The output wasn&#8217;t just a pattern list &#8211; it was an intelligent synthesis of discovered behavior and documented solutions.</span></p>
<p class="part" data-startline="203" data-endline="204" data-position="11388" data-size="0"><strong data-position="11388" data-size="0"><span data-position="11390" data-size="28">YAML Generation Transformed:</span></strong><br />
<span data-position="11421" data-size="4">The </span><code data-position="11426" data-size="9">/generate</code><span data-position="11436" data-size="245"> command produced a radically different YAML specification than it would have without the lessons. Instead of drag-and-drop instructions, it contained API calls. Instead of complex event sequences, it had simple state changes. The YAML included:</span></p>
<ul class="part" data-startline="205" data-endline="210" data-position="11682" data-size="0">
<li class="raw" data-startline="205" data-endline="205" data-position="11684" data-size="0"><span data-position="11684" data-size="39">API access patterns through React Fiber</span></li>
<li class="raw" data-startline="206" data-endline="206" data-position="11726" data-size="0"><span data-position="11726" data-size="36">Programmatic column state management</span></li>
<li class="raw" data-startline="207" data-endline="207" data-position="11765" data-size="0"><span data-position="11765" data-size="42">Direct node manipulation for row expansion</span></li>
<li class="raw" data-startline="208" data-endline="208" data-position="11810" data-size="0"><span data-position="11810" data-size="45">Optimized timing based on measured animations</span></li>
<li class="raw" data-startline="209" data-endline="210" data-position="11858" data-size="0"><span data-position="11858" data-size="43">Fallback strategies for unreliable elements</span></li>
</ul>
<p class="part" data-startline="211" data-endline="212" data-position="11903" data-size="0"><strong data-position="11903" data-size="0"><span data-position="11905" data-size="19">Validation Results:</span></strong><br />
<span data-position="11927" data-size="71">The validation phase confirmed that our learning loop worked perfectly:</span></p>
<div class="part code-block-wrapper" data-startline="214" data-endline="230" data-infoprefix-length="0" data-position="12000">
<pre><code>&#x2705; Validation Complete - TC-002 PASSED

Outcome: &#x2705; PASS (13/13 steps successful)

&#x1f4ca; Key Metrics
| Metric                  | Result                        |
|-------------------------|-------------------------------|
| Total Steps             | 13 (Setup: 3, Test Steps: 10) |
| Successful Steps        | 13                            |
| Failed Steps            | 0                             |
| Assertions Passed       | 4/4                           |
| Deterministic Execution | &#x2705; YES                         |
| Spec Followed Exactly   | &#x2705; YES                         |
| Fallbacks Used          | &#x274c; NONE                        |
| Improvisation           | &#x274c; NONE                        |
</code></pre>
</div>
<p class="part" data-startline="232" data-endline="232" data-position="12705" data-size="0"><span data-position="12705" data-size="19">The validation was </span><strong data-position="12724" data-size="0"><span data-position="12726" data-size="13">twice as fast</span></strong><span data-position="12741" data-size="230"> as discovery because it executed deterministically without exploration. Every step passed on the first attempt. No fallbacks were needed. The API approach was not just a workaround &#8211; it was demonstrably superior to UI automation.</span></p>
<p class="part" data-startline="234" data-endline="235" data-position="12973" data-size="0"><strong data-position="12973" data-size="0"><span data-position="12975" data-size="32">The Run Twice Pattern Validated:</span></strong><br />
<span data-position="13010" data-size="100">Both the discovery run (with lessons) and the validation run produced identical functional outcomes:</span></p>
<ul class="part" data-startline="236" data-endline="240" data-position="13111" data-size="0">
<li class="raw" data-startline="236" data-endline="236" data-position="13113" data-size="0"><span data-position="13113" data-size="24">Belgium group expanded <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></li>
<li class="raw" data-startline="237" data-endline="237" data-position="13140" data-size="0"><span data-position="13140" data-size="44">Isabella Kingston data visible and correct <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></li>
<li class="raw" data-startline="238" data-endline="238" data-position="13187" data-size="0"><span data-position="13187" data-size="27">20 country groups created <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></li>
<li class="raw" data-startline="239" data-endline="240" data-position="13217" data-size="0"><span data-position="13217" data-size="32">Row grouping by Country active <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></li>
</ul>
<p class="part" data-startline="241" data-endline="241" data-position="13251" data-size="0"><span data-position="13251" data-size="176">This proves the YAML specification successfully captured ALL automation knowledge, including the lessons learnt. The compilation from markdown to YAML was complete and correct.</span></p>
<hr />
<h2 class="part" data-startline="245" data-endline="245" id="Patterns-I-Noticed" data-id="Patterns-I-Noticed"><a class="anchor hidden-xs" href="#Patterns-I-Noticed" title="Patterns-I-Noticed" data-size="18" data-position="13437" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="13437" data-size="18">Patterns I Noticed</span></h2>
<p class="part" data-startline="247" data-endline="247" data-position="13457" data-size="0"><span data-position="13457" data-size="116">After watching this 4-phase workflow (Discover → Learn → Generate → Validate) complete, some clear patterns emerged:</span></p>
<p class="part" data-startline="249" data-endline="249" data-position="13575" data-size="0"><strong data-position="13575" data-size="0"><span data-position="13577" data-size="15">Works well for:</span></strong></p>
<ul class="part" data-startline="250" data-endline="255" data-position="13595" data-size="0">
<li class="raw" data-startline="250" data-endline="250" data-position="13597" data-size="0"><span data-position="13597" data-size="48">Complex UI components that have API alternatives</span></li>
<li class="raw" data-startline="251" data-endline="251" data-position="13648" data-size="0"><span data-position="13648" data-size="64">Applications where standard automation approaches fail initially</span></li>
<li class="raw" data-startline="252" data-endline="252" data-position="13715" data-size="0"><span data-position="13715" data-size="83">Building reusable knowledge bases for specific frameworks (AG Grid, Kendo UI, etc.)</span></li>
<li class="raw" data-startline="253" data-endline="253" data-position="13801" data-size="0"><span data-position="13801" data-size="75">Scenarios where you need to &#8220;teach&#8221; the automation about application quirks</span></li>
<li class="raw" data-startline="254" data-endline="255" data-position="13879" data-size="0"><span data-position="13879" data-size="64">Catching up on technical debt where automation has been deferred</span></li>
</ul>
<p class="part" data-startline="256" data-endline="256" data-position="13945" data-size="0"><strong data-position="13945" data-size="0"><span data-position="13947" data-size="16">Gets messy with:</span></strong></p>
<ul class="part" data-startline="257" data-endline="259" data-position="13966" data-size="0">
<li class="raw" data-startline="257" data-endline="257" data-position="13968" data-size="0"><span data-position="13968" data-size="63">Applications without good API access (purely visual interfaces)</span></li>
<li class="raw" data-startline="258" data-endline="259" data-position="14034" data-size="0"><span data-position="14034" data-size="71">Scenarios where the UI approach is the only way to test user experience</span></li>
</ul>
<p class="part" data-startline="260" data-endline="260" data-position="14107" data-size="0"><strong data-position="14107" data-size="0"><span data-position="14109" data-size="10">Surprises:</span></strong></p>
<ul class="part" data-startline="261" data-endline="266" data-position="14122" data-size="0">
<li class="raw" data-startline="261" data-endline="261" data-position="14124" data-size="0"><span data-position="14124" data-size="76">The ultra-thinking capability produced genuinely useful, actionable research</span></li>
<li class="raw" data-startline="262" data-endline="262" data-position="14203" data-size="0"><span data-position="14203" data-size="71">The lessons learnt document was comprehensive enough to use immediately</span></li>
<li class="raw" data-startline="263" data-endline="263" data-position="14277" data-size="0"><span data-position="14277" data-size="58">Validation was 2x faster than discovery (530ms vs 1,127ms)</span></li>
<li class="raw" data-startline="264" data-endline="264" data-position="14338" data-size="0"><span data-position="14338" data-size="62">The API approach was actually MORE reliable than UI automation</span></li>
<li class="raw" data-startline="265" data-endline="266" data-position="14403" data-size="0"><span data-position="14403" data-size="66">The YAML specification captured ALL automation knowledge perfectly</span></li>
</ul>
<hr />
<h2 class="part" data-startline="269" data-endline="269" id="The-Honest-Take" data-id="The-Honest-Take"><a class="anchor hidden-xs" href="#The-Honest-Take" title="The-Honest-Take" data-size="15" data-position="14479" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="14479" data-size="15">The Honest Take</span></h2>
<p class="part" data-startline="271" data-endline="272" data-position="14496" data-size="0"><strong data-position="14496" data-size="0"><span data-position="14498" data-size="16"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick Verdict:</span></strong><br />
<span data-position="14517" data-size="91"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> GREEN: &#8220;I&#8217;m going to start using this in production&#8221; &#8211; for catching up on technical debt</span></p>
<p class="part" data-startline="274" data-endline="274" data-position="14610" data-size="0"><strong data-position="14610" data-size="0"><span data-position="14612" data-size="9">The Good:</span></strong></p>
<ul class="part" data-startline="275" data-endline="282" data-position="14624" data-size="0">
<li class="raw" data-startline="275" data-endline="275" data-position="14626" data-size="0"><strong data-position="14626" data-size="0"><span data-position="14628" data-size="23">Self-healing automation</span></strong><span data-position="14654" data-size="50">: Tests that learn from failure and fix themselves</span></li>
<li class="raw" data-startline="276" data-endline="276" data-position="14706" data-size="0"><strong data-position="14706" data-size="0"><span data-position="14708" data-size="22">Knowledge preservation</span></strong><span data-position="14733" data-size="63">: Lessons learnt documents capture expert knowledge permanently</span></li>
<li class="raw" data-startline="277" data-endline="277" data-position="14798" data-size="0"><strong data-position="14798" data-size="0"><span data-position="14800" data-size="17">Speed improvement</span></strong><span data-position="14820" data-size="55">: 2x faster execution after learning (530ms vs 1,127ms)</span></li>
<li class="raw" data-startline="278" data-endline="278" data-position="14877" data-size="0"><strong data-position="14877" data-size="0"><span data-position="14879" data-size="17">Reliability boost</span></strong><span data-position="14899" data-size="45">: API approach more stable than UI automation</span></li>
<li class="raw" data-startline="279" data-endline="279" data-position="14946" data-size="0"><strong data-position="14946" data-size="0"><span data-position="14948" data-size="18">Reusable solutions</span></strong><span data-position="14969" data-size="41">: Lessons apply to all similar test cases</span></li>
<li class="raw" data-startline="280" data-endline="280" data-position="15012" data-size="0"><strong data-position="15012" data-size="0"><span data-position="15014" data-size="18">Systematic process</span></strong><span data-position="15035" data-size="50">: Clear fail → research → learn → succeed workflow</span></li>
<li class="raw" data-startline="281" data-endline="282" data-position="15087" data-size="0"><strong data-position="15087" data-size="0"><span data-position="15089" data-size="16">Production-ready</span></strong><span data-position="15108" data-size="50">: 13/13 steps passing with deterministic execution</span></li>
</ul>
<p class="part" data-startline="283" data-endline="283" data-position="15159" data-size="0"><strong data-position="15159" data-size="0"><span data-position="15161" data-size="13">The Concerns:</span></strong></p>
<ul class="part" data-startline="284" data-endline="288" data-position="15177" data-size="0">
<li class="raw" data-startline="284" data-endline="284" data-position="15179" data-size="0"><strong data-position="15179" data-size="0"><span data-position="15181" data-size="17">API vs UI testing</span></strong><span data-position="15201" data-size="62">: The API approach doesn&#8217;t test exactly what the end user uses</span></li>
<li class="raw" data-startline="285" data-endline="285" data-position="15266" data-size="0"><strong data-position="15266" data-size="0"><span data-position="15268" data-size="13">Research time</span></strong><span data-position="15284" data-size="88">: Ultra-thinking takes 5+ minutes per complex problem (that&#8217;s quicker than me doing it!)</span></li>
<li class="raw" data-startline="286" data-endline="286" data-position="15374" data-size="0"><strong data-position="15374" data-size="0"><span data-position="15376" data-size="18">Framework-specific</span></strong><span data-position="15397" data-size="64">: Lessons are tied to specific frameworks (AG Grid, Kendo, etc.)</span></li>
<li class="raw" data-startline="287" data-endline="288" data-position="15463" data-size="0"><strong data-position="15463" data-size="0"><span data-position="15465" data-size="13">Not universal</span></strong><span data-position="15481" data-size="72">: Only works when alternative approaches exist (API, keyboard nav, etc.)</span></li>
</ul>
<p class="part" data-startline="289" data-endline="290" data-position="15554" data-size="0"><strong data-position="15554" data-size="0"><span data-position="15556" data-size="17">Would I use this?</span></strong><br />
<span data-position="15576" data-size="266">Absolutely. I&#8217;m already planning to scale this up for production use. The ability to fail, learn, and succeed systematically is transformative for complex test automation. This isn&#8217;t just a clever experiment &#8211; it&#8217;s a practical solution to real problems I face daily.</span></p>
<p class="part" data-startline="292" data-endline="292" data-position="15844" data-size="0"><span data-position="15844" data-size="36">Here&#8217;s where I&#8217;d use it immediately:</span></p>
<ul class="part" data-startline="293" data-endline="298" data-position="15881" data-size="0">
<li class="" data-startline="293" data-endline="293" data-position="15883" data-size="0"><strong data-position="15883" data-size="0"><span data-position="15885" data-size="29">Legacy application automation</span></strong><span data-position="15916" data-size="38"> where standard approaches have failed</span></li>
<li class="" data-startline="294" data-endline="294" data-position="15957" data-size="0"><strong data-position="15957" data-size="0"><span data-position="15959" data-size="21">Complex UI frameworks</span></strong><span data-position="15982" data-size="62"> (AG Grid, Kendo UI, DevExpress) that defeat simple automation</span></li>
<li class="" data-startline="295" data-endline="295" data-position="16047" data-size="0"><strong data-position="16047" data-size="0"><span data-position="16049" data-size="23">Technical debt catch-up</span></strong><span data-position="16074" data-size="47"> &#8211; finally automate those &#8220;too hard&#8221; test cases</span></li>
<li class="" data-startline="296" data-endline="296" data-position="16124" data-size="0"><strong data-position="16124" data-size="0"><span data-position="16126" data-size="23">Knowledge base building</span></strong><span data-position="16151" data-size="50"> &#8211; create a library of lessons for the entire team</span></li>
<li class="" data-startline="297" data-endline="298" data-position="16204" data-size="0"><strong data-position="16204" data-size="0"><span data-position="16206" data-size="23">Onboarding acceleration</span></strong><span data-position="16231" data-size="60"> &#8211; new team members inherit accumulated automation knowledge</span></li>
</ul>
<p class="part" data-startline="299" data-endline="300" data-position="16293" data-size="0"><strong data-position="16293" data-size="0"><span data-position="16295" data-size="24">When would I NOT use it?</span></strong><br />
<span data-position="16322" data-size="44">There are clear boundaries to this approach:</span></p>
<ul class="part" data-startline="301" data-endline="305" data-position="16367" data-size="0">
<li class="" data-startline="301" data-endline="301" data-position="16369" data-size="0"><strong data-position="16369" data-size="0"><span data-position="16371" data-size="18">Pure UI validation</span></strong><span data-position="16391" data-size="66"> &#8211; when you must test exact user interactions, not API equivalents</span></li>
<li class="" data-startline="302" data-endline="302" data-position="16460" data-size="0"><strong data-position="16460" data-size="0"><span data-position="16462" data-size="19">Simple applications</span></strong><span data-position="16483" data-size="55"> &#8211; overhead isn&#8217;t justified for basic forms and buttons</span></li>
<li class="" data-startline="303" data-endline="303" data-position="16541" data-size="0"><strong data-position="16541" data-size="0"><span data-position="16543" data-size="25">Visual regression testing</span></strong><span data-position="16570" data-size="49"> &#8211; pixel-perfect validation needs different tools</span></li>
<li class="" data-startline="304" data-endline="305" data-position="16622" data-size="0"><strong data-position="16622" data-size="0"><span data-position="16624" data-size="13">One-off tests</span></strong><span data-position="16639" data-size="63"> &#8211; the learning investment doesn&#8217;t pay off for single-use cases</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="308" data-endline="308" id="Still-Curious-About" data-id="Still-Curious-About"><a class="anchor hidden-xs" href="#Still-Curious-About" title="Still-Curious-About" data-size="19" data-position="16712" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="16712" data-size="19">Still Curious About</span></h2>
<p class="part" data-startline="310" data-endline="310" data-position="16733" data-size="0"><span data-position="16733" data-size="53">What I&#8217;m still curious about and want to test further</span><span class="smartypants" data-position="16786" data-size="3">…</span></p>
<ul class="part" data-startline="312" data-endline="317" data-position="16791" data-size="0">
<li class="" data-startline="312" data-endline="312" data-position="16793" data-size="0"><strong data-position="16793" data-size="0"><span data-position="16795" data-size="26">Shared knowledge libraries</span></strong><span data-position="16824" data-size="184">: Can we build a centralized repository of lessons learnt that multiple teams can contribute to and benefit from? Imagine a GitHub repo of automation lessons for every major framework.</span></li>
<li class="" data-startline="313" data-endline="313" data-position="17010" data-size="0"><strong data-position="17010" data-size="0"><span data-position="17012" data-size="24">Other complex frameworks</span></strong><span data-position="17039" data-size="172">: Would this pattern work with Kendo UI, DevExpress, Telerik, or other notoriously difficult frameworks? Each has its own quirks that might benefit from documented lessons.</span></li>
<li class="" data-startline="314" data-endline="314" data-position="17213" data-size="0"><strong data-position="17213" data-size="0"><span data-position="17215" data-size="17">Lessons evolution</span></strong><span data-position="17235" data-size="145">: How many test cases need to fail and be fixed before the lessons document becomes truly comprehensive? Is there a point of diminishing returns?</span></li>
<li class="" data-startline="315" data-endline="315" data-position="17382" data-size="0"><strong data-position="17382" data-size="0"><span data-position="17384" data-size="26">Playwright MCP integration</span></strong><span data-position="17413" data-size="169">: Could we swap in Playwright MCP instead of Chrome DevTools for cross-browser testing? That would open up Firefox and Safari automation with the same learning approach.</span></li>
<li class="" data-startline="316" data-endline="317" data-position="17584" data-size="0"><strong data-position="17584" data-size="0"><span data-position="17586" data-size="18">Lessons versioning</span></strong><span data-position="17607" data-size="116">: How do we handle framework updates that invalidate lessons? Can we version lessons alongside application versions?</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="320" data-endline="320" id="The-Main-Lesson" data-id="The-Main-Lesson"><a class="anchor hidden-xs" href="#The-Main-Lesson" title="The-Main-Lesson" data-size="15" data-position="17732" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="17732" data-size="15">The Main Lesson</span></h2>
<p class="part" data-startline="322" data-endline="322" data-position="17749" data-size="0"><strong data-position="17749" data-size="0"><span data-position="17751" data-size="107">The Lessons Learnt Loop isn&#8217;t just error recovery &#8211; it&#8217;s systematic knowledge building for test automation.</span></strong></p>
<p class="part" data-startline="324" data-endline="324" data-position="17862" data-size="0"><span data-position="17862" data-size="142">Traditional automation fails and stays failed. This approach fails, learns why, documents solutions, and succeeds. The difference is profound:</span></p>
<ol class="part" data-startline="326" data-endline="331" data-position="18006" data-size="0">
<li class="" data-startline="326" data-endline="326" data-position="18009" data-size="0"><strong data-position="18009" data-size="0"><span data-position="18011" data-size="24">Failure becomes valuable</span></strong><span data-position="18038" data-size="64">: Each failure generates knowledge that prevents future failures</span></li>
<li class="" data-startline="327" data-endline="327" data-position="18105" data-size="0"><strong data-position="18105" data-size="0"><span data-position="18107" data-size="18">Knowledge persists</span></strong><span data-position="18128" data-size="62">: Solutions are documented, not trapped in one engineer&#8217;s head</span></li>
<li class="" data-startline="328" data-endline="328" data-position="18193" data-size="0"><strong data-position="18193" data-size="0"><span data-position="18195" data-size="29">Complexity becomes manageable</span></strong><span data-position="18227" data-size="66">: Even AG Grid&#8217;s notorious drag-and-drop can be automated reliably</span></li>
<li class="" data-startline="329" data-endline="329" data-position="18296" data-size="0"><strong data-position="18296" data-size="0"><span data-position="18298" data-size="18">Teams scale better</span></strong><span data-position="18319" data-size="54">: Junior engineers inherit senior engineers&#8217; solutions</span></li>
<li class="" data-startline="330" data-endline="331" data-position="18376" data-size="0"><strong data-position="18376" data-size="0"><span data-position="18378" data-size="22">Maintenance simplifies</span></strong><span data-position="18403" data-size="65">: When something breaks, check if there&#8217;s already a lesson for it</span></li>
</ol>
<p class="part" data-startline="332" data-endline="332" data-position="18469" data-size="0"><span data-position="18469" data-size="391">The pattern demonstrated here &#8211; fail → research → document → succeed &#8211; mirrors how human experts develop. We&#8217;re essentially teaching our automation system to become an expert through experience. The ultra-thinking phase acts like a senior engineer researching a problem. The lessons learnt document captures that expertise permanently. The second attempt applies that expertise successfully.</span></p>
<p class="part" data-startline="334" data-endline="334" data-position="18862" data-size="0"><span data-position="18862" data-size="197">This approach transforms test automation from a brittle, high-maintenance burden into a learning system that gets smarter over time. Every challenge makes it stronger. Every failure makes it wiser.</span></p>
<hr class="" />
<h2 class="part" data-startline="338" data-endline="338" id="Conclusion" data-id="Conclusion"><a class="anchor hidden-xs" href="#Conclusion" title="Conclusion" data-size="10" data-position="19069" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="19069" data-size="10">Conclusion</span></h2>
<p class="part" data-startline="340" data-endline="340" data-position="19081" data-size="0"><span data-position="19081" data-size="233">This experiment proves that test automation with AI can literally learn from its own failures. The Lessons Learnt Loop isn&#8217;t just a workaround for complex scenarios &#8211; it&#8217;s a fundamental shift in how we approach automation challenges.</span></p>
<p class="part" data-startline="342" data-endline="342" data-position="19316" data-size="0"><span data-position="19316" data-size="305">What started as an expected failure with AG Grid&#8217;s drag-and-drop became a demonstration of systematic problem-solving. The automation failed, researched why, documented solutions, and succeeded on the second attempt. The real success was turning an &#8220;impossible to automate&#8221; scenario into a solved problem.</span></p>
<p class="part" data-startline="344" data-endline="344" data-position="19623" data-size="0"><span data-position="19623" data-size="343">The implications extend beyond this single test case. Every organization has applications with quirky behaviors that defeat standard automation. Every team has that list of &#8220;manual only&#8221; test cases they&#8217;ve given up on. The Lessons Learnt Loop offers a path forward: systematic learning that turns automation failures into documented solutions.</span></p>
<p class="part in-view" data-startline="346" data-endline="346" data-position="19968" data-size="0"><span data-position="19968" data-size="345">What makes this approach particularly powerful is its alignment with how organizations actually work. Senior engineers naturally build mental models of application quirks. The Lessons Learnt Loop captures that knowledge explicitly, making it shareable, reusable, and permanent. When that senior engineer leaves, their automation knowledge stays.</span></p>
<p class="part in-view" data-startline="348" data-endline="348" data-position="20315" data-size="0"><span data-position="20315" data-size="317">The four-phase workflow (Discover → Learn → Generate → Validate) now has an enhancement: front load the earlier phases with lessons learnt. This creates a positive feedback loop where automation gets progressively smarter. Each failure contributes to future success. Each lesson learned benefits all subsequent tests.</span></p>
<p class="part in-view" data-startline="350" data-endline="350" data-position="20634" data-size="0"><span data-position="20634" data-size="241">I&#8217;m moving this from experiment to production. The approach is mature enough, the results are compelling enough, and the need is definitely there. Those AG Grid tests that have been &#8220;manual only&#8221; for years? They&#8217;re about to become automated.</span></p>
<hr class="in-view" />
<h2 class="part in-view" data-startline="354" data-endline="354" id="The-Prompts-I-Actually-Used" data-id="The-Prompts-I-Actually-Used"><a class="anchor hidden-xs" href="#The-Prompts-I-Actually-Used" title="The-Prompts-I-Actually-Used" data-size="27" data-position="20885" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="20885" data-size="27">The Prompts I Actually Used</span></h2>
<p class="part in-view" data-startline="356" data-endline="356" data-position="20914" data-size="0"><span data-position="20914" data-size="72">If you&#8217;re interested in trying this, these are the exact prompts I used:</span></p>
<div class="part code-block-wrapper in-view code-block-toolbar-handled" data-startline="358" data-endline="381" data-infoprefix-length="8" data-position="20988">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="markdown hljs"><span class="hljs-section"># Initial discovery (expected to fail)</span>
/discover TestManagement\test-cases\TC-002-aggrid-column-management-and-row-grouping.md

<span class="hljs-section"># Ultra-thinking research after failure</span>
please can you examine why this drag-and-drop for the row grouping didn't work,
ultrathink and come up with solutions. Please write these solutions to the
file aggrid-lessons-learnt.md

<span class="hljs-section"># Second discovery with lessons learnt</span>
/discover TestManagement\test-cases\TC-002-aggrid-column-management-and-row-grouping.md
<span class="hljs-code">          aggrid-lessons-learnt.md
</span>
<span class="hljs-section"># Learning phase with lessons</span>
/learn TestManagement\discoveries\TC-002-discovery-log.json aggrid-lessons-learnt.md

<span class="hljs-section"># Generation phase with lessons</span>
/generate TestManagement\learnings\TC-002-learnings.json
<span class="hljs-code">          TestManagement\test-cases\TC-002-aggrid-column-management-and-row-grouping.md
          aggrid-lessons-learnt.md
</span>
<span class="hljs-section"># Validation to confirm it works</span>
/validate TestManagement\specs\TC-002-test-spec.yaml
</code></pre>
</div>
<hr class="in-view" />
<h2 class="part in-view" data-startline="385" data-endline="385" id="Resources" data-id="Resources"><a class="anchor hidden-xs" href="#Resources" title="Resources" data-size="9" data-position="21945" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="21945" data-size="9">Resources</span></h2>
<ul class="part in-view" data-startline="387" data-endline="390" data-position="21956" data-size="0">
<li class="" data-startline="387" data-endline="387" data-position="21958" data-size="0"><span data-position="21958" data-size="18">AG Grid Examples: </span><a href="https://www.ag-grid.com/example/" target="_blank" rel="noopener"><span data-position="21958" data-size="0">https://www.ag-grid.com/example/</span></a></li>
<li class="" data-startline="388" data-endline="388" data-position="22011" data-size="0"><span data-position="22011" data-size="38">Chrome DevTools MCP: GitHub Repository</span></li>
<li class="" data-startline="389" data-endline="390" data-position="22052" data-size="0"><span data-position="22052" data-size="66">Previous Experiments: Building on the framework from Experiment #4</span></li>
</ul>
<hr class="in-view" />
<p class="part in-view" data-startline="393" data-endline="393" data-position="22125" data-size="0"><strong data-position="22125" data-size="0"><span data-position="22127" data-size="26">Want to try this yourself?</span></strong></p>
<p class="part in-view" data-startline="395" data-endline="395" data-position="22157" data-size="0"><span data-position="22157" data-size="338">Really was simple to get setup once you understand the pattern: Fail → Research → Learn → Succeed. I&#8217;ll get this packaged up and released on GitHub very soon. Then you can try it and let me know what happens when you try it &#8211; I&#8217;m especially curious about what frameworks defeat your first attempt and whether ultra-thinking helps you too.</span></p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/11/ai-test-automation-with-lessons-learnt-loops/">AI Experiment #5: Can Test Automation AI Learn From Its Own Failures?</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Experiment #4: The Test Automation Compiler</title>
		<link>https://www.testmanagement.com/blog/2025/10/the-test-automation-compiler/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Mon, 27 Oct 2025 22:17:55 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12759</guid>

					<description><![CDATA[<p>Can you treat test cases like source code that compiles into automation? I wondered if this might work… so I tried it. The Question How far can I take building a fully &#8220;prompt driven&#8221; test automation system? In previous experiments, I&#8217;ve been exploring different aspects of AI-driven test automation: Experiment #1: Creating test cases from [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/the-test-automation-compiler/">AI Experiment #4: The Test Automation Compiler</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="part" data-startline="3" data-endline="3" data-position="50" data-size="0"><strong data-position="50" data-size="0"><span data-position="52" data-size="72">Can you treat test cases like source code that compiles into automation?</span></strong></p>
<p class="part" data-startline="5" data-endline="5" data-position="128" data-size="0"><span data-position="128" data-size="29">I wondered if this might work</span><span class="smartypants" data-position="157" data-size="3">…</span><span data-position="160" data-size="15"> so I tried it.</span></p>
<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/sO-0yAbWITk?si=IrhYCT0X2Ngw83QG" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<hr class="" />
<h2 class="part" data-startline="9" data-endline="9" id="The-Question" data-id="The-Question"><a class="anchor hidden-xs" href="#The-Question" title="The-Question" data-size="12" data-position="185" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="185" data-size="12">The Question</span></h2>
<p class="part" data-startline="11" data-endline="11" data-position="199" data-size="0"><span data-position="199" data-size="75">How far can I take building a fully &#8220;prompt driven&#8221; test automation system?</span></p>
<p class="part" data-startline="13" data-endline="13" data-position="276" data-size="0"><span data-position="276" data-size="92">In previous experiments, I&#8217;ve been exploring different aspects of AI-driven test automation:</span></p>
<ul class="part" data-startline="14" data-endline="17" data-position="369" data-size="0">
<li class="" data-startline="14" data-endline="14" data-position="371" data-size="0"><a href="https://www.testmanagement.com/blog/2025/10/ai-experiment-1-recording-videos-and-converting-them-to-test-cases/"><strong data-position="371" data-size="0"><span data-position="373" data-size="13">Experiment #1</span></strong></a><span data-position="389" data-size="56">: Creating test cases from screen recordings with FFMPEG</span></li>
<li class="" data-startline="15" data-endline="15" data-position="447" data-size="0"><a href="https://www.testmanagement.com/blog/2025/10/test-cases-automated-in-minutes-with-chrome-devtools-mcp/"><strong data-position="447" data-size="0"><span data-position="449" data-size="13">Experiment #2</span></strong></a><span data-position="465" data-size="54">: Running test cases directly with Chrome DevTools MCP</span></li>
<li class="" data-startline="16" data-endline="17" data-position="521" data-size="0"><a href="https://www.testmanagement.com/blog/2025/10/automation-framework-with-claude-code/"><strong data-position="521" data-size="0"><span data-position="523" data-size="13">Experiment #3</span></strong></a><span data-position="539" data-size="69">: The &#8220;run twice&#8221; pattern &#8211; agentic discovery then deterministic YAML</span></li>
</ul>
<p class="part" data-startline="18" data-endline="18" data-position="609" data-size="0"><span data-position="609" data-size="78">This experiment brings it all together into a systematic approach I&#8217;m calling </span><strong data-position="687" data-size="0"><span data-position="689" data-size="28">The Test Automation Compiler</span></strong><span data-position="720" data-size="1">.</span></p>
<p class="part" data-startline="20" data-endline="20" data-position="722" data-size="0"><span data-position="722" data-size="208">The core idea: Treat markdown test cases as source code that gets compiled into executable automation through a defined process &#8211; just like a programming language compiler turns source code into machine code.</span></p>
<p class="part" data-startline="22" data-endline="22" data-position="932" data-size="0"><span data-position="932" data-size="91">I don&#8217;t honestly know if this is a good approach yet. Intuition just tells me it&#8217;s worth trying!</span></p>
<hr class="" />
<h2 class="part" data-startline="26" data-endline="26" id="What-Im-Using" data-id="What-Im-Using"><a class="anchor hidden-xs" href="#What-Im-Using" title="What-Im-Using" data-size="14" data-position="1033" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1033" data-size="14">What I&#8217;m Using</span></h2>
<ul class="part" data-startline="28" data-endline="33" data-position="1049" data-size="0">
<li class="" data-startline="28" data-endline="28" data-position="1051" data-size="0"><span data-position="1051" data-size="51">Chrome DevTools MCP (configured from Experiment #2)</span></li>
<li class="" data-startline="29" data-endline="29" data-position="1105" data-size="0"><span data-position="1105" data-size="11">Claude Code</span></li>
<li class="" data-startline="30" data-endline="30" data-position="1119" data-size="0"><span data-position="1119" data-size="36">Financial Dashboard demo application</span></li>
<li class="" data-startline="31" data-endline="31" data-position="1158" data-size="0"><span data-position="1158" data-size="28">Markdown test case documents</span></li>
<li class="" data-startline="32" data-endline="33" data-position="1189" data-size="0"><span data-position="1189" data-size="56">Test Automation Compiler strategy document (version 2.0)</span></li>
</ul>
<p class="part" data-startline="34" data-endline="34" data-position="1247" data-size="0"><span data-position="1247" data-size="292">That last one is crucial &#8211; I took everything learned from Experiments #2 and #3, and a document I developed on determinitic AI test automation. I then refined this with Claude Code&#8217;s help, and built a comprehensive strategy document that defines the entire compilation philosophy and process.</span></p>
<hr class="" />
<h2 class="part" data-startline="38" data-endline="38" id="The-Setup" data-id="The-Setup"><a class="anchor hidden-xs" href="#The-Setup" title="The-Setup" data-size="9" data-position="1549" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1549" data-size="9">The Setup</span></h2>
<p class="part" data-startline="40" data-endline="40" data-position="1560" data-size="0"><span data-position="1560" data-size="46">Here&#8217;s how the Test Automation Compiler works:</span></p>
<p class="part" data-startline="42" data-endline="42" data-position="1608" data-size="0"><strong data-position="1608" data-size="0"><span data-position="1610" data-size="20">The Core Philosophy:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="44" data-endline="48" data-infoprefix-length="0" data-position="1634">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>Human Intent (Markdown) → Compiler (AI Discovery) → Machine Code (YAML) → Execution (Deterministic)
           ↑                                                                        ↓
           └─────────────────── Feedback Loop (Continuous Learning) ────────────────┘
</code></pre>
</div>
<p class="part" data-startline="50" data-endline="50" data-position="1913" data-size="0"><span data-position="1913" data-size="241">Traditional test automation requires translating human test cases into code &#8211; a manual, error-prone process that creates two artifacts. Two artifacts that need maintaining in parrallel. The Test Automation Compiler approach treats this as a </span><strong data-position="2154" data-size="0"><span data-position="2156" data-size="19">compilation problem</span></strong><span data-position="2177" data-size="376"> instead. Your markdown test case is the source code. An AI discovery run acts as the compiler, learning implementation details through intelligent exploration. The generated YAML is the compiled output &#8211; optimized, deterministic and ready to execute. Not ready to execute in the traditional sense. Ready to execute with an AI coding engine and an MCP connection to a browser.</span></p>
<p class="part" data-startline="52" data-endline="52" data-position="2555" data-size="0"><span data-position="2555" data-size="611">This shift in approach could have profound implications. Just like a programming language compiler converts high-level code into machine instructions, this system converts human-readable test cases into a script that can be run. Kind of similar to modern compilers where they include optimization passes, our new learning phase extracts the most efficient patterns from discovery. The feedback loop acts like profiling tools, identifying where the compiled code needs refinement. The result: a single source of truth (your markdown test case) that stays in sync with automation through systematic recompilation.</span></p>
<p class="part" data-startline="54" data-endline="54" data-position="3168" data-size="0"><strong data-position="3168" data-size="0"><span data-position="3170" data-size="18">The Three Pillars:</span></strong></p>
<ol class="part" data-startline="56" data-endline="79" data-position="3192" data-size="0">
<li class="" data-startline="56" data-endline="63" data-position="3195" data-size="0">
<p data-position="3192" data-size="0"><strong data-position="3195" data-size="0"><span data-position="3197" data-size="35">Automation-Aware Test Case Creation</span></strong></p>
<ul data-position="3238" data-size="0">
<li class="" data-startline="57" data-endline="57" data-position="3240" data-size="0"><span data-position="3240" data-size="51">Markdown test cases written with automation in mind</span></li>
<li class="" data-startline="58" data-endline="58" data-position="3297" data-size="0"><span data-position="3297" data-size="45">Structured natural language (GIVEN/WHEN/THEN)</span></li>
<li class="" data-startline="59" data-endline="59" data-position="3348" data-size="0"><span data-position="3348" data-size="28">Clear element identification</span></li>
<li class="" data-startline="60" data-endline="61" data-position="3382" data-size="0"><span data-position="3382" data-size="19">Specific assertions</span></li>
</ul>
<p data-position="3403" data-size="0"><span data-position="3406" data-size="482">Not all test cases are created equal. A test case written as &#8220;Click the blue button&#8221; is human-readable but nightmarish to automate. A test case written as &#8220;CLICK button labeled &#8216;Submit'&#8221; is both human-readable AND automatable. This approach ensures test cases are written in a structured format that humans can read naturally while AI can parse reliably. Kind of similar to BDD but not as prescriptive. It&#8217;s an automation-aware format that is &#8220;compiler-friendly&#8221; test documentation.</span></p>
</li>
<li class="" data-startline="64" data-endline="69" data-position="3893" data-size="0">
<p data-position="3890" data-size="0"><strong data-position="3893" data-size="0"><span data-position="3895" data-size="17">Run Twice Pattern</span></strong><span data-position="3914" data-size="21"> (from Experiment #3)</span></p>
<ul data-position="3939" data-size="0">
<li class="" data-startline="65" data-endline="65" data-position="3941" data-size="0"><strong data-position="3941" data-size="0"><span data-position="3943" data-size="5">Run 1</span></strong><span data-position="3951" data-size="36">: Discovery &#8211; AI explores and learns</span></li>
<li class="" data-startline="66" data-endline="67" data-position="3992" data-size="0"><strong data-position="3992" data-size="0"><span data-position="3994" data-size="5">Run 2</span></strong><span data-position="4002" data-size="46">: Validation &#8211; YAML executes deterministically</span></li>
</ul>
<p data-position="4049" data-size="0"><span data-position="4052" data-size="617">The first run is exploratory &#8211; the AI coder with MCP DevTools connection tries multiple approaches, measures actual timing, discovers the most reliable selectors, and logs everything. Maybe a bit like a compiler&#8217;s analysis phase, understanding the structure before generating code. The second run validates that what was learned actually works deterministically. This two-phase approach separates the intelligent discovery (which can be non-deterministic) from the production execution (which must be deterministic). You get the benefits of AI exploration without the unreliability of agentic execution in production.</span></p>
</li>
<li class="" data-startline="70" data-endline="79" data-position="4674" data-size="0">
<p data-position="4671" data-size="0"><strong data-position="4674" data-size="0"><span data-position="4676" data-size="25">Intelligent Feedback Loop</span></strong></p>
<ul data-position="4707" data-size="0">
<li class="" data-startline="71" data-endline="71" data-position="4709" data-size="0"><span data-position="4709" data-size="28">Learn from execution results</span></li>
<li class="" data-startline="72" data-endline="72" data-position="4743" data-size="0"><span data-position="4743" data-size="38">Update YAML for implementation changes</span></li>
<li class="" data-startline="73" data-endline="73" data-position="4787" data-size="0"><span data-position="4787" data-size="42">Update markdown for business logic changes</span></li>
<li class="" data-startline="74" data-endline="75" data-position="4835" data-size="0"><span data-position="4835" data-size="22">Continuous improvement</span></li>
</ul>
<p data-position="4859" data-size="0"><span data-position="4862" data-size="420">Over time, the system learns from failures and successes. When a selector breaks, the feedback loop updates the YAML without touching the markdown test case. When business logic changes, the markdown is updated and the YAML recompiled. This feedback loop identifies and undertakes maintenance for your automated tests. The system gets smarter with every execution, learning which patterns work and which need adjustment.</span></p>
<p data-position="5284" data-size="0"><span data-position="5287" data-size="16">That&#8217;s the idea </span><span class="smartypants" data-position="5303" data-size="4">…</span><span data-position="5307" data-size="81"> I still have a bit to work out and finish off here. Watch out for Experiment #5.</span></p>
</li>
</ol>
<p class="part" data-startline="80" data-endline="80" data-position="5390" data-size="0"><strong data-position="5390" data-size="0"><span data-position="5392" data-size="18">The Four Commands:</span></strong></p>
<p class="part" data-startline="82" data-endline="82" data-position="5414" data-size="0"><span data-position="5414" data-size="80">I built four Claude Code slash commands that implement the compilation pipeline:</span></p>
<ul class="part" data-startline="84" data-endline="88" data-position="5496" data-size="0">
<li class="" data-startline="84" data-endline="84" data-position="5498" data-size="0"><code data-position="5499" data-size="9">/discover</code><span data-position="5509" data-size="30"> &#8211; Discovery execution (Run 1)</span></li>
<li class="" data-startline="85" data-endline="85" data-position="5542" data-size="0"><code data-position="5543" data-size="6">/learn</code><span data-position="5550" data-size="30"> &#8211; Extract automation patterns</span></li>
<li class="" data-startline="86" data-endline="86" data-position="5583" data-size="0"><code data-position="5584" data-size="9">/generate</code><span data-position="5594" data-size="29"> &#8211; Create YAML from learnings</span></li>
<li class="" data-startline="87" data-endline="88" data-position="5626" data-size="0"><code data-position="5627" data-size="9">/validate</code><span data-position="5637" data-size="31"> &#8211; Validation execution (Run 2)</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="91" data-endline="91" id="The-Experiment" data-id="The-Experiment"><a class="anchor hidden-xs" href="#The-Experiment" title="The-Experiment" data-size="14" data-position="5678" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5678" data-size="14">The Experiment</span></h2>
<p class="part" data-startline="93" data-endline="93" data-position="5694" data-size="0"><span data-position="5694" data-size="77">I took a markdown test case through this complete 4-step compilation process.</span></p>
<h3 class="part" data-startline="95" data-endline="95" id="Step-1-Discovery-Execution" data-id="Step-1-Discovery-Execution"><a class="anchor hidden-xs" href="#Step-1-Discovery-Execution" title="Step-1-Discovery-Execution" data-size="27" data-position="5777" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5777" data-size="27">Step 1: Discovery Execution</span></h3>
<p class="part" data-startline="97" data-endline="97" data-position="5806" data-size="0"><strong data-position="5806" data-size="0"><span data-position="5808" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="98" data-endline="100" data-infoprefix-length="0" data-position="5824">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/discover TC-001-add-investment-account.md
</code></pre>
</div>
<p class="part" data-startline="102" data-endline="102" data-position="5876" data-size="0"><strong data-position="5876" data-size="0"><span data-position="5878" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="104" data-endline="104" data-position="5896" data-size="0"><span data-position="5896" data-size="128">Claude Code took the markdown test case and executed it using Chrome DevTools MCP. But this wasn&#8217;t just a simple run &#8211; it was a </span><strong data-position="6024" data-size="0"><span data-position="6026" data-size="17">discovery session</span></strong><span data-position="6045" data-size="57"> designed to learn everything about automating this test:</span></p>
<p class="part" data-startline="106" data-endline="106" data-position="6104" data-size="0"><span data-position="6104" data-size="19">Discovery captured:</span></p>
<ul class="part" data-startline="107" data-endline="115" data-position="6124" data-size="0">
<li class="" data-startline="107" data-endline="107" data-position="6126" data-size="0"><span data-position="6126" data-size="38">Multiple selector strategies attempted</span></li>
<li class="" data-startline="108" data-endline="108" data-position="6167" data-size="0"><span data-position="6167" data-size="43">Successful selectors with confidence scores</span></li>
<li class="" data-startline="109" data-endline="109" data-position="6213" data-size="0"><span data-position="6213" data-size="44">Timing requirements measured in milliseconds</span></li>
<li class="" data-startline="110" data-endline="110" data-position="6260" data-size="0"><span data-position="6260" data-size="24">Screenshots at each step</span></li>
<li class="" data-startline="111" data-endline="111" data-position="6287" data-size="0"><span data-position="6287" data-size="36">Patterns in the application behavior</span></li>
<li class="" data-startline="112" data-endline="112" data-position="6326" data-size="0"><span data-position="6326" data-size="35">Modal animations (600ms discovered)</span></li>
<li class="" data-startline="113" data-endline="113" data-position="6364" data-size="0"><span data-position="6364" data-size="40">Form validation delays (1000ms required)</span></li>
<li class="" data-startline="114" data-endline="115" data-position="6407" data-size="0"><span data-position="6407" data-size="37">Success indicators and their duration</span></li>
</ul>
<p class="part" data-startline="116" data-endline="116" data-position="6446" data-size="0"><span data-position="6446" data-size="12">The output: </span><code data-position="6459" data-size="18">discovery-log.json</code><span data-position="6478" data-size="69"> &#8211; a comprehensive record of everything learned during the first run.</span></p>
<p class="part" data-startline="118" data-endline="118" data-position="6549" data-size="0"><span data-position="6549" data-size="375">This discovery run is analyzing the application&#8217;s structure, parsing the UI patterns, measuring the real-world behavior. It&#8217;s not just blindly executing steps; it&#8217;s building an internal model of how this application works so it can generate optimal automation instructions. The discovery log is a structured representation of everything needed for the yaml script generation.</span></p>
<p class="part" data-startline="120" data-endline="120" data-position="6926" data-size="0"><span data-position="6926" data-size="91">The key insight here is that this first run is intelligent exploration, not just execution.</span></p>
<hr class="" />
<h3 class="part" data-startline="124" data-endline="124" id="Step-2-Learning-Extraction" data-id="Step-2-Learning-Extraction"><a class="anchor hidden-xs" href="#Step-2-Learning-Extraction" title="Step-2-Learning-Extraction" data-size="27" data-position="7028" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="7028" data-size="27">Step 2: Learning Extraction</span></h3>
<p class="part" data-startline="126" data-endline="126" data-position="7057" data-size="0"><strong data-position="7057" data-size="0"><span data-position="7059" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="127" data-endline="129" data-infoprefix-length="0" data-position="7075">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/learn discovery-log.json
</code></pre>
</div>
<p class="part" data-startline="131" data-endline="131" data-position="7110" data-size="0"><strong data-position="7110" data-size="0"><span data-position="7112" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="133" data-endline="133" data-position="7130" data-size="0"><span data-position="7130" data-size="102">Claude Code analyzed the discovery log and extracted automation patterns specific to this application:</span></p>
<p class="part" data-startline="135" data-endline="135" data-position="7234" data-size="0"><span data-position="7234" data-size="20">Learnings extracted:</span></p>
<ul class="part" data-startline="136" data-endline="142" data-position="7255" data-size="0">
<li class="" data-startline="136" data-endline="136" data-position="7257" data-size="0"><span data-position="7257" data-size="34">Most reliable selectors identified</span></li>
<li class="" data-startline="137" data-endline="137" data-position="7294" data-size="0"><span data-position="7294" data-size="44">Optimal wait strategies (immediate vs timed)</span></li>
<li class="" data-startline="138" data-endline="138" data-position="7341" data-size="0"><span data-position="7341" data-size="28">Element interaction patterns</span></li>
<li class="" data-startline="139" data-endline="139" data-position="7372" data-size="0"><span data-position="7372" data-size="25">Data transformation rules</span></li>
<li class="" data-startline="140" data-endline="140" data-position="7400" data-size="0"><span data-position="7400" data-size="27">Application-specific quirks</span></li>
<li class="" data-startline="141" data-endline="142" data-position="7430" data-size="0"><span data-position="7430" data-size="26">Best practices for this UI</span></li>
</ul>
<p class="part" data-startline="143" data-endline="143" data-position="7458" data-size="0"><span data-position="7458" data-size="12">The output: </span><code data-position="7471" data-size="14">learnings.json</code><span data-position="7486" data-size="52"> &#8211; distilled intelligence ready for YAML generation.</span></p>
<p class="part" data-startline="145" data-endline="145" data-position="7540" data-size="0"><span data-position="7540" data-size="630">This learning extraction step does is looking to optimise our test automation process specifically for our test case and our application. It looks at all the attempted selectors and picks the most reliable ones. It analyzes timing patterns and calculates optimal wait strategies. It identifies application-specific behaviors (like a 600ms modal animation) that need special handling. This is more than just data aggregation &#8211; it&#8217;s using AI intelligent pattern recognition that extracts reusable automation knowledge from raw execution data. The learnings become the &#8220;optimisation rules&#8221; that guide YAML generation (the next step).</span></p>
<hr class="" />
<h3 class="part" data-startline="149" data-endline="149" id="Step-3-YAML-Generation" data-id="Step-3-YAML-Generation"><a class="anchor hidden-xs" href="#Step-3-YAML-Generation" title="Step-3-YAML-Generation" data-size="23" data-position="8181" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="8181" data-size="23">Step 3: YAML Generation</span></h3>
<p class="part" data-startline="151" data-endline="151" data-position="8206" data-size="0"><strong data-position="8206" data-size="0"><span data-position="8208" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="152" data-endline="154" data-infoprefix-length="0" data-position="8224">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/generate learnings.json TC-001-add-investment-account.md
</code></pre>
</div>
<p class="part" data-startline="156" data-endline="156" data-position="8291" data-size="0"><strong data-position="8291" data-size="0"><span data-position="8293" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="158" data-endline="158" data-position="8311" data-size="0"><span data-position="8311" data-size="21">Claude Code combined:</span></p>
<ol class="part" data-startline="159" data-endline="161" data-position="8333" data-size="0">
<li class="" data-startline="159" data-endline="159" data-position="8336" data-size="0"><span data-position="8336" data-size="38">The learnings (implementation details)</span></li>
<li class="" data-startline="160" data-endline="161" data-position="8378" data-size="0"><span data-position="8378" data-size="46">The original markdown test case (requirements)</span></li>
</ol>
<p class="part" data-startline="162" data-endline="162" data-position="8426" data-size="0"><span data-position="8426" data-size="47">To generate a deterministic YAML specification.</span></p>
<p class="part" data-startline="164" data-endline="164" data-position="8475" data-size="0"><span data-position="8475" data-size="18">The YAML included:</span></p>
<ul class="part" data-startline="165" data-endline="171" data-position="8494" data-size="0">
<li class="" data-startline="165" data-endline="165" data-position="8496" data-size="0"><span data-position="8496" data-size="43">Structured steps using discovered selectors</span></li>
<li class="" data-startline="166" data-endline="166" data-position="8542" data-size="0"><span data-position="8542" data-size="40">Optimized waits based on measured timing</span></li>
<li class="" data-startline="167" data-endline="167" data-position="8585" data-size="0"><span data-position="8585" data-size="40">Proper sequencing learned from discovery</span></li>
<li class="" data-startline="168" data-endline="168" data-position="8628" data-size="0"><span data-position="8628" data-size="38">Fallback strategies for flaky elements</span></li>
<li class="" data-startline="169" data-endline="169" data-position="8669" data-size="0"><span data-position="8669" data-size="35">Confidence scores for each selector</span></li>
<li class="" data-startline="170" data-endline="171" data-position="8707" data-size="0"><span data-position="8707" data-size="34">Execution notes documenting quirks</span></li>
</ul>
<p class="part" data-startline="172" data-endline="172" data-position="8743" data-size="0"><span data-position="8743" data-size="12">The output: </span><code data-position="8756" data-size="14">test-spec.yaml</code><span data-position="8771" data-size="52"> &#8211; the &#8220;compiled&#8221; version of the markdown test case.</span></p>
<p class="part" data-startline="174" data-endline="174" data-position="8825" data-size="0"><span data-position="8825" data-size="640">This is the yaml script generation phase &#8211; where high-level requirements (markdown) and implementation intelligence (learnings) combine to produce a script that can be followed by AI coding tools. The YAML specification includes everything needed for deterministic execution: precise selectors with confidence scores, optimized wait times based on measured behavior, proper sequencing learned from discovery, and even fallback strategies for unreliable elements. It&#8217;s structured, readable, and maintainable &#8211; just like well-written code. But unlike hand-written automation this is like a &#8220;compiled&#8221; output based on actual observed behavior.</span></p>
<p class="part" data-startline="176" data-endline="176" data-position="9467" data-size="0"><span data-position="9467" data-size="191">The YAML reads like hand-crafted automation code, but it was generated entirely from the discovery process. It&#8217;s deterministic, optimized, and includes all the learned implementation details.</span></p>
<hr class="" />
<h3 class="part" data-startline="180" data-endline="180" id="Step-4-Validation-Execution" data-id="Step-4-Validation-Execution"><a class="anchor hidden-xs" href="#Step-4-Validation-Execution" title="Step-4-Validation-Execution" data-size="28" data-position="9669" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="9669" data-size="28">Step 4: Validation Execution</span></h3>
<p class="part" data-startline="182" data-endline="182" data-position="9699" data-size="0"><strong data-position="9699" data-size="0"><span data-position="9701" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="183" data-endline="185" data-infoprefix-length="0" data-position="9717">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/validate test-spec.yaml
</code></pre>
</div>
<p class="part" data-startline="187" data-endline="187" data-position="9751" data-size="0"><strong data-position="9751" data-size="0"><span data-position="9753" data-size="14">What happened:</span></strong></p>
<p class="part" data-startline="189" data-endline="189" data-position="9771" data-size="0"><span data-position="9771" data-size="102">Claude Code executed the generated YAML specification to validate that the compilation was successful.</span></p>
<p class="part" data-startline="191" data-endline="191" data-position="9875" data-size="0"><span data-position="9875" data-size="21">Validation performed:</span></p>
<ul class="part" data-startline="192" data-endline="198" data-position="9897" data-size="0">
<li class="" data-startline="192" data-endline="192" data-position="9899" data-size="0"><span data-position="9899" data-size="36">Executed all steps deterministically</span></li>
<li class="" data-startline="193" data-endline="193" data-position="9938" data-size="0"><span data-position="9938" data-size="33">Compared results to discovery run</span></li>
<li class="" data-startline="194" data-endline="194" data-position="9974" data-size="0"><span data-position="9974" data-size="22">Verified repeatability</span></li>
<li class="" data-startline="195" data-endline="195" data-position="9999" data-size="0"><span data-position="9999" data-size="45">Scored reliability across multiple dimensions</span></li>
<li class="" data-startline="196" data-endline="196" data-position="10047" data-size="0"><span data-position="10047" data-size="29">Identified maintenance points</span></li>
<li class="" data-startline="197" data-endline="198" data-position="10079" data-size="0"><span data-position="10079" data-size="25">Confirmed CI/CD readiness</span></li>
</ul>
<p class="part" data-startline="199" data-endline="199" data-position="10106" data-size="0"><strong data-position="10106" data-size="0"><span data-position="10108" data-size="19">Validation Results:</span></strong></p>
<table class="part" data-startline="201" data-endline="207">
<thead>
<tr>
<th><span data-position="10133" data-size="9">Dimension</span></th>
<th><span data-position="10145" data-size="5">Score</span></th>
<th><span data-position="10153" data-size="5">Notes</span></th>
</tr>
</thead>
<tbody>
<tr>
<td><span data-position="10193" data-size="11">Reliability</span></td>
<td><span data-position="10207" data-size="5">10/10</span></td>
<td><span data-position="10215" data-size="30">All steps execute consistently</span></td>
</tr>
<tr>
<td><span data-position="10250" data-size="6">Timing</span></td>
<td><span data-position="10259" data-size="5">10/10</span></td>
<td><span data-position="10267" data-size="24">Optimal waits discovered</span></td>
</tr>
<tr>
<td><span data-position="10296" data-size="13">Data Handling</span></td>
<td><span data-position="10312" data-size="5">10/10</span></td>
<td><span data-position="10320" data-size="23">Correct transformations</span></td>
</tr>
<tr>
<td><span data-position="10348" data-size="11">Determinism</span></td>
<td><span data-position="10362" data-size="5">10/10</span></td>
<td><span data-position="10370" data-size="26">No randomness in execution</span></td>
</tr>
<tr>
<td><span data-position="10401" data-size="15">Maintainability</span></td>
<td><span data-position="10419" data-size="5">10/10</span></td>
<td><span data-position="10427" data-size="27">Well-structured, documented</span></td>
</tr>
</tbody>
</table>
<p class="part" data-startline="209" data-endline="209" data-position="10458" data-size="0"><strong data-position="10458" data-size="0"><span data-position="10460" data-size="18">Overall Assessment</span></strong><span data-position="10481" data-size="45">: Production-ready, fully deployable to CI/CD</span></p>
<p class="part" data-startline="211" data-endline="211" data-position="10527" data-size="0"><strong data-position="10527" data-size="0"><span data-position="10529" data-size="17">Maintenance Notes</span></strong><span data-position="10549" data-size="78">: Selectors need monitoring for UI changes (which is true for any automation).</span></p>
<p class="part" data-startline="213" data-endline="213" data-position="10628" data-size="0"><span data-position="10628" data-size="673">The validation step completes the compilation cycle by proving the generated YAML actually works. It&#8217;s comparing results against the discovery run, checking for deterministic behavior, confirming there&#8217;s no randomness in execution. The scoring system provides objective metrics across multiple dimensions, giving you confidence the automation is production-ready. This isn&#8217;t just a binary pass/fail &#8211; it&#8217;s a comprehensive quality assessment that identifies potential maintenance points before they become problems. The 10/10 scores across all dimensions mean the compilation was successful: the YAML faithfully represents the markdown test case with optimal implementation.</span></p>
<hr class="" />
<h2 class="part" data-startline="217" data-endline="217" id="Patterns-I-Noticed" data-id="Patterns-I-Noticed"><a class="anchor hidden-xs" href="#Patterns-I-Noticed" title="Patterns-I-Noticed" data-size="18" data-position="11311" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="11311" data-size="18">Patterns I Noticed</span></h2>
<p class="part" data-startline="219" data-endline="219" data-position="11331" data-size="0"><span data-position="11331" data-size="49">After completing the 4-step compilation workflow:</span></p>
<p class="part" data-startline="221" data-endline="221" data-position="11382" data-size="0"><strong data-position="11382" data-size="0"><span data-position="11384" data-size="15">Works well for:</span></strong></p>
<ul class="part" data-startline="222" data-endline="228" data-position="11402" data-size="0">
<li class="" data-startline="222" data-endline="222" data-position="11404" data-size="0"><span data-position="11404" data-size="69">Converting test documentation directly into automation without coding</span></li>
<li class="" data-startline="223" data-endline="223" data-position="11476" data-size="0"><span data-position="11476" data-size="55">Maintaining single source of truth (markdown test case)</span></li>
<li class="" data-startline="224" data-endline="224" data-position="11534" data-size="0"><span data-position="11534" data-size="55">Creating deterministic execution from agentic discovery</span></li>
<li class="" data-startline="225" data-endline="225" data-position="11592" data-size="0"><span data-position="11592" data-size="46">Systematic approach with clear, defined stages</span></li>
<li class="" data-startline="226" data-endline="226" data-position="11641" data-size="0"><span data-position="11641" data-size="46">Production-ready output with confidence scores</span></li>
<li class="" data-startline="227" data-endline="228" data-position="11690" data-size="0"><span data-position="11690" data-size="51">Auditable compilation process (all artifacts saved)</span></li>
</ul>
<p class="part" data-startline="229" data-endline="229" data-position="11743" data-size="0"><strong data-position="11743" data-size="0"><span data-position="11745" data-size="33">Might not work quite so well for:</span></strong></p>
<ul class="part" data-startline="230" data-endline="234" data-position="11781" data-size="0">
<li class="" data-startline="230" data-endline="230" data-position="11783" data-size="0"><span data-position="11783" data-size="60">Currently Chrome-only (using Chrome DevTools MCP limitation)</span></li>
<li class="" data-startline="231" data-endline="231" data-position="11846" data-size="0"><span data-position="11846" data-size="51">Needs extensive testing with more complex scenarios</span></li>
<li class="" data-startline="232" data-endline="232" data-position="11900" data-size="0"><span data-position="11900" data-size="50">Unknown performance in production GitHub workflows</span></li>
<li class="" data-startline="233" data-endline="234" data-position="11953" data-size="0"><span data-position="11953" data-size="47">No feedback loop implemented yet (planned next)</span></li>
</ul>
<p class="part" data-startline="235" data-endline="235" data-position="12002" data-size="0"><strong data-position="12002" data-size="0"><span data-position="12004" data-size="10">Surprises:</span></strong></p>
<ul class="part" data-startline="236" data-endline="242" data-position="12017" data-size="0">
<li class="" data-startline="236" data-endline="236" data-position="12019" data-size="0"><span data-position="12019" data-size="50">The 4-command workflow felt natural and systematic</span></li>
<li class="" data-startline="237" data-endline="237" data-position="12072" data-size="0"><span data-position="12072" data-size="57">10/10 reliability score on first attempt with no tweaking</span></li>
<li class="" data-startline="238" data-endline="238" data-position="12132" data-size="0"><span data-position="12132" data-size="54">Generated YAML was readable and maintainable by humans</span></li>
<li class="" data-startline="239" data-endline="239" data-position="12189" data-size="0"><span data-position="12189" data-size="57">The &#8220;compiler&#8221; concept works as both metaphor and reality</span></li>
<li class="" data-startline="240" data-endline="240" data-position="12249" data-size="0"><span data-position="12249" data-size="66">Validation report proactively identified future maintenance points</span></li>
<li class="" data-startline="241" data-endline="242" data-position="12318" data-size="0"><span data-position="12318" data-size="65">Discovery log captured quirks I wouldn&#8217;t have thought to document</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="245" data-endline="245" id="The-Honest-Take" data-id="The-Honest-Take"><a class="anchor hidden-xs" href="#The-Honest-Take" title="The-Honest-Take" data-size="15" data-position="12393" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="12393" data-size="15">The Honest Take</span></h2>
<p class="part" data-startline="247" data-endline="248" data-position="12410" data-size="0"><strong data-position="12410" data-size="0"><span data-position="12412" data-size="16"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick Verdict:</span></strong><br />
<span data-position="12431" data-size="111"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f7e1.png" alt="🟡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> AMBER: &#8220;Interesting . . . an approach that&#8217;s taking shape! Need to work in the feedback and learning layer!&#8221;</span></p>
<p class="part" data-startline="250" data-endline="250" data-position="12544" data-size="0"><strong data-position="12544" data-size="0"><span data-position="12546" data-size="9">The Good:</span></strong></p>
<ul class="part" data-startline="251" data-endline="258" data-position="12558" data-size="0">
<li class="" data-startline="251" data-endline="251" data-position="12560" data-size="0"><span data-position="12560" data-size="63">Single source of truth: markdown test case is THE documentation</span></li>
<li class="" data-startline="252" data-endline="252" data-position="12626" data-size="0"><span data-position="12626" data-size="52">No coding required: entire workflow is prompt-driven</span></li>
<li class="" data-startline="253" data-endline="253" data-position="12681" data-size="0"><span data-position="12681" data-size="61">Systematic process: 4 clear steps with defined inputs/outputs</span></li>
<li class="" data-startline="254" data-endline="254" data-position="12745" data-size="0"><span data-position="12745" data-size="62">Production-ready: 10/10 reliability score, validated for CI/CD</span></li>
<li class="" data-startline="255" data-endline="255" data-position="12810" data-size="0"><span data-position="12810" data-size="74">Intelligent compilation: learns optimal selectors and timing automatically</span></li>
<li class="" data-startline="256" data-endline="256" data-position="12887" data-size="0"><span data-position="12887" data-size="65">Self-validating: system knows its own reliability and limitations</span></li>
<li class="" data-startline="257" data-endline="258" data-position="12955" data-size="0"><span data-position="12955" data-size="52">Auditable: every stage produces artifacts for review</span></li>
</ul>
<p class="part" data-startline="259" data-endline="259" data-position="13009" data-size="0"><strong data-position="13009" data-size="0"><span data-position="13011" data-size="13">The Concerns:</span></strong></p>
<ul class="part" data-startline="260" data-endline="265" data-position="13027" data-size="0">
<li class="" data-startline="260" data-endline="260" data-position="13029" data-size="0"><span data-position="13029" data-size="84">Still needs extensive testing with complex scenarios (multi-step flows, error cases)</span></li>
<li class="" data-startline="261" data-endline="261" data-position="13116" data-size="0"><span data-position="13116" data-size="54">Chrome-only currently (Chrome DevTools MCP limitation)</span></li>
<li class="" data-startline="262" data-endline="262" data-position="13173" data-size="0"><span data-position="13173" data-size="49">Unknown reliability in production CI/CD workflows</span></li>
<li class="" data-startline="263" data-endline="263" data-position="13225" data-size="0"><span data-position="13225" data-size="62">Feedback loop not yet implemented (continuous learning needed)</span></li>
<li class="" data-startline="264" data-endline="265" data-position="13290" data-size="0"><span data-position="13290" data-size="59">Need to test with UI changes to verify maintenance approach</span></li>
</ul>
<p class="part" data-startline="266" data-endline="267" data-position="13351" data-size="0"><strong data-position="13351" data-size="0"><span data-position="13353" data-size="17">Would I use this?</span></strong><br />
<span data-position="13373" data-size="87">Maybe &#8211; the approach is solid and the 4-step workflow makes intuitive sense. I need to:</span></p>
<ol class="part" data-startline="268" data-endline="272" data-position="13461" data-size="0">
<li class="" data-startline="268" data-endline="268" data-position="13464" data-size="0"><span data-position="13464" data-size="32">Validate with more complex tests</span></li>
<li class="" data-startline="269" data-endline="269" data-position="13500" data-size="0"><span data-position="13500" data-size="28">Run in actual CI/CD pipeline</span></li>
<li class="" data-startline="270" data-endline="270" data-position="13532" data-size="0"><span data-position="13532" data-size="21">Add the feedback loop</span></li>
<li class="" data-startline="271" data-endline="272" data-position="13557" data-size="0"><span data-position="13557" data-size="37">Test Playwright MCP for multi-browser</span></li>
</ol>
<p class="part" data-startline="273" data-endline="273" data-position="13596" data-size="0"><span data-position="13596" data-size="105">I think the foundation we have here is strong enough to convince me to invest more time in this approach.</span></p>
<h2 class="part" data-startline="276" data-endline="276" id="The-Main-Lesson" data-id="The-Main-Lesson"><a class="anchor hidden-xs" href="#The-Main-Lesson" title="The-Main-Lesson" data-size="15" data-position="13707" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="13707" data-size="15">The Main Lesson</span></h2>
<p class="part" data-startline="278" data-endline="278" data-position="13724" data-size="0"><strong data-position="13724" data-size="0"><span data-position="13726" data-size="95">The &#8220;Test Automation Compiler&#8221; concept isn&#8217;t just a metaphor &#8211; it&#8217;s a working proof of concept.</span></strong></p>
<p class="part in-view" data-startline="280" data-endline="280" data-position="13825" data-size="0"><span data-position="13825" data-size="91">Treating test cases as source code that compiles into automation provides several benefits:</span></p>
<ol class="part in-view" data-startline="282" data-endline="287" data-position="13918" data-size="0">
<li class="" data-startline="282" data-endline="282" data-position="13921" data-size="0"><strong data-position="13921" data-size="0"><span data-position="13923" data-size="18">Clear mental model</span></strong><span data-position="13944" data-size="32">: Everyone understands compilers</span></li>
<li class="" data-startline="283" data-endline="283" data-position="13979" data-size="0"><strong data-position="13979" data-size="0"><span data-position="13981" data-size="14">Defined stages</span></strong><span data-position="13998" data-size="39">: Each step has specific inputs/outputs</span></li>
<li class="" data-startline="284" data-endline="284" data-position="14040" data-size="0"><strong data-position="14040" data-size="0"><span data-position="14042" data-size="22">Separation of concerns</span></strong><span data-position="14067" data-size="50">: Requirements (markdown) vs implementation (YAML)</span></li>
<li class="" data-startline="285" data-endline="285" data-position="14120" data-size="0"><strong data-position="14120" data-size="0"><span data-position="14122" data-size="24">Optimization opportunity</span></strong><span data-position="14149" data-size="40">: Learning phase extracts best practices</span></li>
<li class="" data-startline="286" data-endline="287" data-position="14192" data-size="0"><strong data-position="14192" data-size="0"><span data-position="14194" data-size="19">Validation built-in</span></strong><span data-position="14216" data-size="34">: Compiler verifies its own output</span></li>
</ol>
<p class="part in-view" data-startline="288" data-endline="288" data-position="14251" data-size="0"><span data-position="14251" data-size="32">The three pillars work together:</span></p>
<ul class="part in-view" data-startline="289" data-endline="292" data-position="14284" data-size="0">
<li class="" data-startline="289" data-endline="289" data-position="14286" data-size="0"><strong data-position="14286" data-size="0"><span data-position="14288" data-size="25">Automation-Aware Creation</span></strong><span data-position="14315" data-size="48"> ensures good input (well-structured test cases)</span></li>
<li class="" data-startline="290" data-endline="290" data-position="14366" data-size="0"><strong data-position="14366" data-size="0"><span data-position="14368" data-size="17">Run Twice Pattern</span></strong><span data-position="14387" data-size="52"> provides intelligent translation (discovery → YAML)</span></li>
<li class="" data-startline="291" data-endline="292" data-position="14442" data-size="0"><strong data-position="14442" data-size="0"><span data-position="14444" data-size="13">Feedback Loop</span></strong><span data-position="14459" data-size="66"> enables continuous improvement (not yet implemented but designed)</span></li>
</ul>
<p class="part in-view" data-startline="293" data-endline="293" data-position="14527" data-size="0"><span data-position="14527" data-size="148">I think the concept and foundation is solid. From markdown to production-ready automation with a systematic compilation process and no code written.</span></p>
<h2 class="part in-view" data-startline="295" data-endline="295" id="Conclusion" data-id="Conclusion"><a class="anchor hidden-xs" href="#Conclusion" title="Conclusion" data-size="10" data-position="14680" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="14680" data-size="10">Conclusion</span></h2>
<p class="part in-view" data-startline="297" data-endline="297" data-position="14692" data-size="0"><span data-position="14692" data-size="645">This experiment demonstrates that the Test Automation Compiler approach isn&#8217;t just an interesting idea &#8211; it&#8217;s a practical, working proof of concept. The compiler metaphor proved to be more than just a convenient analogy; it&#8217;s a useful description of what&#8217;s happening. We&#8217;re taking human-readable test documentation (source code) and systematically transforming it through analysis, optimization, and code generation phases into deterministic, production-ready automation (executable machine code). When I say &#8220;executable machine code&#8221; I really mean a script that&#8217;s reliably execuatable by an AI coding engine with an MCP conncetion to a browser.</span></p>
<p class="part in-view" data-startline="299" data-endline="299" data-position="15339" data-size="0"><span data-position="15339" data-size="217">The four-command workflow provides a clear, repeatable process. A process that separates concerns: discovery for learning, extraction for optimization, generation for compilation, and validation for quality assurance.</span></p>
<p class="part in-view" data-startline="301" data-endline="301" data-position="15558" data-size="0"><span data-position="15558" data-size="502">What makes this approach fundamentally different from traditional test automation is the elimination of parallel artifacts. There&#8217;s no separate test documentation that falls out of sync with test code. There&#8217;s no manual translation step where implementation details get lost or misinterpreted. Although it could be argued that losing this translation step means you&#8217;re missing a human review and analysis step that traditionally would find issues &#8211; both in the test case and the application under test.</span></p>
<p class="part in-view" data-startline="303" data-endline="303" data-position="16062" data-size="0"><span data-position="16062" data-size="471">The markdown test case becomes THE documentation, and the YAML specification is automatically compiled from observed behavior rather than assumed implementation. When the application changes, you update the markdown and recompile &#8211; just like updating source code and rebuilding. When implementation details change (selectors, timing), the feedback loop updates the YAML without touching your documentation (at least that&#8217;s what I&#8217;m hoping once this stage is implemented).</span></p>
<p class="part in-view" data-startline="305" data-endline="305" data-position="16536" data-size="0"><span data-position="16536" data-size="202">This single source of truth approach, combined with intelligent compilation and continuous learning, represents a genuinely interesting way to think about test automation maintenance and sustainability.</span></p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/the-test-automation-compiler/">AI Experiment #4: The Test Automation Compiler</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Experiment #3: When Claude Code Builds a Framework You Didn&#8217;t Ask For</title>
		<link>https://www.testmanagement.com/blog/2025/10/automation-framework-with-claude-code/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Fri, 24 Oct 2025 07:27:07 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12757</guid>

					<description><![CDATA[<p>Can you transform unreliable agentic tests into deterministic, repeatable tests using a &#8220;run twice&#8221; pattern? I wondered if this works… so I tried it. The Question Why did Claude Code suddenly start building a test automation framework I didn&#8217;t ask for? Towards the end of Experiment #2, things went sideways. I asked Claude Code to [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/automation-framework-with-claude-code/">AI Experiment #3: When Claude Code Builds a Framework You Didn&#8217;t Ask For</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="part" data-startline="3" data-endline="3" data-position="75" data-size="0"><strong data-position="75" data-size="0"><span data-position="77" data-size="108">Can you transform unreliable agentic tests into deterministic, repeatable tests using a &#8220;run twice&#8221; pattern?</span></strong></p>
<p class="part" data-startline="5" data-endline="5" data-position="189" data-size="0"><span data-position="189" data-size="24">I wondered if this works</span><span class="smartypants" data-position="213" data-size="3">…</span><span data-position="216" data-size="15"> so I tried it.</span></p>
<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/RmIACb0DRaw?si=TaVyj_59ZrRGkReU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="" />
<h2 class="part" data-startline="9" data-endline="9" id="The-Question" data-id="The-Question"><a class="anchor hidden-xs" href="#The-Question" title="The-Question" data-size="12" data-position="241" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="241" data-size="12">The Question</span></h2>
<p class="part" data-startline="11" data-endline="11" data-position="255" data-size="0"><span data-position="255" data-size="89">Why did Claude Code suddenly start building a test automation framework I didn&#8217;t ask for?</span></p>
<p class="part" data-startline="13" data-endline="13" data-position="346" data-size="0"><span data-position="346" data-size="241">Towards the end of Experiment #2, things went sideways. I asked Claude Code to create a slash command for test automation. Instead, it started generating commands for converting tests to YAML, creating action libraries, building test runners</span><span class="smartypants" data-position="587" data-size="3">…</span><span data-position="590" data-size="31"> way beyond what I&#8217;d asked for.</span></p>
<p class="part" data-startline="15" data-endline="15" data-position="623" data-size="0"><span data-position="623" data-size="274">Then I realized: I&#8217;d forgotten about a markdown document in my project folder. A document about &#8220;deterministic test automation&#8221; that I&#8217;d been exploring with Claude Code in a previous session. When I said &#8220;read all the files in this project,&#8221; it read that forgotten document.</span></p>
<p class="part" data-startline="17" data-endline="17" data-position="899" data-size="0"><span data-position="899" data-size="49">And that context guided everything that followed.</span></p>
<hr class="" />
<h2 class="part" data-startline="21" data-endline="21" id="What-Im-Using" data-id="What-Im-Using"><a class="anchor hidden-xs" href="#What-Im-Using" title="What-Im-Using" data-size="14" data-position="958" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="966" data-size="14">What I&#8217;m Using</span></h2>
<ul class="part" data-startline="23" data-endline="28" data-position="974" data-size="0">
<li class="" data-startline="23" data-endline="23" data-position="976" data-size="0"><span data-position="976" data-size="59">Chrome DevTools MCP (already configured from Experiment #2)</span></li>
<li class="" data-startline="24" data-endline="24" data-position="1038" data-size="0"><span data-position="1038" data-size="11">Claude Code</span></li>
<li class="" data-startline="25" data-endline="25" data-position="1052" data-size="0"><span data-position="1052" data-size="44">Financial Dashboard app (v0 app for testing)</span></li>
<li class="" data-startline="26" data-endline="26" data-position="1099" data-size="0"><span data-position="1099" data-size="28">Test case markdown documents</span></li>
<li class="" data-startline="27" data-endline="28" data-position="1130" data-size="0"><span data-position="1130" data-size="60">Hidden context: a forgotten &#8220;deterministic testing&#8221; document</span></li>
</ul>
<p class="part" data-startline="29" data-endline="29" data-position="1192" data-size="0"><span data-position="1192" data-size="92">That last one &#8211; the forgotten document &#8211; is the key to understanding this entire experiment.</span></p>
<hr class="" />
<h2 class="part" data-startline="33" data-endline="33" id="The-Setup" data-id="The-Setup"><a class="anchor hidden-xs" href="#The-Setup" title="The-Setup" data-size="9" data-position="1294" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1302" data-size="9">The Setup</span></h2>
<p class="part" data-startline="35" data-endline="35" data-position="1305" data-size="0"><span data-position="1305" data-size="69">Here&#8217;s how I got this working (or rather, how it got itself working):</span></p>
<p class="part" data-startline="37" data-endline="38" data-position="1376" data-size="0"><strong data-position="1376" data-size="0"><span data-position="1378" data-size="13">Installation:</span></strong><br />
<span data-position="1394" data-size="78">Chrome DevTools MCP already configured from Experiment #2. Nothing new needed.</span></p>
<p class="part" data-startline="40" data-endline="41" data-position="1474" data-size="0"><strong data-position="1474" data-size="0"><span data-position="1476" data-size="14">Configuration:</span></strong><br />
<span data-position="1493" data-size="127">Discovered Claude Code had read a &#8220;deterministic testing&#8221; markdown file I&#8217;d forgotten about. That file explained concepts like:</span></p>
<ul class="part" data-startline="42" data-endline="46" data-position="1621" data-size="0">
<li class="" data-startline="42" data-endline="42" data-position="1623" data-size="0"><span data-position="1623" data-size="101">Moving from agentic (AI-driven, somewhat unpredictable) to deterministic (scripted, reliable) testing</span></li>
<li class="" data-startline="43" data-endline="43" data-position="1727" data-size="0"><span data-position="1727" data-size="25">Creating action libraries</span></li>
<li class="" data-startline="44" data-endline="44" data-position="1755" data-size="0"><span data-position="1755" data-size="28">Building YAML specifications</span></li>
<li class="" data-startline="45" data-endline="46" data-position="1786" data-size="0"><span data-position="1786" data-size="25">Test execution frameworks</span></li>
</ul>
<p class="part" data-startline="47" data-endline="48" data-position="1813" data-size="0"><strong data-position="1813" data-size="0"><span data-position="1815" data-size="15">Starting Point:</span></strong><br />
<span data-position="1833" data-size="106">Picking up where Experiment #2 unexpectedly pivoted &#8211; with three slash commands Claude Code had generated:</span></p>
<ul class="part" data-startline="49" data-endline="52" data-position="1940" data-size="0">
<li class="" data-startline="49" data-endline="49" data-position="1942" data-size="0"><code data-position="1943" data-size="9">/run-test</code><span data-position="1953" data-size="55"> &#8211; Execute markdown test case using Chrome DevTools MCP</span></li>
<li class="" data-startline="50" data-endline="50" data-position="2011" data-size="0"><code data-position="2012" data-size="21">/convert-test-to-yaml</code><span data-position="2034" data-size="42"> &#8211; Create deterministic YAML specification</span></li>
<li class="" data-startline="51" data-endline="52" data-position="2079" data-size="0"><code data-position="2080" data-size="14">/create-action</code><span data-position="2095" data-size="32"> &#8211; Build reusable action library</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="55" data-endline="55" id="The-Experiment" data-id="The-Experiment"><a class="anchor hidden-xs" href="#The-Experiment" title="The-Experiment" data-size="14" data-position="2137" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="2145" data-size="14">The Experiment</span></h2>
<p class="part" data-startline="57" data-endline="57" data-position="2153" data-size="0"><span data-position="2153" data-size="93">I followed the three-step workflow Claude Code had created to see what would actually happen.</span></p>
<h3 class="part" data-startline="59" data-endline="59" id="Try-1-Run-the-agentic-test" data-id="Try-1-Run-the-agentic-test"><a class="anchor hidden-xs" href="#Try-1-Run-the-agentic-test" title="Try-1-Run-the-agentic-test" data-size="28" data-position="2252" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="2260" data-size="28">Try #1: Run the agentic test</span></h3>
<p class="part" data-startline="61" data-endline="61" data-position="2282" data-size="0"><strong data-position="2282" data-size="0"><span data-position="2284" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="62" data-endline="64" data-infoprefix-length="0" data-position="2300">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/run-test test-cases/test-management/TC-001-add-investment-account.md
</code></pre>
</div>
<p class="part" data-startline="66" data-endline="67" data-position="2379" data-size="0"><strong data-position="2379" data-size="0"><span data-position="2381" data-size="14">What happened:</span></strong><br />
<span data-position="2398" data-size="74">Claude Code executed the markdown test case using Chrome DevTools MCP. It:</span></p>
<ul class="part" data-startline="68" data-endline="77" data-position="2473" data-size="0">
<li class="" data-startline="68" data-endline="68" data-position="2475" data-size="0"><span data-position="2475" data-size="35">Navigated to the accounts dashboard</span></li>
<li class="" data-startline="69" data-endline="69" data-position="2513" data-size="0"><span data-position="2513" data-size="32">Clicked the &#8220;Add Account&#8221; button</span></li>
<li class="" data-startline="70" data-endline="70" data-position="2548" data-size="0"><span data-position="2548" data-size="34">Selected &#8220;Investment&#8221; account type</span></li>
<li class="" data-startline="71" data-endline="71" data-position="2585" data-size="0"><span data-position="2585" data-size="41">Filled in account name: &#8220;Main Investment&#8221;</span></li>
<li class="" data-startline="72" data-endline="72" data-position="2629" data-size="0"><span data-position="2629" data-size="46">Filled in description: &#8220;My Investment Account&#8221;</span></li>
<li class="" data-startline="73" data-endline="73" data-position="2678" data-size="0"><span data-position="2678" data-size="18">Submitted the form</span></li>
<li class="" data-startline="74" data-endline="74" data-position="2699" data-size="0"><span data-position="2699" data-size="32">Verified the account was created</span></li>
<li class="" data-startline="75" data-endline="75" data-position="2734" data-size="0"><span data-position="2734" data-size="49">Hovered over the account to show highlight effect</span></li>
<li class="" data-startline="76" data-endline="77" data-position="2786" data-size="0"><span data-position="2786" data-size="27">Completed all 13 test steps</span></li>
</ul>
<p class="part" data-startline="78" data-endline="78" data-position="2815" data-size="0"><span data-position="2815" data-size="41">But it didn&#8217;t just run the test. It also:</span></p>
<ul class="part" data-startline="79" data-endline="89" data-position="2857" data-size="0">
<li class="" data-startline="79" data-endline="79" data-position="2859" data-size="0"><span data-position="2859" data-size="10">Created a </span><code data-position="2870" data-size="13">test-evidence</code><span data-position="2884" data-size="7"> folder</span></li>
<li class="" data-startline="80" data-endline="80" data-position="2894" data-size="0"><span data-position="2894" data-size="34">Captured screenshots at key points</span></li>
<li class="" data-startline="81" data-endline="89" data-position="2931" data-size="0"><span data-position="2931" data-size="53">Generated a comprehensive test execution report with:</span>
<ul data-position="2987" data-size="0">
<li class="" data-startline="82" data-endline="82" data-position="2989" data-size="0"><span data-position="2989" data-size="7">Summary</span></li>
<li class="" data-startline="83" data-endline="83" data-position="3001" data-size="0"><span data-position="3001" data-size="17">Execution details</span></li>
<li class="" data-startline="84" data-endline="84" data-position="3023" data-size="0"><span data-position="3023" data-size="33">Step-by-step verification results</span></li>
<li class="" data-startline="85" data-endline="85" data-position="3061" data-size="0"><span data-position="3061" data-size="17">Evidence captured</span></li>
<li class="" data-startline="86" data-endline="86" data-position="3083" data-size="0"><span data-position="3083" data-size="12">Observations</span></li>
<li class="" data-startline="87" data-endline="87" data-position="3100" data-size="0"><span data-position="3100" data-size="19">Issues (none found)</span></li>
<li class="" data-startline="88" data-endline="89" data-position="3124" data-size="0"><span data-position="3124" data-size="19">Test status: PASSED</span></li>
</ul>
</li>
</ul>
<p class="part" data-startline="90" data-endline="90" data-position="3145" data-size="0"><strong data-position="3145" data-size="0"><span data-position="3147" data-size="76">Wait, it created a complete test execution framework just from the markdown?</span></strong></p>
<p class="part" data-startline="92" data-endline="92" data-position="3227" data-size="0"><span data-position="3227" data-size="110">That&#8217;s what I wasn&#8217;t expecting. It built evidence capture, reporting, and verification tracking automatically.</span></p>
<hr class="" />
<h3 class="part" data-startline="96" data-endline="96" id="Try-2-Convert-to-YAML-specification" data-id="Try-2-Convert-to-YAML-specification"><a class="anchor hidden-xs" href="#Try-2-Convert-to-YAML-specification" title="Try-2-Convert-to-YAML-specification" data-size="37" data-position="3348" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="3356" data-size="37">Try #2: Convert to YAML specification</span></h3>
<p class="part" data-startline="98" data-endline="98" data-position="3387" data-size="0"><strong data-position="3387" data-size="0"><span data-position="3389" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="99" data-endline="101" data-infoprefix-length="0" data-position="3405">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/convert-test-to-yaml test-cases/test-management/TC-001-add-investment-account.md
</code></pre>
</div>
<p class="part" data-startline="103" data-endline="104" data-position="3496" data-size="0"><strong data-position="3496" data-size="0"><span data-position="3498" data-size="14">What happened:</span></strong><br />
<span data-position="3515" data-size="56">Claude Code created a structured YAML specification. It:</span></p>
<ul class="part" data-startline="105" data-endline="119" data-position="3572" data-size="0">
<li class="" data-startline="105" data-endline="105" data-position="3574" data-size="0"><span data-position="3574" data-size="10">Created a </span><code data-position="3585" data-size="10">test-specs</code><span data-position="3596" data-size="7"> folder</span></li>
<li class="" data-startline="106" data-endline="117" data-position="3606" data-size="0"><span data-position="3606" data-size="27">Generated a YAML file with:</span>
<ul data-position="3636" data-size="0">
<li class="" data-startline="107" data-endline="107" data-position="3638" data-size="0"><span data-position="3638" data-size="46">Metadata (test ID, functional area, timestamp)</span></li>
<li class="" data-startline="108" data-endline="108" data-position="3689" data-size="0"><span data-position="3689" data-size="37">Preconditions (verified text on page)</span></li>
<li class="" data-startline="109" data-endline="114" data-position="3731" data-size="0"><span data-position="3731" data-size="55">Steps using Chrome DevTools MCP commands as primitives:</span>
<ul data-position="3791" data-size="0">
<li class="" data-startline="110" data-endline="110" data-position="3793" data-size="0"><code data-position="3794" data-size="8">navigate</code><span data-position="3803" data-size="12"> &#8211; Go to URL</span></li>
<li class="" data-startline="111" data-endline="111" data-position="3822" data-size="0"><code data-position="3823" data-size="12">click-button</code><span data-position="3836" data-size="17"> &#8211; Click elements</span></li>
<li class="" data-startline="112" data-endline="112" data-position="3860" data-size="0"><code data-position="3861" data-size="15">select-dropdown</code><span data-position="3877" data-size="17"> &#8211; Choose options</span></li>
<li class="" data-startline="113" data-endline="113" data-position="3901" data-size="0"><code data-position="3902" data-size="9">fill-text</code><span data-position="3912" data-size="13"> &#8211; Enter data</span></li>
<li class="" data-startline="114" data-endline="114" data-position="3932" data-size="0"><code data-position="3933" data-size="11">verify-text</code><span data-position="3945" data-size="26"> &#8211; Assert expected content</span></li>
</ul>
</li>
<li class="" data-startline="115" data-endline="115" data-position="3976" data-size="0"><span data-position="3976" data-size="24">Assertions for each step</span></li>
<li class="" data-startline="116" data-endline="116" data-position="4005" data-size="0"><span data-position="4005" data-size="40">Evidence collection points (screenshots)</span></li>
<li class="" data-startline="117" data-endline="117" data-position="4050" data-size="0"><span data-position="4050" data-size="21">Custom actions needed</span></li>
</ul>
</li>
<li class="" data-startline="118" data-endline="119" data-position="4074" data-size="0"><span data-position="4074" data-size="62">Generated a conversion notes document explaining the structure</span></li>
</ul>
<p class="part" data-startline="120" data-endline="120" data-position="4138" data-size="0"><span data-position="4138" data-size="177">The YAML spec captured everything from the agentic run &#8211; navigation steps, form interactions, verifications &#8211; but structured it as commands that could execute deterministically.</span></p>
<p class="part" data-startline="122" data-endline="122" data-position="4317" data-size="0"><strong data-position="4317" data-size="0"><span data-position="4319" data-size="93">This is a &#8220;run twice&#8221; pattern &#8211; agentic first to explore, then deterministic for reliability.</span></strong></p>
<p class="part" data-startline="124" data-endline="124" data-position="4416" data-size="0"><span data-position="4416" data-size="141">The first run uses the LLM to figure out how to interact with the application. The second run captures that as a deterministic specification.</span></p>
<hr class="" />
<h3 class="part" data-startline="128" data-endline="128" id="Try-3-Create-reusable-action-library" data-id="Try-3-Create-reusable-action-library"><a class="anchor hidden-xs" href="#Try-3-Create-reusable-action-library" title="Try-3-Create-reusable-action-library" data-size="38" data-position="4568" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="4576" data-size="38">Try #3: Create reusable action library</span></h3>
<p class="part" data-startline="130" data-endline="130" data-position="4608" data-size="0"><strong data-position="4608" data-size="0"><span data-position="4610" data-size="13">What I asked:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="131" data-endline="133" data-infoprefix-length="0" data-position="4626">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/create-action "add a new account through the dashboard modal"
</code></pre>
</div>
<p class="part" data-startline="135" data-endline="136" data-position="4698" data-size="0"><strong data-position="4698" data-size="0"><span data-position="4700" data-size="14">What happened:</span></strong><br />
<span data-position="4717" data-size="63">Claude Code extracted a reusable action from the test case. It:</span></p>
<ul class="part" data-startline="137" data-endline="144" data-position="4781" data-size="0">
<li class="" data-startline="137" data-endline="137" data-position="4783" data-size="0"><span data-position="4783" data-size="10">Created a </span><code data-position="4794" data-size="16">reusable-actions</code><span data-position="4811" data-size="7"> folder</span></li>
<li class="" data-startline="138" data-endline="144" data-position="4821" data-size="0"><span data-position="4821" data-size="39">Generated an &#8220;add account&#8221; action with:</span>
<ul data-position="4863" data-size="0">
<li class="" data-startline="139" data-endline="139" data-position="4865" data-size="0"><span data-position="4865" data-size="59">Parameters (account type, name, description, initial value)</span></li>
<li class="" data-startline="140" data-endline="140" data-position="4929" data-size="0"><span data-position="4929" data-size="20">Implementation steps</span></li>
<li class="" data-startline="141" data-endline="141" data-position="4954" data-size="0"><span data-position="4954" data-size="25">Selectors for UI elements</span></li>
<li class="" data-startline="142" data-endline="142" data-position="4984" data-size="0"><span data-position="4984" data-size="14">Error handling</span></li>
<li class="" data-startline="143" data-endline="144" data-position="5003" data-size="0"><span data-position="5003" data-size="16">Success criteria</span></li>
</ul>
</li>
</ul>
<p class="part" data-startline="145" data-endline="145" data-position="5021" data-size="0"><span data-position="5021" data-size="202">Here&#8217;s what&#8217;s interesting: the original test case was specific &#8211; &#8220;add an investment account with these exact values.&#8221; But the action it extracted was generic &#8211; &#8220;add any type of account with any values.&#8221;</span></p>
<p class="part" data-startline="147" data-endline="147" data-position="5225" data-size="0"><strong data-position="5225" data-size="0"><span data-position="5227" data-size="25">That&#8217;s pretty impressive!</span></strong></p>
<p class="part" data-startline="149" data-endline="149" data-position="5256" data-size="0"><span data-position="5256" data-size="172">It&#8217;s building a test automation framework without being explicitly asked &#8211; extracting patterns and creating reusable components that could work for multiple test scenarios.</span></p>
<hr class="" />
<h2 class="part" data-startline="153" data-endline="153" id="Patterns-I-Noticed" data-id="Patterns-I-Noticed"><a class="anchor hidden-xs" href="#Patterns-I-Noticed" title="Patterns-I-Noticed" data-size="18" data-position="5438" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5446" data-size="18">Patterns I Noticed</span></h2>
<p class="part" data-startline="155" data-endline="155" data-position="5458" data-size="0"><span data-position="5458" data-size="78">After running through the three-command workflow, some clear patterns emerged:</span></p>
<p class="part" data-startline="157" data-endline="157" data-position="5538" data-size="0"><strong data-position="5538" data-size="0"><span data-position="5540" data-size="15">Works well for:</span></strong></p>
<ul class="part" data-startline="158" data-endline="163" data-position="5558" data-size="0">
<li class="" data-startline="158" data-endline="158" data-position="5560" data-size="0"><span data-position="5560" data-size="81">Converting agentic (unreliable) runs into deterministic (reliable) specifications</span></li>
<li class="" data-startline="159" data-endline="159" data-position="5644" data-size="0"><span data-position="5644" data-size="52">Extracting reusable actions from specific test cases</span></li>
<li class="" data-startline="160" data-endline="160" data-position="5699" data-size="0"><span data-position="5699" data-size="70">Capturing test evidence automatically (screenshots, execution reports)</span></li>
<li class="" data-startline="161" data-endline="161" data-position="5772" data-size="0"><span data-position="5772" data-size="34">Parameterizing test data for reuse</span></li>
<li class="" data-startline="162" data-endline="163" data-position="5809" data-size="0"><span data-position="5809" data-size="59">Building action libraries incrementally from executed tests</span></li>
</ul>
<p class="part" data-startline="164" data-endline="164" data-position="5870" data-size="0"><strong data-position="5870" data-size="0"><span data-position="5872" data-size="16">Gets messy with:</span></strong></p>
<ul class="part" data-startline="165" data-endline="167" data-position="5891" data-size="0">
<li class="" data-startline="165" data-endline="165" data-position="5893" data-size="0"><span data-position="5893" data-size="100">Need to understand what Claude Code actually built (lots of files generated across multiple folders)</span></li>
<li class="" data-startline="166" data-endline="167" data-position="5996" data-size="0"><span data-position="5996" data-size="80">Framework emerged from accidental context (the forgotten document) &#8211; not planned</span></li>
</ul>
<p class="part" data-startline="168" data-endline="168" data-position="6078" data-size="0"><strong data-position="6078" data-size="0"><span data-position="6080" data-size="10">Surprises:</span></strong></p>
<ul class="part" data-startline="169" data-endline="175" data-position="6093" data-size="0">
<li class="" data-startline="169" data-endline="169" data-position="6095" data-size="0"><span data-position="6095" data-size="55">Claude Code built an entire framework I wasn&#8217;t planning</span></li>
<li class="" data-startline="170" data-endline="170" data-position="6153" data-size="0"><span data-position="6153" data-size="52">&#8220;Run twice&#8221; pattern emerged: agentic → deterministic</span></li>
<li class="" data-startline="171" data-endline="171" data-position="6208" data-size="0"><span data-position="6208" data-size="66">Context from a forgotten document guided the entire implementation</span></li>
<li class="" data-startline="172" data-endline="172" data-position="6277" data-size="0"><span data-position="6277" data-size="48">Three-command workflow was created automatically</span></li>
<li class="" data-startline="173" data-endline="173" data-position="6328" data-size="0"><span data-position="6328" data-size="64">Framework suggested building a YAML test runner as the next step</span></li>
<li class="" data-startline="174" data-endline="175" data-position="6395" data-size="0"><span data-position="6395" data-size="56">It generalized specific test cases into reusable actions</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="178" data-endline="178" id="The-Honest-Take" data-id="The-Honest-Take"><a class="anchor hidden-xs" href="#The-Honest-Take" title="The-Honest-Take" data-size="15" data-position="6461" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="6469" data-size="15">The Honest Take</span></h2>
<p class="part" data-startline="180" data-endline="181" data-position="6478" data-size="0"><strong data-position="6478" data-size="0"><span data-position="6480" data-size="16"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick Verdict:</span></strong><br />
<span data-position="6499" data-size="55"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f7e1.png" alt="🟡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> AMBER: &#8220;Really interesting, no idea where this goes&#8221;</span></p>
<p class="part" data-startline="183" data-endline="183" data-position="6556" data-size="0"><strong data-position="6556" data-size="0"><span data-position="6558" data-size="9">The Good:</span></strong></p>
<ul class="part" data-startline="184" data-endline="190" data-position="6570" data-size="0">
<li class="" data-startline="184" data-endline="184" data-position="6572" data-size="0"><span data-position="6572" data-size="90">Solves a real problem: converting unreliable agentic tests to reliable deterministic tests</span></li>
<li class="" data-startline="185" data-endline="185" data-position="6665" data-size="0"><span data-position="6665" data-size="64">Three-step workflow makes sense: run → convert → extract actions</span></li>
<li class="" data-startline="186" data-endline="186" data-position="6732" data-size="0"><span data-position="6732" data-size="58">Automatically captures test evidence and execution reports</span></li>
<li class="" data-startline="187" data-endline="187" data-position="6793" data-size="0"><span data-position="6793" data-size="53">Creates parameterizable, reusable test specifications</span></li>
<li class="" data-startline="188" data-endline="188" data-position="6849" data-size="0"><span data-position="6849" data-size="55">Could enable a test case library that runs consistently</span></li>
<li class="" data-startline="189" data-endline="190" data-position="6907" data-size="0"><span data-position="6907" data-size="56">Extracts reusable patterns from specific implementations</span></li>
</ul>
<p class="part" data-startline="191" data-endline="191" data-position="6965" data-size="0"><strong data-position="6965" data-size="0"><span data-position="6967" data-size="13">The Concerns:</span></strong></p>
<ul class="part" data-startline="192" data-endline="198" data-position="6983" data-size="0">
<li class="" data-startline="192" data-endline="192" data-position="6985" data-size="0"><span data-position="6985" data-size="53">Completely unplanned &#8211; emerged from forgotten context</span></li>
<li class="" data-startline="193" data-endline="193" data-position="7041" data-size="0"><span data-position="7041" data-size="68">Haven&#8217;t validated the YAML specs actually work (no runner built yet)</span></li>
<li class="" data-startline="194" data-endline="194" data-position="7112" data-size="0"><span data-position="7112" data-size="29">No YAML test runner built yet</span></li>
<li class="" data-startline="195" data-endline="195" data-position="7144" data-size="0"><span data-position="7144" data-size="50">Lots of generated files to understand and validate</span></li>
<li class="" data-startline="196" data-endline="196" data-position="7197" data-size="0"><span data-position="7197" data-size="45">Unknown if this scales to multiple test cases</span></li>
<li class="" data-startline="197" data-endline="198" data-position="7245" data-size="0"><span data-position="7245" data-size="60">Need to understand what Claude Code built before trusting it</span></li>
</ul>
<p class="part" data-startline="199" data-endline="200" data-position="7307" data-size="0"><strong data-position="7307" data-size="0"><span data-position="7309" data-size="17">Would I use this?</span></strong><br />
<span data-position="7329" data-size="61">Maybe &#8211; need to complete the framework and validate it works.</span></p>
<p class="part" data-startline="202" data-endline="202" data-position="7392" data-size="0"><span data-position="7392" data-size="161">The &#8220;run twice&#8221; pattern feels right: agentic for exploration, deterministic for reliability. If the YAML specs actually execute reliably, this could be valuable.</span></p>
<p class="part" data-startline="204" data-endline="204" data-position="7555" data-size="0"><strong data-position="7555" data-size="0"><span data-position="7557" data-size="9">For what?</span></strong></p>
<ul class="part" data-startline="205" data-endline="209" data-position="7569" data-size="0">
<li class="" data-startline="205" data-endline="205" data-position="7571" data-size="0"><span data-position="7571" data-size="81">When you need reliable test execution but want the speed of agentic test creation</span></li>
<li class="" data-startline="206" data-endline="206" data-position="7655" data-size="0"><span data-position="7655" data-size="60">Building test automation frameworks from exploratory testing</span></li>
<li class="" data-startline="207" data-endline="207" data-position="7718" data-size="0"><span data-position="7718" data-size="53">Creating action libraries from executed test patterns</span></li>
<li class="" data-startline="208" data-endline="209" data-position="7774" data-size="0"><span data-position="7774" data-size="58">Capturing test specifications from manual testing sessions</span></li>
</ul>
<p class="part" data-startline="210" data-endline="210" data-position="7834" data-size="0"><strong data-position="7834" data-size="0"><span data-position="7836" data-size="24">When would I NOT use it?</span></strong></p>
<ul class="part" data-startline="211" data-endline="214" data-position="7863" data-size="0">
<li class="" data-startline="211" data-endline="211" data-position="7865" data-size="0"><span data-position="7865" data-size="72">When I need deterministic tests immediately (framework not complete yet)</span></li>
<li class="" data-startline="212" data-endline="212" data-position="7940" data-size="0"><span data-position="7940" data-size="55">For simple tests where plain Playwright would be faster</span></li>
<li class="" data-startline="213" data-endline="214" data-position="7998" data-size="0"><span data-position="7998" data-size="72">Until I understand what Claude Code actually built and validate it works</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="217" data-endline="217" id="Still-Curious-About" data-id="Still-Curious-About"><a class="anchor hidden-xs" href="#Still-Curious-About" title="Still-Curious-About" data-size="19" data-position="8080" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="8088" data-size="19">Still Curious About</span></h2>
<p class="part" data-startline="219" data-endline="219" data-position="8101" data-size="0"><span data-position="8101" data-size="53">What I&#8217;m still curious about and want to test further</span><span class="smartypants" data-position="8154" data-size="3">…</span></p>
<ul class="part" data-startline="221" data-endline="228" data-position="8159" data-size="0">
<li class="" data-startline="221" data-endline="221" data-position="8161" data-size="0"><span data-position="8161" data-size="45">Can the YAML specs actually execute reliably?</span></li>
<li class="" data-startline="222" data-endline="222" data-position="8209" data-size="0"><span data-position="8209" data-size="78">How would the YAML test runner work? (Claude Code suggested this as next step)</span></li>
<li class="" data-startline="223" data-endline="223" data-position="8290" data-size="0"><span data-position="8290" data-size="52">Does this scale to dozens or hundreds of test cases?</span></li>
<li class="" data-startline="224" data-endline="224" data-position="8345" data-size="0"><span data-position="8345" data-size="62">Can I build an action library that covers most test scenarios?</span></li>
<li class="" data-startline="225" data-endline="225" data-position="8410" data-size="0"><span data-position="8410" data-size="70">Is the &#8220;run twice&#8221; pattern a general principle for AI test automation?</span></li>
<li class="" data-startline="226" data-endline="226" data-position="8483" data-size="0"><span data-position="8483" data-size="70">What happens if the application UI changes &#8211; can the YAML specs adapt?</span></li>
<li class="" data-startline="227" data-endline="228" data-position="8556" data-size="0"><span data-position="8556" data-size="51">Could this work for API testing or just UI testing?</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="231" data-endline="231" id="The-Main-Lesson" data-id="The-Main-Lesson"><a class="anchor hidden-xs" href="#The-Main-Lesson" title="The-Main-Lesson" data-size="15" data-position="8617" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="8625" data-size="15">The Main Lesson</span></h2>
<p class="part" data-startline="233" data-endline="233" data-position="8634" data-size="0"><strong data-position="8634" data-size="0"><span data-position="8636" data-size="27">Context matters enormously.</span></strong></p>
<p class="part" data-startline="235" data-endline="235" data-position="8667" data-size="0"><span data-position="8667" data-size="116">A forgotten document about deterministic testing guided Claude Code to build an entire framework I wasn&#8217;t expecting.</span></p>
<p class="part" data-startline="237" data-endline="237" data-position="8785" data-size="0"><span data-position="8785" data-size="275">I was just exploring ideas with Claude Code &#8211; writing down thoughts about moving from agentic to deterministic testing, discussing action libraries, thinking about YAML specifications. That document sat in my project folder. I moved it to a temp location and forgot about it.</span></p>
<p class="part" data-startline="239" data-endline="239" data-position="9062" data-size="0"><span data-position="9062" data-size="215">When I started Experiment #2 and said &#8220;read all the files in this project,&#8221; Claude Code read that document. And when things went off the rails, that context guided it to build exactly what I&#8217;d been theorizing about.</span></p>
<p class="part in-view" data-startline="241" data-endline="241" data-position="9279" data-size="0"><span data-position="9279" data-size="25">This suggests a pattern: </span><strong data-position="9304" data-size="0"><span data-position="9306" data-size="128">have Claude Code help you explore ideas and concepts, keep those documents in context, and let that guide future implementation.</span></strong></p>
<p class="part in-view" data-startline="243" data-endline="243" data-position="9438" data-size="0"><span data-position="9438" data-size="167">I&#8217;m working this out as I go along, but the &#8220;run twice&#8221; pattern that emerged &#8211; agentic for exploration, then deterministic for reliability &#8211; feels like a real insight.</span></p>
<hr class="in-view" />
<h2 class="part in-view" data-startline="247" data-endline="247" id="The-Prompts-I-Actually-Used" data-id="The-Prompts-I-Actually-Used"><a class="anchor hidden-xs" href="#The-Prompts-I-Actually-Used" title="The-Prompts-I-Actually-Used" data-size="27" data-position="9615" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="9621" data-size="27">The Prompts I Actually Used</span></h2>
<p class="part in-view" data-startline="249" data-endline="249" data-position="9644" data-size="0"><span data-position="9644" data-size="72">If you&#8217;re interested in trying this, these are the exact prompts I used:</span></p>
<div class="part code-block-wrapper code-block-toolbar-handled in-view" data-startline="251" data-endline="257" data-infoprefix-length="8" data-position="9718">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="markdown hljs">/run-test test-cases/test-management/TC-001-add-investment-account.md

/convert-test-to-yaml test-cases/test-management/TC-001-add-investment-account.md

/create-action "add a new account through the dashboard modal"
</code></pre>
</div>
<p class="part in-view" data-startline="259" data-endline="259" data-position="9952" data-size="0"><strong data-position="9952" data-size="0"><span data-position="9954" data-size="14">Important Note</span></strong><span data-position="9971" data-size="195">: These slash commands were generated by Claude Code at the end of Experiment #2. They were guided by a forgotten &#8220;deterministic testing&#8221; markdown document that was sitting in my project context.</span></p>
<p class="part in-view" data-startline="261" data-endline="261" data-position="10167" data-size="0"><span data-position="10167" data-size="48">If you want to try this approach, you&#8217;d need to:</span></p>
<ol class="part in-view" data-startline="262" data-endline="266" data-position="10216" data-size="0">
<li class="" data-startline="262" data-endline="262" data-position="10219" data-size="0"><span data-position="10219" data-size="46">Set up Chrome DevTools MCP (see Experiment #2)</span></li>
<li class="" data-startline="263" data-endline="263" data-position="10269" data-size="0"><span data-position="10269" data-size="35">Create markdown test case documents</span></li>
<li class="" data-startline="264" data-endline="264" data-position="10308" data-size="0"><span data-position="10308" data-size="61">Give Claude Code context about deterministic testing concepts</span></li>
<li class="" data-startline="265" data-endline="266" data-position="10373" data-size="0"><span data-position="10373" data-size="66">Let it build the framework (or create the slash commands yourself)</span></li>
</ol>
<hr class="in-view" />
<h2 class="part in-view" data-startline="269" data-endline="269" id="Resources" data-id="Resources"><a class="anchor hidden-xs" href="#Resources" title="Resources" data-size="9" data-position="10449" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="10455" data-size="9">Resources</span></h2>
<ul class="part in-view" data-startline="271" data-endline="275" data-position="10460" data-size="0">
<li class="" data-startline="271" data-endline="271" data-position="10462" data-size="0"><strong data-position="10462" data-size="0"><span data-position="10464" data-size="19">Chrome DevTools MCP</span></strong><span data-position="10486" data-size="2">: </span><a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" target="_blank" rel="noopener"><span data-position="10462" data-size="0">https://github.com/ChromeDevTools/chrome-devtools-mcp</span></a></li>
<li class="" data-startline="272" data-endline="272" data-position="10543" data-size="0"><strong data-position="10543" data-size="0"><span data-position="10545" data-size="19">Financial Dashboard</span></strong><span data-position="10566" data-size="24"> (demo app): v0 Demo app</span></li>
<li class="" data-startline="273" data-endline="275" data-position="10593" data-size="0"><strong data-position="10593" data-size="0"><span data-position="10595" data-size="13">Experiment #2</span></strong><span data-position="10610" data-size="23"> (where this started): </span><a href="https://www.testmanagement.com/blog/2025/10/test-cases-automated-in-minutes-with-chrome-devtools-mcp/" target="_blank" rel="noopener"><span data-position="10593" data-size="0">https://www.testmanagement.com/blog/2025/10/test-cases-automated-in-minutes-with-chrome-devtools-mcp/</span></a></li>
</ul>
<p class="part in-view" data-startline="276" data-endline="276" data-position="10737" data-size="0"><strong data-position="10737" data-size="0"><span data-position="10739" data-size="26">Want to try this yourself?</span></strong></p>
<p class="part in-view" data-startline="278" data-endline="278" data-position="10769" data-size="0"><span data-position="10769" data-size="97">Watch this space &#8211; this needs follow-up to see if it actually delivers on the promise. I need to:</span></p>
<ol class="part in-view" data-startline="279" data-endline="283" data-position="10867" data-size="0">
<li class="" data-startline="279" data-endline="279" data-position="10870" data-size="0"><span data-position="10870" data-size="37">Validate the YAML specs actually work</span></li>
<li class="" data-startline="280" data-endline="280" data-position="10911" data-size="0"><span data-position="10911" data-size="54">Build (or have Claude Code build) the YAML test runner</span></li>
<li class="" data-startline="281" data-endline="281" data-position="10969" data-size="0"><span data-position="10969" data-size="29">Test with multiple test cases</span></li>
<li class="" data-startline="282" data-endline="283" data-position="11002" data-size="0"><span data-position="11002" data-size="41">See if the action library approach scales</span></li>
</ol>
<p class="part in-view" data-startline="284" data-endline="284" data-position="11045" data-size="0"><span data-position="11045" data-size="178">Let me know if you&#8217;ve experimented with agentic vs deterministic testing approaches &#8211; I&#8217;m especially curious about whether the &#8220;run twice&#8221; pattern resonates with your experience.</span></p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/automation-framework-with-claude-code/">AI Experiment #3: When Claude Code Builds a Framework You Didn&#8217;t Ask For</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Experiment #2: Test Case to Automated Execution with Chrome DevTools MCP</title>
		<link>https://www.testmanagement.com/blog/2025/10/test-cases-automated-in-minutes-with-chrome-devtools-mcp/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Wed, 15 Oct 2025 20:26:48 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12753</guid>

					<description><![CDATA[<p>Can you actually go straight from test case doc to automated execution? Thought I&#8217;d give this a go and see what kind of results I came up with. The Question &#8220;Can I just give Claude Code my test case document, connect the Chrome DevTools MCP, and have it run the tests? Like, actually run them [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/test-cases-automated-in-minutes-with-chrome-devtools-mcp/">AI Experiment #2: Test Case to Automated Execution with Chrome DevTools MCP</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="part" data-startline="3" data-endline="3" data-position="79" data-size="0"><strong data-position="79" data-size="0"><span data-position="81" data-size="71">Can you actually go straight from test case doc to automated execution?</span></strong></p>
<p class="part" data-startline="5" data-endline="5" data-position="156" data-size="0"><span data-position="156" data-size="71">Thought I&#8217;d give this a go and see what kind of results I came up with.</span></p>
<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/gAEcFoCEP9Q?si=smpzB-dXmffHn42H" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="" />
<h2 class="part" data-startline="9" data-endline="9" id="The-Question" data-id="The-Question"><a class="anchor hidden-xs" href="#The-Question" title="The-Question" data-size="12" data-position="237" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="208" data-size="12">The Question</span></h2>
<p class="part" data-startline="11" data-endline="11" data-position="251" data-size="0"><span data-position="251" data-size="212">&#8220;Can I just give Claude Code my test case document, connect the Chrome DevTools MCP, and have it run the tests? Like, actually run them in a real browser, without writing any test code or setting up a framework?&#8221;</span></p>
<p class="part" data-startline="13" data-endline="13" data-position="465" data-size="0"><span data-position="465" data-size="36">Potential scenarios for this include</span><span class="smartypants" data-position="501" data-size="4">…</span></p>
<ol data-size="0" data-position="508" data-endline="18" data-startline="15" class="part">
<li class="" data-startline="15" data-endline="16" data-position="511" data-size="0">
<p data-position="508" data-size="0"><span data-position="511" data-size="108">when you have documented test cases but no automation yet &#8211; could this give you instant automated execution?</span></p>
</li>
<li class="" data-startline="17" data-endline="18" data-position="625" data-size="0">
<p data-position="622" data-size="0"><span data-position="625" data-size="122">Maybe you could use this to figure out how to interact with difficult applications before building proper test frameworks.</span></p>
</li>
</ol>
<p class="part" data-startline="19" data-endline="19" data-position="749" data-size="0"><span data-position="749" data-size="108">Anyway, no point speculating about how to use this if it doesn&#8217;t work. We just need to know if it does work!</span></p>
<hr class="" />
<h2 class="part" data-startline="23" data-endline="23" id="What-Im-Using" data-id="What-Im-Using"><a class="anchor hidden-xs" href="#What-Im-Using" title="What-Im-Using" data-size="14" data-position="867" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="842" data-size="14">What I&#8217;m Using</span></h2>
<ul class="part" data-startline="25" data-endline="29" data-position="883" data-size="0">
<li class="" data-startline="25" data-endline="25" data-position="885" data-size="0"><strong data-position="885" data-size="0"><span data-position="887" data-size="19">Chrome DevTools MCP</span></strong><span data-position="908" data-size="55"> &#8211; Model Context Protocol for Chrome browser automation</span></li>
<li class="" data-startline="26" data-endline="26" data-position="966" data-size="0"><strong data-position="966" data-size="0"><span data-position="968" data-size="11">Claude Code</span></strong><span data-position="981" data-size="39"> &#8211; AI coding assistant with MCP support</span></li>
<li class="" data-startline="27" data-endline="27" data-position="1023" data-size="0"><strong data-position="1023" data-size="0"><span data-position="1025" data-size="24">Demo financial dashboard</span></strong><span data-position="1051" data-size="19"> &#8211; Test application</span></li>
<li class="" data-startline="28" data-endline="29" data-position="1073" data-size="0"><strong data-position="1073" data-size="0"><span data-position="1075" data-size="28">Test case from Experiment #1</span></strong><span data-position="1105" data-size="54"> &#8211; Markdown-formatted test case I&#8217;d previously created</span></li>
</ul>
<p class="part" data-startline="30" data-endline="30" data-position="1161" data-size="0"><span data-position="1161" data-size="140">I was curious whether the Chrome DevTools MCP could bridge the gap between human-readable test documentation and actual automated execution.</span></p>
<hr class="" />
<h2 class="part" data-startline="34" data-endline="34" id="The-Setup" data-id="The-Setup"><a class="anchor hidden-xs" href="#The-Setup" title="The-Setup" data-size="9" data-position="1311" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1286" data-size="9">The Setup</span></h2>
<p class="part" data-startline="36" data-endline="36" data-position="1322" data-size="0"><span data-position="1322" data-size="30">Here&#8217;s how I got this working:</span></p>
<p class="part" data-startline="38" data-endline="39" data-position="1354" data-size="0"><strong data-position="1354" data-size="0"><span data-position="1356" data-size="13">Installation:</span></strong><br />
<span data-position="1372" data-size="76">First you need Node and NPM installed. Then install the Chrome DevTools MCP:</span></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="41" data-endline="43" data-infoprefix-length="4" data-position="1450">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="bash hljs">npm install -g chrome-devtools-mcp@latest
</code></pre>
</div>
<p class="part" data-startline="45" data-endline="45" data-position="1505" data-size="0"><span data-position="1505" data-size="104">I had ffmpeg already installed (it comes with a Playwright install), but you&#8217;ll need it for screenshots.</span></p>
<p class="part" data-startline="47" data-endline="48" data-position="1611" data-size="0"><strong data-position="1611" data-size="0"><span data-position="1613" data-size="14">Configuration:</span></strong><br />
<span data-position="1630" data-size="93">Add the Chrome DevTools MCP to Claude Code&#8217;s configuration. You can do this via command line:</span></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="50" data-endline="52" data-infoprefix-length="4" data-position="1725">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="bash hljs">claude mcp add chrome-devtools npx chrome-devtools-mcp@latest
</code></pre>
</div>
<p class="part" data-startline="54" data-endline="54" data-position="1800" data-size="0"><span data-position="1800" data-size="80">This updates your Claude Code configuration file to include the MCP integration.</span></p>
<p class="part" data-startline="56" data-endline="57" data-position="1882" data-size="0"><strong data-position="1882" data-size="0"><span data-position="1884" data-size="13">Verification:</span></strong><br />
<span data-position="1900" data-size="62">Start Claude Code and check that Claude can see the MCP using:</span></p>
<div class="part code-block-wrapper code-block-toolbar-handled" data-startline="58" data-endline="60" data-infoprefix-length="0" data-position="1963">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code>/mcp
</code></pre>
</div>
<p class="part" data-startline="62" data-endline="62" data-position="1977" data-size="0"><span data-position="1977" data-size="151">You should see chrome-devtools listed and connected. When I ran this, Claude actually fired up an initial Chrome instance just to verify it had access.</span></p>
<p class="part" data-startline="64" data-endline="65" data-position="2130" data-size="0"><strong data-position="2130" data-size="0"><span data-position="2132" data-size="10">Test Case:</span></strong><br />
<span data-position="2145" data-size="213">I used the test case created in Experiment #1 &#8211; a markdown file with structured test steps for adding an investment account. I added the application URL to the preconditions so Claude would know where to navigate.</span></p>
<p class="part" data-startline="67" data-endline="68" data-position="2360" data-size="0"><strong data-position="2360" data-size="0"><span data-position="2362" data-size="15">Starting Point:</span></strong><br />
<span data-position="2380" data-size="112">So my starting point was a fresh Claude Code session with the test case file and Chrome DevTools MCP configured.</span></p>
<hr class="" />
<h2 class="part" data-startline="72" data-endline="72" id="The-Experiment" data-id="The-Experiment"><a class="anchor hidden-xs" href="#The-Experiment" title="The-Experiment" data-size="14" data-position="2502" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="2400" data-size="14">The Experiment</span></h2>
<h3 class="part" data-startline="74" data-endline="74" id="Try-1-Initial-Prompt" data-id="Try-1-Initial-Prompt"><a class="anchor hidden-xs" href="#Try-1-Initial-Prompt" title="Try-1-Initial-Prompt" data-size="22" data-position="2522" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="2420" data-size="22">Try #1: Initial Prompt</span></h3>
<p class="part" data-startline="75" data-endline="75" data-position="2545" data-size="0"><span data-position="2545" data-size="21">I primed Claude Code:</span></p>
<blockquote class="part" data-startline="77" data-endline="77">
<p data-position="2570" data-size="0"><span data-position="2570" data-size="172">&#8220;You are an expert test automation engineer. Our goal is to take a test case documented in markdown and run it directly as an automated test using the Chrome DevTools MCP.&#8221;</span></p>
</blockquote>
<p class="part" data-startline="79" data-endline="79" data-position="2744" data-size="0"><span data-position="2744" data-size="45">Then I gave it the path to my test case file.</span></p>
<p class="part" data-startline="81" data-endline="82" data-position="2791" data-size="0"><strong data-position="2791" data-size="0"><span data-position="2793" data-size="14">What happened:</span></strong><br />
<span data-position="2810" data-size="79">Claude Code reviewed the test case, created a todo list to track execution, and</span><span class="smartypants" data-position="2889" data-size="3">…</span><span data-position="2892" data-size="74"> opened Chrome automatically. It navigated straight to the dashboard page.</span></p>
<p class="part" data-startline="84" data-endline="84" data-position="2968" data-size="0"><span data-position="2968" data-size="41">Then it clicked the &#8220;Add Account&#8221; button.</span></p>
<p class="part" data-startline="86" data-endline="86" data-position="3011" data-size="0"><span data-position="3011" data-size="185">That&#8217;s pretty amazing. We&#8217;ve gone from a standard human-readable test case directly to automating it in a browser with no framework, no code &#8211; just directly via the Chrome DevTools MCP.</span></p>
<p class="part" data-startline="88" data-endline="88" data-position="3198" data-size="0"><span data-position="3198" data-size="156">I&#8217;m genuinely surprised. It followed every step in my test documentation &#8211; clicked buttons, filled forms, validated results. All from my markdown test case.</span></p>
<p class="part" data-startline="90" data-endline="90" data-position="3356" data-size="0"><span data-position="3356" data-size="149">It actually caught specific details &#8211; the account name I specified, the exact description text, even the modal form behavior and validation messages.</span></p>
<p class="part" data-startline="92" data-endline="92" data-position="3507" data-size="0"><span data-position="3507" data-size="25">That&#8217;s pretty impressive!</span></p>
<h3 class="part" data-startline="94" data-endline="94" id="Try-2-Verify-Consistency" data-id="Try-2-Verify-Consistency"><a class="anchor hidden-xs" href="#Try-2-Verify-Consistency" title="Try-2-Verify-Consistency" data-size="26" data-position="3538" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="3436" data-size="26">Try #2: Verify Consistency</span></h3>
<p class="part" data-startline="95" data-endline="95" data-position="3565" data-size="0"><span data-position="3565" data-size="58">I ran the test again to see if it would work consistently.</span></p>
<p class="part" data-startline="97" data-endline="98" data-position="3625" data-size="0"><strong data-position="3625" data-size="0"><span data-position="3627" data-size="14">What happened:</span></strong><br />
<span data-position="3644" data-size="101">Second run was actually quicker. Claude had context from the first run and executed more efficiently.</span></p>
<p class="part" data-startline="100" data-endline="101" data-position="3747" data-size="0"><strong data-position="3747" data-size="0"><span data-position="3749" data-size="15">What I learned:</span></strong><br />
<span data-position="3767" data-size="118">The approach is repeatable. Once Claude understands your test case structure, subsequent runs are faster and smoother.</span></p>
<h3 class="part" data-startline="103" data-endline="103" id="Try-3-Token-Usage-Check" data-id="Try-3-Token-Usage-Check"><a class="anchor hidden-xs" href="#Try-3-Token-Usage-Check" title="Try-3-Token-Usage-Check" data-size="25" data-position="3891" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="3789" data-size="25">Try #3: Token Usage Check</span></h3>
<p class="part" data-startline="104" data-endline="104" data-position="3917" data-size="0"><span data-position="3917" data-size="104">I wanted to understand the cost implications. Using a tool called CC Usage to monitor token consumption:</span></p>
<p class="part" data-startline="106" data-endline="107" data-position="4023" data-size="0"><strong data-position="4023" data-size="0"><span data-position="4025" data-size="7">Result:</span></strong><br />
<span data-position="4035" data-size="122">Each test run consumed about 1-2% of my session token allocation. That means roughly 50-100 test runs per session maximum.</span></p>
<p class="part" data-startline="109" data-endline="110" data-position="4159" data-size="0"><strong data-position="4159" data-size="0"><span data-position="4161" data-size="12">Observation:</span></strong><br />
<span data-position="4176" data-size="231">Not free, but not prohibitive either. For exploratory testing or figuring out automation approaches, this token cost is worth it. For CI/CD pipeline runs with hundreds of tests daily, you&#8217;d want a more deterministic coded approach.</span></p>
<hr class="" />
<h2 class="part" data-startline="114" data-endline="114" id="Patterns-I-Noticed" data-id="Patterns-I-Noticed"><a class="anchor hidden-xs" href="#Patterns-I-Noticed" title="Patterns-I-Noticed" data-size="18" data-position="4417" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="4315" data-size="18">Patterns I Noticed</span></h2>
<p class="part" data-startline="116" data-endline="116" data-position="4437" data-size="0"><span data-position="4437" data-size="51">After testing this approach, some patterns emerged:</span></p>
<p class="part" data-startline="118" data-endline="118" data-position="4490" data-size="0"><strong data-position="4490" data-size="0"><span data-position="4492" data-size="15">Works well for:</span></strong></p>
<ul class="part" data-startline="119" data-endline="125" data-position="4510" data-size="0">
<li class="" data-startline="119" data-endline="119" data-position="4512" data-size="0"><span data-position="4512" data-size="43">Initial automation of documented test cases</span></li>
<li class="" data-startline="120" data-endline="120" data-position="4558" data-size="0"><span data-position="4558" data-size="78">Exploratory test automation &#8211; figuring out how to interact with an application</span></li>
<li class="" data-startline="121" data-endline="121" data-position="4639" data-size="0"><span data-position="4639" data-size="59">Applications where you&#8217;re unsure of the automation approach</span></li>
<li class="" data-startline="122" data-endline="122" data-position="4701" data-size="0"><span data-position="4701" data-size="62">Generating automation insights before building test frameworks</span></li>
<li class="" data-startline="123" data-endline="123" data-position="4766" data-size="0"><span data-position="4766" data-size="32">Quick verification of test cases</span></li>
<li class="" data-startline="124" data-endline="125" data-position="4801" data-size="0"><span data-position="4801" data-size="51">Learning how to interact with complex UI components</span></li>
</ul>
<p class="part" data-startline="126" data-endline="126" data-position="4854" data-size="0"><strong data-position="4854" data-size="0"><span data-position="4856" data-size="16">Gets messy with:</span></strong></p>
<ul class="part" data-startline="127" data-endline="132" data-position="4875" data-size="0">
<li class="" data-startline="127" data-endline="127" data-position="4877" data-size="0"><span data-position="4877" data-size="51">Long exploratory sessions (with no clear objective)</span></li>
<li class="" data-startline="128" data-endline="128" data-position="4931" data-size="0"><span data-position="4931" data-size="36">Tests requiring exact timing control</span></li>
<li class="" data-startline="129" data-endline="129" data-position="4970" data-size="0"><span data-position="4970" data-size="46">High-volume test execution (token consumption)</span></li>
<li class="" data-startline="130" data-endline="130" data-position="5019" data-size="0"><span data-position="5019" data-size="58">Production CI/CD pipelines (need deterministic frameworks)</span></li>
<li class="" data-startline="131" data-endline="132" data-position="5080" data-size="0"><span data-position="5080" data-size="59">Tests with two-factor authentication or complex login flows</span></li>
</ul>
<p class="part" data-startline="133" data-endline="133" data-position="5141" data-size="0"><strong data-position="5141" data-size="0"><span data-position="5143" data-size="10">Surprises:</span></strong></p>
<ul class="part" data-startline="134" data-endline="140" data-position="5156" data-size="0">
<li class="" data-startline="134" data-endline="134" data-position="5158" data-size="0"><span data-position="5158" data-size="40">It actually followed test steps reliably</span></li>
<li class="" data-startline="135" data-endline="135" data-position="5201" data-size="0"><span data-position="5201" data-size="150">Chrome DevTools MCP has comprehensive browser control (list console messages, network requests, screenshots, drag, hover, fill forms, click, navigate)</span></li>
<li class="" data-startline="136" data-endline="136" data-position="5354" data-size="0"><span data-position="5354" data-size="48">The test execution logs were detailed and useful</span></li>
<li class="" data-startline="137" data-endline="137" data-position="5405" data-size="0"><span data-position="5405" data-size="129">You could potentially use all the telemetry from Chrome DevTools to generate Playwright scripts for more deterministic automation</span></li>
<li class="" data-startline="138" data-endline="138" data-position="5537" data-size="0"><span data-position="5537" data-size="65">Claude suggested creating a slash command to make this repeatable</span></li>
<li class="" data-startline="139" data-endline="140" data-position="5605" data-size="0"><span data-position="5605" data-size="95">It even started suggesting ways to make the approach more deterministic (YAML test case format)</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="143" data-endline="143" id="The-Honest-Take" data-id="The-Honest-Take"><a class="anchor hidden-xs" href="#The-Honest-Take" title="The-Honest-Take" data-size="15" data-position="5710" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5608" data-size="15">The Honest Take</span></h2>
<p class="part" data-startline="145" data-endline="146" data-position="5727" data-size="0"><strong data-position="5727" data-size="0"><span data-position="5729" data-size="16"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick Verdict:</span></strong><br />
<span data-position="5748" data-size="24"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> I&#8217;d use this tomorrow</span></p>
<p class="part" data-startline="148" data-endline="149" data-position="5774" data-size="0"><strong data-position="5774" data-size="0"><span data-position="5776" data-size="17">Would I use this?</span></strong><br />
<span data-position="5796" data-size="70">Absolutely. Not for everything, but definitely for specific scenarios.</span></p>
<p class="part" data-startline="151" data-endline="151" data-position="5868" data-size="0"><strong data-position="5868" data-size="0"><span data-position="5870" data-size="9">For what?</span></strong></p>
<ul class="part" data-startline="152" data-endline="157" data-position="5882" data-size="0">
<li class="" data-startline="152" data-endline="152" data-position="5884" data-size="0"><span data-position="5884" data-size="87">Working out how to interact with difficult applications before building test automation</span></li>
<li class="" data-startline="153" data-endline="153" data-position="5974" data-size="0"><span data-position="5974" data-size="67">Initial automation of existing test cases to understand feasibility</span></li>
<li class="" data-startline="154" data-endline="154" data-position="6044" data-size="0"><span data-position="6044" data-size="52">Exploratory automation where you need quick feedback</span></li>
<li class="" data-startline="155" data-endline="155" data-position="6099" data-size="0"><span data-position="6099" data-size="55">Generating insights for building proper test frameworks</span></li>
<li class="" data-startline="156" data-endline="157" data-position="6157" data-size="0"><span data-position="6157" data-size="75">Applications with complex UI where you&#8217;re unsure of the automation approach</span></li>
</ul>
<p class="part" data-startline="158" data-endline="158" data-position="6234" data-size="0"><strong data-position="6234" data-size="0"><span data-position="6236" data-size="17">When would I NOT?</span></strong></p>
<ul class="part" data-startline="159" data-endline="161" data-position="6256" data-size="0">
<li class="" data-startline="159" data-endline="159" data-position="6258" data-size="0"><span data-position="6258" data-size="59">Production CI/CD pipelines (needs deterministic frameworks)</span></li>
<li class="" data-startline="160" data-endline="161" data-position="6320" data-size="0"><span data-position="6320" data-size="46">High-volume test execution (token consumption)</span></li>
</ul>
<p class="part" data-startline="162" data-endline="162" data-position="6368" data-size="0"><span data-position="6368" data-size="263">Token usage will add up with frequent runs, but you could test with lower-spec models to reduce costs. The real value is using this approach to figure out automation strategies, then converting to deterministic Playwright or similar frameworks for production use.</span></p>
<hr class="" />
<h2 class="part in-view" data-startline="166" data-endline="166" id="Still-Curious-About" data-id="Still-Curious-About"><a class="anchor hidden-xs" href="#Still-Curious-About" title="Still-Curious-About" data-size="19" data-position="6641" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="6539" data-size="19">Still Curious About</span></h2>
<p class="part in-view" data-startline="168" data-endline="168" data-position="6662" data-size="0"><span data-position="6662" data-size="53">What I&#8217;m still curious about and want to test further</span><span class="smartypants" data-position="6715" data-size="3">…</span></p>
<ul class="part in-view" data-startline="170" data-endline="176" data-position="6720" data-size="0">
<li class="" data-startline="170" data-endline="170" data-position="6722" data-size="0"><span data-position="6722" data-size="118">How consistent will this be over repeated runs? (It&#8217;s totally agentic &#8211; different models might give different results)</span></li>
<li class="" data-startline="171" data-endline="171" data-position="6843" data-size="0"><span data-position="6843" data-size="63">Will lower-spec models work as reliably with lower token costs?</span></li>
<li class="" data-startline="172" data-endline="172" data-position="6909" data-size="0"><span data-position="6909" data-size="118">Can I use all the Chrome DevTools telemetry to automatically generate Playwright scripts for deterministic automation?</span></li>
<li class="" data-startline="173" data-endline="173" data-position="7030" data-size="0"><span data-position="7030" data-size="105">Will this work with something like AGgrid or other complex component libraries? (That&#8217;ll be interesting!)</span></li>
<li class="" data-startline="174" data-endline="174" data-position="7138" data-size="0"><span data-position="7138" data-size="84">How would it handle applications with two-factor authentication or complex security?</span></li>
<li class="" data-startline="175" data-endline="176" data-position="7225" data-size="0"><span data-position="7225" data-size="34">Then I&#8217;m thinking &#8230;.. might this just work in a CI/CD pipeline?</span></li>
</ul>
<hr class="in-view" />
<h2 class="part in-view" data-startline="179" data-endline="179" id="The-Prompts-I-Actually-Used" data-id="The-Prompts-I-Actually-Used"><a class="anchor hidden-xs" href="#The-Prompts-I-Actually-Used" title="The-Prompts-I-Actually-Used" data-size="27" data-position="7269" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="7130" data-size="27">The Prompts I Actually Used</span></h2>
<p class="part in-view" data-startline="181" data-endline="181" data-position="7298" data-size="0"><span data-position="7298" data-size="72">If you&#8217;re interested in trying this, these are the exact prompts I used:</span></p>
<div class="part code-block-wrapper code-block-toolbar-handled in-view" data-startline="183" data-endline="197" data-infoprefix-length="8" data-position="7372">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="markdown hljs">Please review the files in this project.

Please check that you have access to the chrome devTools mcp

Please tell me which commands you can use with the chrome devTools mcp

You are an expert test automation engineer

Our goal is to take a test case documented in markdown and run it directly as an automated test using the chrome DevTools mcp

[path to test case markdown file]

please guide me on how to take the lessons learnt from this session and create a claude code slash command
</code></pre>
</div>
<hr class="in-view" />
<h2 class="part in-view" data-startline="201" data-endline="201" id="Resources" data-id="Resources"><a class="anchor hidden-xs" href="#Resources" title="Resources" data-size="9" data-position="7886" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="7747" data-size="9">Resources</span></h2>
<ul class="part in-view" data-startline="203" data-endline="208" data-position="7897" data-size="0">
<li class="" data-startline="203" data-endline="203" data-position="7899" data-size="0"><strong data-position="7899" data-size="0"><span data-position="7901" data-size="19">Chrome DevTools MCP</span></strong><span data-position="7923" data-size="2">: </span><a href="https://github.com/chrome-devtools/chrome-devtools-mcp" target="_blank" rel="noopener"><span data-position="7899" data-size="0">https://github.com/chrome-devtools/chrome-devtools-mcp</span></a></li>
<li class="" data-startline="204" data-endline="204" data-position="7981" data-size="0"><strong data-position="7981" data-size="0"><span data-position="7983" data-size="16">Demo Application</span></strong><span data-position="8002" data-size="2">:</span> Vercel Demo App<a href="https://v0-financial-dashboard-kappa-sepia-92.vercel.app/dashboard" target="_blank" rel="noopener"><span data-position="7981" data-size="0"></span></a></li>
<li class="" data-startline="205" data-endline="205" data-position="8072" data-size="0"><strong data-position="8072" data-size="0"><span data-position="8074" data-size="28">Test Case from Experiment #1</span></strong><span data-position="8105" data-size="47">: Created using the video-to-test-case approach</span></li>
<li class="" data-startline="206" data-endline="208" data-position="8154" data-size="0"><strong data-position="8154" data-size="0"><span data-position="8156" data-size="11">Claude Code</span></strong><span data-position="8170" data-size="2">: </span><a href="https://claude.com/claude-code" target="_blank" rel="noopener"><span data-position="8154" data-size="0">https://claude.com/claude-code</span></a></li>
</ul>
<p class="part in-view" data-startline="209" data-endline="209" data-position="8204" data-size="0"><strong data-position="8204" data-size="0"><span data-position="8206" data-size="26">Want to try this yourself?</span></strong></p>
<p class="part in-view" data-startline="211" data-endline="211" data-position="8236" data-size="0"><span data-position="8236" data-size="274">Really was simple to get setup once you have the Chrome DevTools MCP installed and configured. Let me know what happens when you try it &#8211; I&#8217;m especially curious about how it handles complex component libraries like AGgrid or applications with difficult authentication flows.</span></p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/test-cases-automated-in-minutes-with-chrome-devtools-mcp/">AI Experiment #2: Test Case to Automated Execution with Chrome DevTools MCP</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Experiment #1: Recording Videos and Converting Them to Test Cases</title>
		<link>https://www.testmanagement.com/blog/2025/10/ai-experiment-1-recording-videos-and-converting-them-to-test-cases/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Wed, 15 Oct 2025 20:13:11 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12749</guid>

					<description><![CDATA[<p>Can you actually record yourself testing and get test case documentation back automatically? I wondered if this works… so I tried it. The Question I hate writing test case documentation, especially after I&#8217;ve already done the testing manually. So I wondered… what if I just record a video of myself testing and let Claude Code [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/ai-experiment-1-recording-videos-and-converting-them-to-test-cases/">AI Experiment #1: Recording Videos and Converting Them to Test Cases</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="part" data-startline="3" data-endline="3" data-position="72" data-size="0"><strong data-position="72" data-size="0"><span data-position="74" data-size="92">Can you actually record yourself testing and get test case documentation back automatically?</span></strong></p>
<p class="part" data-startline="5" data-endline="5" data-position="170" data-size="0"><span data-position="170" data-size="24">I wondered if this works</span><span class="smartypants" data-position="194" data-size="3">…</span><span data-position="197" data-size="15"> so I tried it.</span></p>
<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/60kGt4AdPDk?si=1oBb3FAPxY06PjP-" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="" />
<h2 class="part" data-startline="11" data-endline="11" id="The-Question" data-id="The-Question"><a class="anchor hidden-xs" href="#The-Question" title="The-Question" data-size="12" data-position="227" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="222" data-size="12">The Question</span></h2>
<p class="part" data-startline="13" data-endline="13" data-position="241" data-size="0"><span data-position="241" data-size="110">I hate writing test case documentation, especially after I&#8217;ve already done the testing manually. So I wondered</span><span class="smartypants" data-position="351" data-size="3">…</span><span data-position="354" data-size="116"> what if I just record a video of myself testing and let Claude Code write the test cases? Could this actually work?</span></p>
<p class="part" data-startline="15" data-endline="15" data-position="472" data-size="0"><span data-position="472" data-size="428">I&#8217;m kind of thinking of two potential scenarios if this works. First, when you have something to test but nobody has bothered to write a decent spec &#8211; you could record yourself exploring the application and generate test cases from that. Second, maybe you have a wireframe of the application (before it&#8217;s built) and you can record yourself stepping through the wireframe to create your test cases before development even starts.</span></p>
<p class="part" data-startline="17" data-endline="17" data-position="902" data-size="0"><span data-position="902" data-size="87">Anyway, no point speculating about how to use this if it doesn&#8217;t work. So will it work?</span></p>
<hr class="" />
<h2 class="part" data-startline="21" data-endline="21" id="What-Im-Using" data-id="What-Im-Using"><a class="anchor hidden-xs" href="#What-Im-Using" title="What-Im-Using" data-size="14" data-position="999" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="994" data-size="14">What I&#8217;m Using</span></h2>
<ul class="part" data-startline="23" data-endline="27" data-position="1015" data-size="0">
<li class="" data-startline="23" data-endline="23" data-position="1017" data-size="0"><strong data-position="1017" data-size="0"><span data-position="1019" data-size="16">Screen recording</span></strong><span data-position="1037" data-size="53"> &#8211; Windows Snipping Tool for capturing test execution</span></li>
<li class="" data-startline="24" data-endline="24" data-position="1093" data-size="0"><strong data-position="1093" data-size="0"><span data-position="1095" data-size="6">ffmpeg</span></strong><span data-position="1103" data-size="38"> &#8211; To extract frames and process video</span></li>
<li class="" data-startline="25" data-endline="25" data-position="1144" data-size="0"><strong data-position="1144" data-size="0"><span data-position="1146" data-size="11">Claude Code</span></strong><span data-position="1159" data-size="47"> &#8211; AI coding assistant with vision capabilities</span></li>
<li class="" data-startline="26" data-endline="27" data-position="1209" data-size="0"><strong data-position="1209" data-size="0"><span data-position="1211" data-size="28">Financial dashboard demo app</span></strong><span data-position="1241" data-size="38"> &#8211; Test application for the experiment</span></li>
</ul>
<p class="part" data-startline="28" data-endline="28" data-position="1281" data-size="0"><span data-position="1281" data-size="248">I had ffmpeg already installed (it comes with a Playwright install). The approach would be to use ffmpeg to convert video into a sequence of screenshots that Claude Code could then process and convert into a structured test case in markdown format.</span></p>
<hr class="" />
<h2 class="part" data-startline="32" data-endline="32" id="The-Setup" data-id="The-Setup"><a class="anchor hidden-xs" href="#The-Setup" title="The-Setup" data-size="9" data-position="1539" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="1534" data-size="9">The Setup</span></h2>
<p class="part" data-startline="34" data-endline="34" data-position="1550" data-size="0"><span data-position="1550" data-size="30">Here&#8217;s how I got this working:</span></p>
<p class="part" data-startline="36" data-endline="37" data-position="1582" data-size="0"><strong data-position="1582" data-size="0"><span data-position="1584" data-size="13">Installation:</span></strong><br />
<span data-position="1600" data-size="85">ffmpeg was already on my system from Playwright. If you need it, you can get it from </span><a href="http://ffmpeg.org" target="_blank" rel="noopener"><span data-position="1685" data-size="10">ffmpeg.org</span></a><span data-position="1695" data-size="1">.</span></p>
<p class="part" data-startline="39" data-endline="40" data-position="1698" data-size="0"><strong data-position="1698" data-size="0"><span data-position="1700" data-size="14">Configuration:</span></strong><br />
<span data-position="1717" data-size="104">Created a test case template and some principles for writing good test cases (both in markdown). I used </span><a href="http://Claude.ai" target="_blank" rel="noopener"><span data-position="1821" data-size="9">Claude.ai</span></a><span data-position="1830" data-size="38"> to generate these with these prompts:</span></p>
<ul class="part" data-startline="42" data-endline="44" data-position="1870" data-size="0">
<li class="" data-startline="42" data-endline="42" data-position="1872" data-size="0"><span data-position="1872" data-size="115">Please create me a Test case template with standard fields (ID, title, preconditions, test steps, expected results)</span></li>
<li class="" data-startline="43" data-endline="44" data-position="1990" data-size="0"><span data-position="1990" data-size="93">Please create a Test case creation principles document with rules for writing good test cases</span></li>
</ul>
<p class="part" data-startline="45" data-endline="45" data-position="2085" data-size="0"><span data-position="2085" data-size="85">These documents provide context for Claude Code so it knows what structure to follow.</span></p>
<p class="part" data-startline="47" data-endline="48" data-position="2172" data-size="0"><strong data-position="2172" data-size="0"><span data-position="2174" data-size="19">Test Case Template:</span></strong><br />
<span data-position="2196" data-size="128">Standard template with placeholders for ID, title, description, preconditions, test steps, expected results, and actual results.</span></p>
<p class="part" data-startline="50" data-endline="51" data-position="2326" data-size="0"><strong data-position="2326" data-size="0"><span data-position="2328" data-size="15">Starting Point:</span></strong><br />
<span data-position="2346" data-size="43">Fresh Claude Code project initialized with </span><code data-position="2390" data-size="5">/init</code><span data-position="2397" data-size="129">, the template files, and a 43-second screen recording of me adding an investment account to the financial dashboard application.</span></p>
<hr class="" />
<h2 class="part" data-startline="55" data-endline="55" id="The-Experiment" data-id="The-Experiment"><a class="anchor hidden-xs" href="#The-Experiment" title="The-Experiment" data-size="14" data-position="2535" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="2475" data-size="14">The Experiment</span></h2>
<h3 class="part" data-startline="57" data-endline="57" id="Try-1-Can-Claude-Process-Video-Directly" data-id="Try-1-Can-Claude-Process-Video-Directly"><a class="anchor hidden-xs" href="#Try-1-Can-Claude-Process-Video-Directly" title="Try-1-Can-Claude-Process-Video-Directly" data-size="42" data-position="2555" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="2495" data-size="42">Try #1: Can Claude Process Video Directly?</span></h3>
<p class="part" data-startline="58" data-endline="58" data-position="2598" data-size="0"><span data-position="2598" data-size="261">I asked Claude Code: &#8220;You are an expert in software testing. My goal is to create a process where I can record a video of me using an application and have you turn it into a structured test case in markdown format. Are you able to process and understand video?&#8221;</span></p>
<p class="part" data-startline="60" data-endline="61" data-position="2861" data-size="0"><strong data-position="2861" data-size="0"><span data-position="2863" data-size="14">What happened:</span></strong><br />
<span data-position="2880" data-size="115">Claude said yes, it could process video. So I asked it to take my test-add-account.mp4 file and create a test case.</span></p>
<p class="part" data-startline="63" data-endline="63" data-position="2997" data-size="0"><span data-position="2997" data-size="44">It came back with an error reading the file.</span></p>
<p class="part" data-startline="65" data-endline="66" data-position="3043" data-size="0"><strong data-position="3043" data-size="0"><span data-position="3045" data-size="9">Reaction:</span></strong><br />
<span data-position="3057" data-size="122">As expected &#8211; Claude can&#8217;t directly process video files. But this was the learning moment that led to the actual solution.</span></p>
<h3 class="part" data-startline="68" data-endline="68" id="Try-2-Using-ffmpeg-to-Extract-Frames" data-id="Try-2-Using-ffmpeg-to-Extract-Frames"><a class="anchor hidden-xs" href="#Try-2-Using-ffmpeg-to-Extract-Frames" title="Try-2-Using-ffmpeg-to-Extract-Frames" data-size="38" data-position="3185" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="3125" data-size="38">Try #2: Using ffmpeg to Extract Frames</span></h3>
<p class="part" data-startline="69" data-endline="69" data-position="3224" data-size="0"><span data-position="3224" data-size="97">I prompted Claude to use ffmpeg to convert the video into screenshots that it could then analyze.</span></p>
<p class="part" data-startline="71" data-endline="72" data-position="3323" data-size="0"><strong data-position="3323" data-size="0"><span data-position="3325" data-size="14">What happened:</span></strong><br />
<span data-position="3342" data-size="170">Claude immediately understood the approach and started generating the ffmpeg command. It suggested using 1 frame per second, but I thought that wouldn&#8217;t be enough detail.</span></p>
<p class="part" data-startline="74" data-endline="75" data-position="3514" data-size="0"><strong data-position="3514" data-size="0"><span data-position="3516" data-size="11">Adjustment:</span></strong><br />
<span data-position="3530" data-size="101">I asked it to use 2 frames per second instead: &#8220;Please continue with this approach but use fps of 2.&#8221;</span></p>
<p class="part" data-startline="77" data-endline="78" data-position="3633" data-size="0"><strong data-position="3633" data-size="0"><span data-position="3635" data-size="7">Result:</span></strong><br />
<span data-position="3645" data-size="128">It created a temporary frames directory and extracted 84 PNG images from my 43-second video (roughly 2 per second as requested).</span></p>
<h3 class="part" data-startline="80" data-endline="80" id="Try-3-Generate-Test-Case-from-Screenshots" data-id="Try-3-Generate-Test-Case-from-Screenshots"><a class="anchor hidden-xs" href="#Try-3-Generate-Test-Case-from-Screenshots" title="Try-3-Generate-Test-Case-from-Screenshots" data-size="43" data-position="3779" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="3719" data-size="43">Try #3: Generate Test Case from Screenshots</span></h3>
<p class="part" data-startline="81" data-endline="81" data-position="3823" data-size="0"><span data-position="3823" data-size="121">Claude then read and analyzed all 84 screenshots, extracting test steps and expected results from the sequence of images.</span></p>
<p class="part" data-startline="83" data-endline="84" data-position="3946" data-size="0"><strong data-position="3946" data-size="0"><span data-position="3948" data-size="14">What happened:</span></strong><br />
<span data-position="3965" data-size="38">It created a complete test case file: </span><a href="http://TC-001-add-investment-account.md" target="_blank" rel="noopener"><span data-position="4003" data-size="32">TC-001-add-investment-account.md</span></a></p>
<p class="part" data-startline="86" data-endline="86" data-position="4037" data-size="0"><span data-position="4037" data-size="23">The test case included:</span></p>
<ul class="part" data-startline="87" data-endline="93" data-position="4061" data-size="0">
<li class="" data-startline="87" data-endline="87" data-position="4063" data-size="0"><span data-position="4063" data-size="22">Test case ID and title</span></li>
<li class="" data-startline="88" data-endline="88" data-position="4088" data-size="0"><span data-position="4088" data-size="39">Full description of what&#8217;s being tested</span></li>
<li class="" data-startline="89" data-endline="89" data-position="4130" data-size="0"><span data-position="4130" data-size="132">The actual values I&#8217;d used in the test (account type: &#8220;Investment&#8221;, name: &#8220;Main Investment&#8221;, and the exact description text I typed)</span></li>
<li class="" data-startline="90" data-endline="90" data-position="4265" data-size="0"><span data-position="4265" data-size="24">All the navigation steps</span></li>
<li class="" data-startline="91" data-endline="91" data-position="4292" data-size="0"><span data-position="4292" data-size="30">Expected results for each step</span></li>
<li class="" data-startline="92" data-endline="93" data-position="4325" data-size="0"><span data-position="4325" data-size="32">Screenshots attached as evidence</span></li>
</ul>
<p class="part" data-startline="94" data-endline="94" data-position="4359" data-size="0"><span data-position="4359" data-size="178">It actually caught specific details I&#8217;d entered &#8211; &#8220;Main Investment&#8221; as the account name, the exact description text I typed, even the modal form behavior and validation messages.</span></p>
<p class="part" data-startline="96" data-endline="96" data-position="4539" data-size="0"><span data-position="4539" data-size="25">That&#8217;s pretty impressive!</span></p>
<hr class="" />
<h2 class="part" data-startline="100" data-endline="100" id="Patterns-I-Noticed" data-id="Patterns-I-Noticed"><a class="anchor hidden-xs" href="#Patterns-I-Noticed" title="Patterns-I-Noticed" data-size="18" data-position="4574" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="4514" data-size="18">Patterns I Noticed</span></h2>
<p class="part" data-startline="102" data-endline="102" data-position="4594" data-size="0"><span data-position="4594" data-size="53">After running this experiment, some patterns emerged:</span></p>
<p class="part" data-startline="104" data-endline="104" data-position="4649" data-size="0"><strong data-position="4649" data-size="0"><span data-position="4651" data-size="15">Works well for:</span></strong></p>
<ul class="part" data-startline="105" data-endline="111" data-position="4669" data-size="0">
<li class="" data-startline="105" data-endline="105" data-position="4671" data-size="0"><span data-position="4671" data-size="43">Short, focused recordings (under 2 minutes)</span></li>
<li class="" data-startline="106" data-endline="106" data-position="4717" data-size="0"><span data-position="4717" data-size="49">Clear, deliberate actions (not clicking too fast)</span></li>
<li class="" data-startline="107" data-endline="107" data-position="4769" data-size="0"><span data-position="4769" data-size="59">Happy path flows where you&#8217;re showing the intended behavior</span></li>
<li class="" data-startline="108" data-endline="108" data-position="4831" data-size="0"><span data-position="4831" data-size="58">When you narrate what you&#8217;re doing (helps provide context)</span></li>
<li class="" data-startline="109" data-endline="109" data-position="4892" data-size="0"><span data-position="4892" data-size="58">Recording exploratory testing sessions you&#8217;re doing anyway</span></li>
<li class="" data-startline="110" data-endline="111" data-position="4953" data-size="0"><span data-position="4953" data-size="72">Creating test cases for applications with poor or missing specifications</span></li>
</ul>
<p class="part" data-startline="112" data-endline="112" data-position="5027" data-size="0"><strong data-position="5027" data-size="0"><span data-position="5029" data-size="16">Gets messy with:</span></strong></p>
<ul class="part" data-startline="113" data-endline="117" data-position="5048" data-size="0">
<li class="" data-startline="113" data-endline="113" data-position="5050" data-size="0"><span data-position="5050" data-size="51">Long exploratory sessions (with no clear objective)</span></li>
<li class="" data-startline="114" data-endline="114" data-position="5104" data-size="0"><span data-position="5104" data-size="62">Multiple test scenarios in one video (boundaries get confused)</span></li>
<li class="" data-startline="115" data-endline="115" data-position="5169" data-size="0"><span data-position="5169" data-size="65">Fast clicking and navigation (harder to capture what&#8217;s happening)</span></li>
<li class="" data-startline="116" data-endline="117" data-position="5237" data-size="0"><span data-position="5237" data-size="86">Expected vs actual results &#8211; it sees what happened, not necessarily what SHOULD happen</span></li>
</ul>
<p class="part" data-startline="118" data-endline="118" data-position="5325" data-size="0"><strong data-position="5325" data-size="0"><span data-position="5327" data-size="10">Surprises:</span></strong></p>
<ul class="part" data-startline="119" data-endline="125" data-position="5340" data-size="0">
<li class="" data-startline="119" data-endline="119" data-position="5342" data-size="0"><span data-position="5342" data-size="61">It caught UI elements I didn&#8217;t explicitly mention or focus on</span></li>
<li class="" data-startline="120" data-endline="120" data-position="5406" data-size="0"><span data-position="5406" data-size="64">Better at documenting steps than creating assertions/validations</span></li>
<li class="" data-startline="121" data-endline="121" data-position="5473" data-size="0"><span data-position="5473" data-size="66">Quality of test case depends heavily on recording quality and pace</span></li>
<li class="" data-startline="122" data-endline="122" data-position="5542" data-size="0"><span data-position="5542" data-size="61">Narration in video helps A LOT with context and understanding</span></li>
<li class="" data-startline="123" data-endline="123" data-position="5606" data-size="0"><span data-position="5606" data-size="77">The 2 frames per second rate worked well &#8211; enough detail without overwhelming</span></li>
<li class="" data-startline="124" data-endline="125" data-position="5686" data-size="0"><span data-position="5686" data-size="106">For production use, you&#8217;d create the frames, generate the test case, then delete the temporary screenshots</span></li>
</ul>
<hr class="" />
<h2 class="part" data-startline="128" data-endline="128" id="The-Honest-Take" data-id="The-Honest-Take"><a class="anchor hidden-xs" href="#The-Honest-Take" title="The-Honest-Take" data-size="15" data-position="5802" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="5742" data-size="15">The Honest Take</span></h2>
<p class="part" data-startline="130" data-endline="131" data-position="5819" data-size="0"><strong data-position="5819" data-size="0"><span data-position="5821" data-size="16"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick Verdict:</span></strong><br />
<span data-position="5840" data-size="30"><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes, but not for everything</span></p>
<p class="part" data-startline="133" data-endline="134" data-position="5872" data-size="0"><strong data-position="5872" data-size="0"><span data-position="5874" data-size="17">Would I use this?</span></strong><br />
<span data-position="5894" data-size="99">Absolutely. Not as a replacement for all test documentation, but definitely for specific scenarios.</span></p>
<p class="part" data-startline="136" data-endline="136" data-position="5995" data-size="0"><strong data-position="5995" data-size="0"><span data-position="5997" data-size="9">For what?</span></strong></p>
<ul class="part" data-startline="137" data-endline="143" data-position="6009" data-size="0">
<li class="" data-startline="137" data-endline="137" data-position="6011" data-size="0"><span data-position="6011" data-size="60">Quick documentation of manual tests I&#8217;m already doing anyway</span></li>
<li class="" data-startline="138" data-endline="138" data-position="6074" data-size="0"><span data-position="6074" data-size="76">Bug reproductions where I want both video evidence and structured test steps</span></li>
<li class="" data-startline="139" data-endline="139" data-position="6153" data-size="0"><span data-position="6153" data-size="66">Onboarding new team members &#8211; record once, get sharable test cases</span></li>
<li class="" data-startline="140" data-endline="140" data-position="6222" data-size="0"><span data-position="6222" data-size="59">When I&#8217;m too lazy to write it up properly (let&#8217;s be honest)</span></li>
<li class="" data-startline="141" data-endline="141" data-position="6284" data-size="0"><span data-position="6284" data-size="44">Applications where specs are missing or poor</span></li>
<li class="" data-startline="142" data-endline="143" data-position="6331" data-size="0"><span data-position="6331" data-size="70">Exploratory testing sessions where I want to capture what I discovered</span></li>
</ul>
<p class="part" data-startline="144" data-endline="144" data-position="6403" data-size="0"><strong data-position="6403" data-size="0"><span data-position="6405" data-size="17">When would I NOT?</span></strong></p>
<ul class="part" data-startline="145" data-endline="147" data-position="6425" data-size="0">
<li class="" data-startline="145" data-endline="145" data-position="6427" data-size="0"><span data-position="6427" data-size="67">Complex business logic verification where precise assertions matter</span></li>
<li class="" data-startline="146" data-endline="147" data-position="6497" data-size="0"><span data-position="6497" data-size="42">Anything needing precise validation points</span></li>
</ul>
<p class="part" data-startline="148" data-endline="148" data-position="6541" data-size="0"><span data-position="6541" data-size="187">Still needs refinement for longer test runs. A lot of potential once perfected. You&#8217;d want to add some validation loops to ensure the test cases being generated are accurate and complete.</span></p>
<hr class="" />
<h2 class="part" data-startline="152" data-endline="152" id="Still-Curious-About" data-id="Still-Curious-About"><a class="anchor hidden-xs" href="#Still-Curious-About" title="Still-Curious-About" data-size="19" data-position="6738" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="6678" data-size="19">Still Curious About</span></h2>
<p class="part" data-startline="154" data-endline="154" data-position="6759" data-size="0"><span data-position="6759" data-size="53">What I&#8217;m still curious about and want to test further</span><span class="smartypants" data-position="6812" data-size="3">…</span></p>
<ul class="part in-view" data-startline="156" data-endline="162" data-position="6817" data-size="0">
<li class="" data-startline="156" data-endline="156" data-position="6819" data-size="0"><span data-position="6819" data-size="93">Can it spot differences between expected and actual results if I point them out in the video?</span></li>
<li class="" data-startline="157" data-endline="157" data-position="6915" data-size="0"><span data-position="6915" data-size="57">Would audio narration improve the accuracy significantly?</span></li>
<li class="" data-startline="158" data-endline="158" data-position="6975" data-size="0"><span data-position="6975" data-size="71">Can it generate Given-When-Then format specifically for BDD test cases?</span></li>
<li class="" data-startline="159" data-endline="159" data-position="7049" data-size="0"><span data-position="7049" data-size="103">Will it work with something like AGgrid or other complex component libraries? (That&#8217;ll be interesting!)</span></li>
<li class="" data-startline="160" data-endline="160" data-position="7155" data-size="0"><span data-position="7155" data-size="68">What about testing mobile apps using screen recordings from devices?</span></li>
<li class="" data-startline="161" data-endline="162" data-position="7226" data-size="0"><span data-position="7226" data-size="88">How would it handle wireframe recordings to generate test cases before the app is built?</span></li>
</ul>
<hr class="in-view" />
<h2 class="part in-view" data-startline="165" data-endline="165" id="The-Prompts-I-Actually-Used" data-id="The-Prompts-I-Actually-Used"><a class="anchor hidden-xs" href="#The-Prompts-I-Actually-Used" title="The-Prompts-I-Actually-Used" data-size="27" data-position="7324" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="7264" data-size="27">The Prompts I Actually Used</span></h2>
<p class="part in-view" data-startline="167" data-endline="167" data-position="7353" data-size="0"><span data-position="7353" data-size="72">If you&#8217;re interested in trying this, these are the exact prompts I used:</span></p>
<p class="part in-view" data-startline="169" data-endline="169" data-position="7427" data-size="0"><strong data-position="7427" data-size="0"><span data-position="7429" data-size="3">In </span><a href="http://Claude.ai" target="_blank" rel="noopener"><span data-position="7432" data-size="9">Claude.ai</span></a><span data-position="7441" data-size="13"> (for setup):</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled in-view" data-startline="170" data-endline="174" data-infoprefix-length="8" data-position="7457">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="markdown hljs">Please can you create me a test case template for software testing in markdown

Please can you create me a list of principles and rules that should be followed when creating good test cases for software testing
</code></pre>
</div>
<p class="part in-view" data-startline="176" data-endline="176" data-position="7685" data-size="0"><strong data-position="7685" data-size="0"><span data-position="7687" data-size="15">In Claude Code:</span></strong></p>
<div class="part code-block-wrapper code-block-toolbar-handled in-view" data-startline="177" data-endline="187" data-infoprefix-length="8" data-position="7705">
<div class="code-toolbar">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-button ui-code-block-toolbar-type-code" data-state="closed"><i class="inline-flex ph ph-clipboard-text" aria-hidden="true"></i></button></div>
</div>
<pre class="click-event-handled"><code class="markdown hljs">please review files in this project

You are an expert in software testing. My goal is to create a process where I can record a video of me using an application and have you turn it into a structured test case in Markdown format. Are you able to process and understand video?

please take the video test-add-account.mp4 and create a test case

[Request interrupted by user for tool use] please continue with this approach but use fps of 2

please could you take this process and the steps followed and create a claude code slash command named create-test-from-video
</code></pre>
</div>
<hr class="in-view" />
<h2 class="part in-view" data-startline="191" data-endline="191" id="Resources" data-id="Resources"><a class="anchor hidden-xs" href="#Resources" title="Resources" data-size="9" data-position="8296" smoothhashscroll=""><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span data-position="8236" data-size="9">Resources</span></h2>
<ul class="part in-view" data-startline="193" data-endline="197" data-position="8307" data-size="0">
<li class="" data-startline="193" data-endline="193" data-position="8309" data-size="0"><strong data-position="8309" data-size="0"><span data-position="8311" data-size="6">ffmpeg</span></strong><span data-position="8320" data-size="2">: </span><a href="https://www.ffmpeg.org/" target="_blank" rel="noopener"><span data-position="8309" data-size="0">https://www.ffmpeg.org/</span></a></li>
<li class="" data-startline="194" data-endline="194" data-position="8347" data-size="0"><strong data-position="8347" data-size="0"><span data-position="8349" data-size="16">Demo Application</span></strong><span data-position="8368" data-size="2">: Vercel Demo Application </span></li>
<li class="" data-startline="195" data-endline="195" data-position="8438" data-size="0"><strong data-position="8438" data-size="0"><span data-position="8440" data-size="11">Claude Code</span></strong><span data-position="8454" data-size="2">: </span><a href="https://claude.com/claude-code" target="_blank" rel="noopener"><span data-position="8438" data-size="0">https://claude.com/claude-code</span></a></li>
<li class="" data-startline="196" data-endline="197" data-position="8488" data-size="0"><strong data-position="8488" data-size="0"><span data-position="8490" data-size="20">Claude Code Cookbook</span></strong><span data-position="8512" data-size="111"> (Vision best practices): <a href="https://github.com/anthropics/claude-cookbooks/blob/main/multimodal/best_practices_for_vision.ipynb">https://github.com/anthropics/claude-cookbooks/blob/main/multimodal/best_practices_for_vision.ipynb</a> </span></li>
</ul>
<hr class="in-view" />
<p class="part in-view" data-startline="200" data-endline="200" data-position="8630" data-size="0"><strong data-position="8630" data-size="0"><span data-position="8632" data-size="26">Want to try this yourself?</span></strong></p>
<p class="part in-view" data-startline="202" data-endline="202" data-position="8662" data-size="0"><span data-position="8662" data-size="225">Really was simple to get setup once you have ffmpeg installed. Let me know what happens when you try it &#8211; I&#8217;m especially curious about whether audio narration improves the results and how it handles more complex applications.</span></p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/10/ai-experiment-1-recording-videos-and-converting-them-to-test-cases/">AI Experiment #1: Recording Videos and Converting Them to Test Cases</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>An Intro to Agentic Testing : Overview and the PRP System</title>
		<link>https://www.testmanagement.com/blog/2025/08/an-intro-to-agentic-testing-overview-and-the-prp-system/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Sat, 30 Aug 2025 16:27:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12743</guid>

					<description><![CDATA[<p>Contents : Module 1 Lesson 1 This Module Module 1 &#8211; Building an Automation Framework with the PRP System Lesson 1 : Overview and the PRP System (this document) Lesson 2 : Pre-requisites and Setup Lesson 3 : Step-by-step Build and Execute Lesson 4 : Documentation and Debugging Bonus Lesson : Getting Started with Claude [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/08/an-intro-to-agentic-testing-overview-and-the-prp-system/">An Intro to Agentic Testing : Overview and the PRP System</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 id="Contents--Module-1-Lesson-1" data-id="Contents--Module-1-Lesson-1"><span>Contents : Module 1 Lesson 1</span></h2>
<p><strong><span>This Module</span></strong></p>
<blockquote><p><span>Module 1 &#8211; Building an Automation Framework with the PRP System</span></p></blockquote>
<ul>
<li><strong><span>Lesson 1 : Overview and the PRP System (this document)</span></strong></li>
<li><span>Lesson 2 : Pre-requisites and Setup</span></li>
<li><span>Lesson 3 : Step-by-step Build and Execute</span></li>
<li><span>Lesson 4 : Documentation and Debugging</span></li>
<li><span>Bonus Lesson : Getting Started with Claude Code</span></li>
</ul>
<p><strong><span>New Modules Comming Soon</span></strong></p>
<blockquote><p><span>Module 2: Developing your PRP Process to Add Tests</span><br />
<span>Module 3: Using MCPs to build a better Automation Framework</span><br />
<span>Module 4: PTP System for Test Case Creation</span><br />
<span>Module 5: Executing and Running Tests with PTP</span><br />
<span>Module 6: Agentic Test Maintenance</span></p></blockquote>
<h2 id="Introduction" data-id="Introduction"><span>Introduction</span></h2>
<p><span>The high-level architecture we&#8217;re working with is based around three core components: PRD, PRP, and the PTP.</span></p>
<div class="code-toolbar cursor-default tw-hide md:block">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-zoom-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-magnifying-glass-plus" aria-hidden="true"></i></button></div>
</div>
<p><img src="https://hackmd.io/_uploads/BkPFaiFFeg.png" alt="image" class="offline-handled error-handled image-toolbar-handled" loading="lazy" /></p>
<p><strong><span>PRD : Product Requirements Document</span></strong><span> — it defines WHAT to build. In our case this will be our &#8220;Playwright Test Automation Framework&#8221;.</span></p>
<p><strong><span>PRP : Product Requirement Prompts</span></strong><span> &#8211; These are prompts that expand on the PRD to provide detailed instructions on HOW to build the application that your team are developing.</span></p>
<p><strong><span>PTP : Product Testing Prompts</span></strong><span> &#8211; These are the HOW to test the product (we cover this in a later module)</span></p>
<p><span>These three components come together to provide us with this agentic product development and testing framework that works so well together.</span></p>
<p><span>For now though our initial focus for this particular lesson is based around just the PRD and the PRP because what we&#8217;re going to do is take that concept, extract it, and use it to build our automated test framework.</span></p>
<p><span>So think of the testing framework as the product we&#8217;re building. Later we&#8217;ll combine our Framework as part of the PTP in a complete systems for building and testing a web application.</span></p>
<p><span>This PRP system is an approach to software development that&#8217;s gaining ground fast. There&#8217;s various variations on this theme but it&#8217;s focus is on building comprehensive prompts that deliver well built working software.</span></p>
<p><img loading="lazy" src="https://www.testmanagement.com/wp-content/uploads/2025/08/prp-workflow.png" alt="" width="301" height="504" class="alignnone size-full wp-image-12744" /></p>
<p>&nbsp;</p>
<h3 id="What-is-the-PRP-Methodology" data-id="What-is-the-PRP-Methodology"><span>What is the PRP Methodology</span></h3>
<p><span>The PRP methodology, or system, is basically a library of assets and templates used for agenetic engineering or developing products and code with AI tools like Core Claude Code.</span></p>
<div class="code-toolbar cursor-default tw-hide md:block">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-zoom-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-magnifying-glass-plus" aria-hidden="true"></i></button></div>
</div>
<p><img src="https://hackmd.io/_uploads/S1TGAotKlx.png" alt="image" class="offline-handled error-handled image-toolbar-handled" loading="lazy" /></p>
<p><span>Provided below is a link to the original repository that Rasmus Wielding has built. This enables you to take a product requirement document, create product requirement prompts, and then execute those prompts with a coding tool like Claude Code to build a product.</span></p>
<p><span>If you want to go deeper then I&#8217;d recommend exploring his GitHub repo here..</span></p>
<p><a href="https://github.com/Wirasm/PRPs-agentic-eng" target="_blank" rel="noopener"><span>https://github.com/Wirasm/PRPs-agentic-eng</span></a></p>
<p><span>I&#8217;ve starting using this methodology successfully to build test automation harnesses and then built on a PTP (Product Testing Prompts) methodology and embeds that into the whole system to create this whole agentic development and testing loop. But first, we need to understand the PRP methodology, and the best way to do that is to use it to build test automation framework and we&#8217;re going to do that with a framework built around Playwright.</span></p>
<p><span>What we&#8217;re going to do is take the core most important parts from this system and we&#8217;re going to use those to build our test automation framework. We have Playwright-orientated prompts and examples that we plug into this framework that enable us to easily and quickly build out a Playwright project with no coding.</span></p>
<p><a href="https://github.com/AiTestManagement/at-course.git" target="_blank" rel="noopener"><span>Course GitHub Repository</span></a></p>
<p><span>We get into the details of how to use this in the next lesson.</span></p>
<p><span>For now though i want to describe the high level components and process. Show you how to modify and apply this system to building a framework with Playwright.</span></p>
<p><span>In later modules in this course I&#8217;m going to introduce you to the PTP (Product Testing Prompts) methodology that slots into this PRP (Product Requirements Prompt) methodlogy.</span></p>
<div class="code-block-wrapper code-block-toolbar-handled" data-infoprefix-length="7">
<div class="code-toolbar"></div>
<pre data-raw-code="Z3JhcGggVEQKICAgICAgSWRlYVtJZGVhPGJyLz5Zb3VyIElkZWFdCiAgICAgIFBSRFtQUkQ8YnIvPlByb2R1Y3QgUmVxdWlyZW1lbnRzIERvY3VtZW50XQogICAgICBQUlBbUFJQPGJyLz5Qcm9kdWN0IFJlcXVpcmVtZW50cyBQcm9tcHRzXQogICAgICBQVFBbUFRQPGJyLz5Qcm9kdWN0IFRlc3RpbmcgUHJvbXB0c10KICAgICAgUHJvZHVjdFtQcm9kdWN0XQoKICAgICAgSWRlYSAtLT4gUFJEIAogICAgICBQUkQgLS0-IFBSUAogICAgICBQUlAgLS0-IFByb2R1Y3QKICAgICAgUFJEIC0tPiBQVFAKICAgICAgUFJQIDwtLT4gUFRQCiAgICAgIFBUUCAtLT4gUHJvZHVjdAoKICAgICAgJSUgRm9yY2Ugc2FtZSByYW5rCiAgICAgIFBSUCB-fn4gUFRQCg" class="mermaid plugin-rendered click-event-handled cursor-zoom-in"><img loading="lazy" src="https://www.testmanagement.com/wp-content/uploads/2025/08/prp-ptp-workflow.png" alt="" width="437" height="638" class="alignnone size-full wp-image-12745" /></pre>
</div>
<blockquote><p><span>PRD &#8211; Product REquirements Document</span><br />
<span>PRP &#8211; Product Requirement Prompts</span><br />
<span>PTP &#8211; Product Testing Prompts</span></p></blockquote>
<p><span>For now though </span><span class="smartypants">…</span><span> one step at a time let&#8217;s focus on one aspect, the PRD and PRP steps to build a Playwright automation framework.</span></p>
<h3 id="How-Does-the-PRP-System-Work" data-id="How-Does-the-PRP-System-Work"><span>How Does the PRP System Work?</span></h3>
<p><span>How does this system work? How do the different parts connect? What do you need to do to use it?</span></p>
<h4 id="The-Process" data-id="The-Process"><span>The Process</span></h4>
<p><span>The overall workflow is like this.</span></p>
<div class="code-toolbar cursor-default tw-hide md:block">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-zoom-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-magnifying-glass-plus" aria-hidden="true"></i></button></div>
</div>
<p><img src="https://hackmd.io/_uploads/rJGn0jKtgg.png" alt="image" class="offline-handled error-handled image-toolbar-handled" loading="lazy" /></p>
<p><span>You&#8217;d start with an idea (possibly working with an AI chatbot like Claude Code or ChatGPT to develop and work through your idea).</span></p>
<p><span>Then we create a product requirements document. This is the high-level &#8220;what to build&#8221; document. What I&#8217;ve done for this course is already gone through the idea and the AI chat to create the PRD on the main branch. You&#8217;ll find the PRD document in the repository. It&#8217;s been honed to help provide the basis for a well-structured, well-designed Playwright test automation framework in TypeScript.</span></p>
<p><span>Now that PRD, along with the PRP </span><a href="http://README.md" target="_blank" rel="noopener"><span>README.md</span></a><span> which outlines the process for Claude Code, the PRP template which gives an example of what to create, the </span><a href="http://Claude.md" target="_blank" rel="noopener"><span>Claude.md</span></a><span> (which contains these high-level instructions that guide Claude Code when it&#8217;s working). Then with the Claude Code slash command, the </span><code>PRP create</code><span> command, all of those components come together to create your specific PRP document. You just run the create PRP slash command in Claude Code. The output from this is the PRP document</span></p>
<p><span>You now have a VERY detailed how-to-build-the-playwright-framework document.</span></p>
<p><span>There&#8217;s an example PRP document that I&#8217;ve created on the main branch of the code repo. I&#8217;ve used this to build my own Playwright frameworks.</span></p>
<p><span>Once you have the PRP document, we want to execute on it to build our Playwright framework. The execute PRP slash command takes in the PRP document, the PRP README, which provides the overview of the whole process to your code instance, and of course the </span><code>Claude.md</code><span> file, which Claude code uses as high-level instructions and a guide to any coding project it&#8217;s working on. We run the </span><code>PRP execute</code><span> command with all those inputs, and from that, Claude code will go away and build you your Playwright framework in TypeScript.</span></p>
<p><span>Some key bits to understand here</span></p>
<ol>
<li><span>the PRP </span><code>ReadMe</code><span>, the </span><code>Claude.md</code><span>, and the create PRP commands are specific to the overall PRP system.</span></li>
<li><span>the PRD, the PRP templates and our AUT (Applicaiton Under Test) that we feed in, are what guide this system to build our &#8220;Specific&#8221; Playwright framework PRP document. It&#8217;s then executing on that PRP document, which is our very detailed &#8220;How to build&#8221; Playwright frameworks, that results in us getting our working TypeScript playwright framework for OUR application.</span></li>
</ol>
<p><span>How do all of these components fit together then?</span></p>
<h4 id="The-Components" data-id="The-Components"><span>The Components</span></h4>
<p><span>So there are a number of parts to this system.</span></p>
<div class="code-toolbar cursor-default tw-hide md:block">
<div class="flex flex-row gap-0.5 rounded-lg bg-element-bg-default px-[7px] py-[5px]"><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-edit-from-here-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-map-pin-simple" aria-hidden="true"></i></button><span class="ml-1 border-0 border-l border-solid border-background-subtle pr-1" aria-hidden="true"></span><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-copy-link-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-link" aria-hidden="true"></i></button><button class="rounded text-lg font-normal leading-sm flex bg-transparent text-text-default border border-solid border-transparent hocus:bg-element-bg-hover hocus:text-text-emphasize hover:border-element-bg-hover focus:shadow-[0_0_0_2px_#77777733] focus:border-element-border-hover disabled:bg-transparent disabled:hocus:bg-transparent disabled:hocus:border-transparent disabled:text-element-text-disabled disabled:hocus:text-element-text-disabled p-0.5 ui-code-block-zoom-button ui-code-block-toolbar-type-image" data-state="closed"><i class="inline-flex ph ph-magnifying-glass-plus" aria-hidden="true"></i></button></div>
</div>
<p><img src="https://hackmd.io/_uploads/BydayntYxg.png" alt="image" class="offline-handled error-handled image-toolbar-handled" loading="lazy" /></p>
<p><span>It consists of some templates, PRP templates that </span><code>Claude Code</code><span> can use as an example to create your specific PRP. Secondly, there are a number of key slash commands that </span><code>Claude Code</code><span> will understand to help you generate your PRP and to help you execute on your PRP to create your actual coded framework.</span></p>
<p><span>The three core commands you&#8217;ll use are: </span><code>PRP Planning</code><span>, </span><code>PRP base</code><span> and </span><code>PRP execute</code><span>.</span></p>
<p><span>Now I have modified these commands specifically to enhance them to create test automation frameworks. I will take you through these commands so that you understand how to use them and how to update them when you need to. These commands are designed to leverage the PRP template that we use to create the PRP specifically for YOUR implmentation of a Playwright framework.</span></p>
<p><span>There is also a PRP </span><code>README.md</code><span> file that provides an overview of the whole process. That&#8217;s useful for you too, but it&#8217;s also useful for the AI coding agent so that it understands the context and the whole end-to-end process.</span></p>
<p><span>Thirdly, there&#8217;s the global rules directory or </span><code>claude.md</code><span> file that acts as a high-level directive or memory for Claude code when it&#8217;s working on your project. Again, I&#8217;ve customized this for your project for the building of test automation frameworks.</span></p>
<p><span>Another key input to this whole system and methodology are tehe example templates. AI loves examples to help it see what it&#8217;s output is expected to look like. I&#8217;ve created a </span><code>PRD</code><span> template and a </span><code>PRP</code><span> template specifically around a Playwright framework. This gives Claude Code loads of context when it comes to creating our speicifc version of the </span><code>PRD</code><span> and </span><code>PRP</code><span> documents.</span></p>
<p><span>Finally we&#8217;ll key Claude Code into the actual application we want to design our Playwright automation framework to test. In this instance we&#8217;ll provide the source code to our application in our repo. You&#8217;ll find the directory </span><code>APP-UNDER-TEST</code><span> in the course github repo. This could also be a direct pointer to a running instance of the application you&#8217;re testing. We&#8217;ll stick to teh soruce code for now. This will help Claude Code create a Playwright Framework specific to our application that we wan&#8217;t to test.</span></p>
<h3 id="What-Were-Going-To-Do-Next" data-id="What-Were-Going-To-Do-Next"><span>What We&#8217;re Going To Do Next</span></h3>
<p><span>If you want to go deep into the PRP system, then I would go to this Git repo, clone it and work through a lot of the examples here.</span></p>
<p><a href="https://github.com/Wirasm/PRPs-agentic-eng" target="_blank" rel="noopener"><span>PRP Agentic Engineering Repo</span></a></p>
<p><span>This framework/repo from Rasmus will enable you to build TypeScript, Python applications from scratch using this system. And within this repo are templates for building many different types of applications.</span></p>
<p><span>If you want to keep things simple to start with use our course repo here</span><span class="smartypants">…</span></p>
<p><a href="https://github.com/AiTestManagement/at-course.git" target="_blank" rel="noopener"><span>Course GitHub Repository</span></a></p>
<p><span>What I&#8217;ve done in our repo for this course, is take the core parts of this PRP system and built templates and commands specifically for building test automation frameworks in TypeScript for Playwright.</span></p>
<p><span>Over the duration of this six-module course, you will find examples, templates, and architecture documents to help you build both UI and API test automation frameworks.</span></p>
<p><span>Next, in Lesson 2, I&#8217;m going to walk you through setting up your system and the tools you need.</span></p>
<p><span>Then, in Lesson 3, I want to take you through, step by step, this process to build your first framework with the PRP system.</span></p>
<p><span>I&#8217;m going to walk you through a 5 step process</span></p>
<pre><code class="code_block">​​​​1. Define your idea
​​​​2. Turn your idea in to a PRD
​​​​3. Develop your idea into a comprehensive PRP
​​​​4. Feed the PRP into Claude Code to build your Playwright framework
​​​​5. Test your finished framework
</code></pre>
<div class="code-block-wrapper code-block-toolbar-handled" data-infoprefix-length="7">
<div class="code-toolbar"></div>
<pre class="click-event-handled mermaid plugin-rendered cursor-zoom-in" data-raw-code="Z3JhcGggVEQKICAgICAgSWRlYVsxIC0gSWRlYTxici8-SSBoYXZlIGFuZCBpZGVhIGZvciBhIHRlc3QgYXV0b21hdGlvbiBmcmFtZXdvcmtdCiAgICAgIFBSRFsyIC0gUFJEPGJyLz5Qcm9kdWN0IFJlcXVpcmVtZW50cyBEb2N1bWVudF0KICAgICAgUFJQWzMgLSBQUlA8YnIvPlByb2R1Y3QgUmVxdWlyZW1lbnRzIFByb21wdHNdCiAgICAgIEV4ZWN1dGVbNCAtIEV4ZWN1dGU8YnIvPkNsYXVkZSBDb2RlIEJ1aWxkcyB5b3VyIEYvV10KICAgICAgVGVzdFs1IC0gVGVzdDxici8-VGVzdCB5b3UgZnJhbWV3b3JrXQoKICAgICAgSWRlYSAtLT4gUFJEIC0tPiBQUlAgLS0-IEV4ZWN1dGUgLS0-IFRlc3QK"><img loading="lazy" src="https://www.testmanagement.com/wp-content/uploads/2025/08/full-workflow.png" alt="" width="361" height="711" class="alignnone size-full wp-image-12746" /></pre>
</div>
<p><strong><span>Remember</span></strong><span> &#8211; </span><em><span>learn this and you&#8217;ll have a system at your finger tips for building all sorts of test tools and testing frameworks</span><span class="smartypants">!!!</span></em></p>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/08/an-intro-to-agentic-testing-overview-and-the-prp-system/">An Intro to Agentic Testing : Overview and the PRP System</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Playwright Tutorial : Executing Tests in Playwright</title>
		<link>https://www.testmanagement.com/blog/2025/03/playwright-tutorial-for-beginners-lesson-6/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Mon, 03 Mar 2025 22:43:40 +0000</pubDate>
				<category><![CDATA[Playwright Tutorial 2025]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12401</guid>

					<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/03/playwright-tutorial-for-beginners-lesson-6/">Playwright Tutorial : Executing Tests in Playwright</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<style type="text/css">body.kc-css-system .kc-css-507095{padding-top: 0px;padding-bottom: 0px;}body.kc-css-system .kc-css-507095 p{margin-top: 10px;margin-bottom: 10px;}body.kc-css-system .kc-css-4352309{text-align: center;}body.kc-css-system .kc-css-4308700{text-align: center;}body.kc-css-system .kc-css-3383452{text-align: center;}body.kc-css-system .kc-css-757921{text-align: center;}body.kc-css-system .kc-css-2007605{text-align: center;}body.kc-css-system .kc-css-41606{text-align: center;}body.kc-css-system .kc-css-35914{text-align: center;}body.kc-css-system .kc-css-4275306{text-align: center;}body.kc-css-system .kc-css-4221844{text-align: center;}body.kc-css-system .kc-css-4297264{text-align: center;}body.kc-css-system .kc-css-1032218{text-align: center;}body.kc-css-system .kc-css-777158{text-align: center;}body.kc-css-system .kc-css-1880443{text-align: center;}body.kc-css-system .kc-css-1730062{text-align: center;}body.kc-css-system .kc-css-1112646{text-align: center;}body.kc-css-system .kc-css-361239{text-align: center;}</style>
<section class="kc-elm kc-css-4142181 kc_row">
<div class="kc-row-container  kc-container">
<div class="kc-wrap-columns">
<div class="kc-elm kc-css-504614 kc_col-sm-12 kc_column kc_col-sm-12">
<div class="kc-col-container">
<div class="kc-elm kc-css-507095 kc_text_block">
<p style="margin-top: 1.6em;">This is the final lesson in this introductory tutorial for Playwright where we look at executing tests. You have a number of options and ways to execute tests in Playwright.</p>
</div>
<div class="kc-elm kc-css-4053317 kc-raw-code"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/KAQJhg3qoEo?si=IQBk5ixV1Ss4OKiw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<div class="kc-elm kc-css-644653 kc_text_block a-black">
<p style="margin-top: 1.6em;">Your three main options for executing tests include:</p>
<ol>
<li><a href="#Executing-Playwright-Tests-in-VS-Code">Execute from within Visual Studio Code</a></li>
<li><a href="#executing-with-trace-viewer">Execute with Trace Viewer</a></li>
<li><a href="#executing-with-the-command-line">Execute from the Command Line</a></li>
</ol>
</div>
<div class="kc-elm kc-css-4217329 kc_text_block a-black">
<p>
We&#8217;re going to explore each of these options in the next few sections as well as look at how to debug and select browsers.</p>
</div>
<div class="kc-elm kc-css-3958271 kc_text_block a-black">
<p>
<a name="Executing-Playwright-Tests-in-VS-Code"></a></p>
<h3 style="margin-top: 1.6em;">Executing Playwright Tests in VS Code</h3>
<p>We&#8217;re in our Playwright project, in the Explorer view. You&#8217;ll see your individual tests can be executed by pressing the run tests button on the left hand side.</p>
</div>
<div class="kc-elm kc-css-4352309 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Running-Playwright-Tests.png" class="" alt="Running Playwright Tests" />    </div>
<div class="kc-elm kc-css-1046447 kc_text_block a-black">
<p>
However, if you created a new test or you&#8217;ve edited a test, you won&#8217;t see that button. You&#8217;ll need to come into the test explorer view and you&#8217;ll need to refresh tests.</p>
</div>
<div class="kc-elm kc-css-4308700 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Refresh-Tests-List.png" class="" alt="Refresh Tests List" />    </div>
<div class="kc-elm kc-css-968921 kc_text_block a-black">
<p>
For example if we rename a test, and Playwright hasn&#8217;t yet picked this up this change so we can&#8217;t execute the test. After we&#8217;ve saved this specification file we can come into the &#8220;<b>Test Explorer</b>&#8221; view and refresh the tests list. Now we&#8217;ll see that Playwright will pick this up and we now have the option to run this test. What you&#8217;ll notice too is that you can run from the test Explorer view too now.</p>
</div>
<div class="kc-elm kc-css-3383452 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Run-Tests-from-Test-Explorer.png" class="" alt="Run Tests from Test Explorer" />    </div>
<div class="kc-elm kc-css-1623086 kc_text_block a-black">
<p>
You can run all of the tests in all of the test specs in this directory. You can also come in and run all of the tests in a particular specification file, or you can run individual tests within a specification file.</p>
<p>If you drill down to a specific test you want to edit then you&#8217;ll also find that you&#8217;ve got this option to turn on &#8220;continuous run&#8221;. Select this option and whenever you edit a test, and then save it, it will run it immediately.</p>
</div>
<div class="kc-elm kc-css-757921 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Continuous-Run.png" class="" alt="Continuous Run" />    </div>
<div class="kc-elm kc-css-366167 kc_text_block a-black">
<p>
When you run the tests, you&#8217;ll see that the test result panel will open up. You&#8217;ll get the results of that particular test run displayed along with the history presented in the right hand panel.</p>
</div>
<div class="kc-elm kc-css-2007605 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Test-Run-Results-and-History.png" class="" alt="Test Run Results and History" />    </div>
<div class="kc-elm kc-css-1858951 kc_text_block a-black">
<p>
<a name="executing-with-trace-viewer"></a></p>
<h3 style="margin-top: 1.6em;">Trace Viewer</h3>
<p>When it comes to debugging these tests, you can either show the test in a browser when you execute them so you can view the test run itself (&#8220;<b>headed</b>&#8221; mode). Or you can run in the background (&#8220;<b>headless</b>&#8221; mode with no browser displayed) and use the &#8220;<b>trace viewer</b>&#8221; tool to see how the test ran. You can select which one of these you need in the Playwright panel.</p>
</div>
<div class="kc-elm kc-css-41606 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Show-Browser-or-Show-Trace-Viewer.png" class="" alt="Show Browser or Show Trace Viewer" />    </div>
<div class="kc-elm kc-css-532357 kc_text_block a-black">
<p>
When you run a test with the trace viewer this shows you the recording of the test execution (especially useful if you&#8217;re running in headless mode). So you can view all of the steps executed within the test.</p>
</div>
<div class="kc-elm kc-css-35914 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Trace-Viewer.png" class="" alt="Trace Viewer" />    </div>
<div class="kc-elm kc-css-3798926 kc_text_block a-black">
<p>
You can now look at the before hooks and after hooks (which we&#8217;ll talk about later). You can look at the steps and investigate the actual code that was used to run that step. You can even see the locators that have been used.</p>
</div>
<div class="kc-elm kc-css-4275306 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Trace-Viewer-Locators.png" class="" alt="Trace Viewer Locators" />    </div>
<div class="kc-elm kc-css-2016252 kc_text_block a-black">
<p>
You can even experiment with those locators because all of those locators are recorded as part of that Trace Viewer recording. You can use the Pick locator feature, inspect the graphical view of the page, and find a new locator… all from the recording!</p>
</div>
<div class="kc-elm kc-css-4221844 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Pick-Locator-Feature.png" class="" alt="Pick Locator Feature" />    </div>
<div class="kc-elm kc-css-3782763 kc_text_block a-black">
<p>
There&#8217;s lots of useful tools within the Trace Viewer, which we&#8217;ll talk about in a dedicated lesson later on. For now though just be aware that you can step through all of the steps in your script and visually see where any errors might have cropped up.</p>
</div>
<div class="kc-elm kc-css-1299767 kc_text_block a-black">
<h3 style="margin-top: 1.6em;">Selecting Browsers for Execution</h3>
<p>When we installed Playwright for this particular project, remember that the command palette installer gave us the option to select the browsers we needed.</p>
</div>
<div class="kc-elm kc-css-4297264 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Selecting-Browsers-to-Install.png" class="" alt="Selecting Browsers to Install" />    </div>
<div class="kc-elm kc-css-802397 kc_text_block a-black">
<p>
Those browsers that were installed as part of this project are now represented in the left hand Playwright panel.</p>
</div>
<div class="kc-elm kc-css-1032218 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Browsers-to-Execute-with.png" class="" alt="Browsers to Execute with" />    </div>
<div class="kc-elm kc-css-1786420 kc_text_block a-black">
<p>
So if we want to run a test in multiple browsers, we just select the browsers that we need. Using these check boxes I can run this single test against one or more browsers. After the execution completes you can then see the test results broken down by browser.</p>
</div>
<div class="kc-elm kc-css-777158 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/image.png" class="" alt="" />    </div>
<div class="kc-elm kc-css-480726 kc_text_block a-black">
<p><a name="executing-with-the-command-line"></a></p>
<h3 style="margin-top: 1.6em;">Executing Tests from the Command Line</h3>
<p>The last thing to mention then is that tests can be run from the command line. You can either do this from within VS Code (in the &#8220;<b>Terminal</b>&#8221; panel) or in a separate command prompt window. We&#8217;ll step through how to run in a separate command prompt.</p>
<p>First find the path to your Playwright project. Then copy the path.</p>
</div>
<div class="kc-elm kc-css-1880443 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Copy-the-path-for-your-project.png" class="" alt="Copy the path for your project" />    </div>
<div class="kc-elm kc-css-3393960 kc_text_block a-black">
<p>
Then I can open a PowerShell or a command prompt, and change the directory with the path I just copied. Then run the command to execute my tests.</p>
</div>
<div class="kc-elm kc-css-1730062 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Command-Line-Execution.png" class="" alt="Command Line Execution" />    </div>
<div class="kc-elm kc-css-3537050 kc_text_block a-black">
<p>
You&#8217;ll see from the above example that the command we ran was:</p>
</div>
<div class="kc-elm kc-css-1696388 kc_text_block a-black">
<div class="hcb_wrap">
<pre class="prism lang-html" data-lang="HTML"><code>npx playwright test example.spec.ts</code></pre>
</div>
</div>
<div class="kc-elm kc-css-4048208 kc_text_block a-black">
<p>
This can be broken down into 4 parts.</p>
</div>
<div class="kc-elm kc-css-516276 kc_text_block a-black">
<div class="hcb_wrap">
<pre class="prism lang-html" data-lang="HTML"><code>npx - Node package execute (the executor)
playwright - run the playwright package
test - get the playwright package to run the tests
example.spec.ts - run the tests defined in the spec.ts file
</code></pre>
</div>
</div>
<div class="kc-elm kc-css-179995 kc_text_block a-black">
<p>
In our example we&#8217;re running all the tests in example.spec.ts file against all the browsers we installed when we setup the project. If you want to run against specific browsers use the <b>&#8211;project</b> switch. And if you want to see the results displayed in the Trace Viewer use the <b>&#8211;ui</b> switch. For example:</p>
</div>
<div class="kc-elm kc-css-604707 kc_text_block a-black">
<div class="hcb_wrap">
<pre class="prism lang-html" data-lang="HTML"><code>npx playwright test example.spec.ts --ui --project=chromium</code></pre>
</div>
</div>
<div class="kc-elm kc-css-3580435 kc_text_block a-black">
<p>
In this instance then, the Chromium test run results will be shown in the trace viewer view. You can come in and look at each of the tests and execute them from the trace viewer and see them executing within there.</p>
<p>Another option you have at your disposal, after the tests have run, is to generate a report. As you&#8217;ll see in the command prompt:</p>
</div>
<div class="kc-elm kc-css-1112646 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Playwright-show-report.png" class="" alt="Playwright show-report" />    </div>
<div class="kc-elm kc-css-4017660 kc_text_block a-black">
<p>
As you can see you can run this command:</p>
</div>
<div class="kc-elm kc-css-4080367 kc_text_block a-black">
<div class="hcb_wrap">
<pre class="prism lang-html" data-lang="HTML"><code>npx playwright show-report</code></pre>
</div>
</div>
<div class="kc-elm kc-css-4288201 kc_text_block a-black">
<p>
This will generate a full html repoprt and open it in your default browser.</p>
</div>
<div class="kc-elm kc-css-361239 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Playwright-html-report.png" class="" alt="Playwright html report" />    </div>
<div class="kc-elm kc-css-1754943 kc_text_block a-black">
<p>
From this report you can drill down and look at specific steps or explore any errors that were generated.</p>
</div>
<div class="kc-elm kc-css-3049218 kc_text_block a-black">
<h3 style="margin-top: 1.6em;">Conclusion</h3>
<p>That brings our final module in this series to a conclusion. Over 6 modules We&#8217;ve taken you from the initial install of Playwright through to executing your tests and generating a test report.</p>
<p>In future modules we&#8217;re going to cover lots more on inspectors, writing tests and debugging tests. More to follow soon.</p>
</div>
</div>
</div>
</div>
</div>
</section>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/03/playwright-tutorial-for-beginners-lesson-6/">Playwright Tutorial : Executing Tests in Playwright</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Playwright Tutorial for Beginners : Lesson 5</title>
		<link>https://www.testmanagement.com/blog/2025/03/playwright-tutorial-for-beginners-lesson-5/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Sun, 02 Mar 2025 22:21:08 +0000</pubDate>
				<category><![CDATA[Playwright Tutorial 2025]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12393</guid>

					<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/03/playwright-tutorial-for-beginners-lesson-5/">Playwright Tutorial for Beginners : Lesson 5</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<section class="kc-elm kc-css-58395 kc_row"><div class="kc-row-container  kc-container"><div class="kc-wrap-columns"><div class="kc-elm kc-css-823488 kc_col-sm-12 kc_column kc_col-sm-12"><div class="kc-col-container"><div class="kc-elm kc-css-826225 kc_text_block"></p>
<p>We&#039;ve already seen how to write your first test in Playwright and how to record tests using the &#8220;Test Generator" tool. We&#039;ve seen how to use the pick locator option on our web page to identify objects that we want to interact with too.</p>
<p>
</div><div class="kc-elm kc-css-773560 kc-raw-code"><iframe width="560" height="315" src="https://www.youtube.com/embed/Ny8CGR_GffM?si=B0V9U2coP-gIBw6f" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div><div class="kc-elm kc-css-986913 kc_text_block a-black"></p>
<p>However, there is another stand alone tool called the &#8220;Playwright Inspector". This very useful tool can be used to help you construct your tests and identify locators.</p>
<p>
</div><div class="kc-elm kc-css-571623 kc_shortcode kc_single_image">

        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Playwright-Inspector.png" class="" alt="Playwright Inspector" />    </div>
<div class="kc-elm kc-css-415765 kc_text_block a-black"></p>
<p>This &#8220;<b>Inspector</b>" tool is not directly initialized from within Visual Studio Code. However, you can start it from a terminal using <strong>npx</strong>.</p>
<p>
</div><div class="kc-elm kc-css-72902 kc_text_block a-black"></p>
<h3>Starting Playwright Inspector</h3>
<p>First open a terminal from within VS Codeview terminal.</p>
<p>
</div><div class="kc-elm kc-css-925163 kc_shortcode kc_single_image">

        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Open-A-Terminal-In-VS-Code.png" class="" alt="Open A Terminal In VS Code" />    </div>
<div class="kc-elm kc-css-428714 kc_text_block a-black"></p>
<p>Then you need to execute this <strong>npx</strong> command:</p>
<p>
</div><div class="kc-elm kc-css-112127 kc_text_block a-black"></p>
<div class="hcb_wrap">
<pre class="prism lang-php" data-lang="PHP"><code>npx playwright codegen https://www.google.com</code></pre>
</div>
<p>
</div><div class="kc-elm kc-css-606966 kc_text_block a-black"></p>
<p>Using the url of the web page you want to navigate directly too as the final parameter in the command. Like this:</p>
<p>
</div><div class="kc-elm kc-css-119446 kc_shortcode kc_single_image">

        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Npx-Playwright-Codegen.png" class="" alt="Npx Playwright Codegen" />    </div>
<div class="kc-elm kc-css-379509 kc_text_block a-black"></p>
<p>So you can run this command directly from within Visual Studio Code or if you&#039;ve got a command prompt open, you can run it directly from a command prompt as well.</p>
<p>
</div><div class="kc-elm kc-css-427234 kc_text_block a-black"></p>
<h3>Using Playwright Inspector</h3>
<p>Once you&#039;ve run this what you&#039;ll get is this &#8220;Playwright inspector" tool that command allows you to inspect objects and record tests</p>
<p>As you interact with your application, you&#039;ll see that test steps are added to the test panel:</p>
<p>
</div><div class="kc-elm kc-css-14370 kc_shortcode kc_single_image">

        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Recording-Tests-with-Playwright-Inspector.png" class="" alt="Recording Tests with Playwright Inspector" />    </div>
<div class="kc-elm kc-css-933216 kc_text_block a-black"></p>
<p>We can also use the locator tool to identify objects that we might want to interact with.</p>
<p>
</div><div class="kc-elm kc-css-415074 kc_shortcode kc_single_image">

        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Using-the-Inspector-Tool.png" class="" alt="Using the Inspector Tool" />    </div>
<div class="kc-elm kc-css-82626 kc_text_block a-black"></p>
<p>Then we can see and copy the locator code that Playwright will generate. We can jump back into record mode again if we need to, if we want to continue to record in our script, and we can use the assert visibility, assert text, and assert value options in the toolbar as well to add expect statements to our script that we&#039;re recording.</p>
<p>
</div><div class="kc-elm kc-css-886563 kc_shortcode kc_single_image">

        <img src="https://www.testmanagement.com/wp-content/uploads/2025/03/Assert-Functionality.png" class="" alt="Assert Functionality" />    </div>
<div class="kc-elm kc-css-199338 kc_text_block a-black"></p>
<p>Once we&#039;ve completed the recording of that script, we can, of course, copy the code, and add to one of our test specifications (or we can create a completely new test test specification if required).</p>
<p>The Playwright Inspector tools is a useful little tool that you&#039;ll find helps you experiment a bit with some of the tests and work out locators before you add them to your test specifications within Visual Code Studio.</p>
<p>So in the next lesson, we&#039;re going to look at executing tests within the Visual Studio environment and how to execute them from the command line too.</p>
<p>
</div></div></div></div></div></section>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/03/playwright-tutorial-for-beginners-lesson-5/">Playwright Tutorial for Beginners : Lesson 5</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Playwright Tutorial 2025 : Recording Tests</title>
		<link>https://www.testmanagement.com/blog/2025/02/playwright-tutorial-2025-recording-tests/</link>
		
		<dc:creator><![CDATA[Bill Echlin]]></dc:creator>
		<pubDate>Tue, 25 Feb 2025 15:29:57 +0000</pubDate>
				<category><![CDATA[Playwright Tutorial 2025]]></category>
		<guid isPermaLink="false">https://www.testmanagement.com/?p=12379</guid>

					<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/02/playwright-tutorial-2025-recording-tests/">Playwright Tutorial 2025 : Recording Tests</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></description>
										<content:encoded><![CDATA[<style type="text/css">body.kc-css-system .kc-css-1514283{padding-top: 0px;padding-bottom: 0px;}body.kc-css-system .kc-css-1514283 p{margin-top: 10px;margin-bottom: 10px;}body.kc-css-system .kc-css-388251{text-align: center;}body.kc-css-system .kc-css-497458{text-align: center;}body.kc-css-system .kc-css-2694478{text-align: center;}body.kc-css-system .kc-css-3407328{text-align: center;}body.kc-css-system .kc-css-170717{text-align: center;}body.kc-css-system .kc-css-2417646{text-align: center;}body.kc-css-system .kc-css-1843792{text-align: center;}body.kc-css-system .kc-css-3026158{text-align: center;}</style>
<section class="kc-elm kc-css-1855220 kc_row">
<div class="kc-row-container  kc-container">
<div class="kc-wrap-columns">
<div class="kc-elm kc-css-2239080 kc_col-sm-12 kc_column kc_col-sm-12">
<div class="kc-col-container">
<div class="kc-elm kc-css-1514283 kc_text_block">
<p>In this lesson we want to have a look at recording tests with the Playwright test generator.</p>
</div>
<div class="kc-elm kc-css-2003822 kc-raw-code"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/4CiD8Hzdtgw?si=ny9hz4eLbxZqHPni" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<div class="kc-elm kc-css-3741680 kc_text_block a-black">
<p>The Playwright &#8220;Test Generator&#8221; is a tool for recording tests. And I agree with you … recording tests is not a good approach to build automated tests. However, it is a good approach for learning Playwright and working out how Playwright works. It can also help you build chunks of code that you can copy into your projects.</p>
</div>
<div class="kc-elm kc-css-2251881 kc_text_block a-black">
<h3>Starting the Test Generator</h3>
<p>You can start the &#8220;Test Generator&#8221; from the Playwright menu in the test explorer view.</p>
</div>
<div class="kc-elm kc-css-388251 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Starting-To-Record-A-Test.png" class="" alt="Starting To Record A Test" />    </div>
<div class="kc-elm kc-css-2622306 kc_text_block a-black">
<p>From here you should see a browser open with the recording bar displayed.</p>
</div>
<div class="kc-elm kc-css-497458 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/The-Playwright-Recording-Bar.png" class="" alt="The Playwright Recording Bar" />    </div>
<div class="kc-elm kc-css-164662 kc_text_block a-black">
<p>In the background, in VS Code, you should see the creation of an initial test specification file, test one spec, along with the initial test that we&#039;re going to be recording.</p>
</div>
<div class="kc-elm kc-css-2694478 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Test-Script-Recording.png" class="" alt="Test Script Recording" />    </div>
<div class="kc-elm kc-css-1233847 kc_text_block a-black">
<h3>Recording The Test</h3>
<p>Now I can enter the URL in the browser, and you&#039;ll see the steps that you complete created as a TypeScript script in your specification file.</p>
</div>
<div class="kc-elm kc-css-3407328 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Script-Creation-in-VS-Code.png" class="" alt="Script Creation in VS Code" />    </div>
<div class="kc-elm kc-css-4167803 kc_text_block a-black">
<p>Now you&#039;ll see in the recording bar displayed in the browser and that we&#039;re ready to start recording.</p>
<p>that we&#039;ve got five options. One is that we&#039;re in record mode. Two is the locator selection tool. Then we&#039;ve got the assert functionality. So we can assert on three things, visibility on text and on a value.</p>
</div>
<div class="kc-elm kc-css-1472770 kc_text_block a-black">
<h3>The Test Generator Tool Bar</h3>
<p>You see on the tool bar that we have five options.</p>
</div>
<div class="kc-elm kc-css-170717 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Playwright-Test-Generator-Tool-Bar.png" class="" alt="Playwright Test Generator Tool Bar" />    </div>
<div class="kc-elm kc-css-2494630 kc_text_block a-black">
<p>One is that we&#039;re in record mode. Two is the locator selection tool. Then we&#039;ve got the assert functionality. So we can assert on three things, visibility on text and on a value.</p>
<p>For example if we use the visibility assert feature, we can check that the Google logo is displayed. If I select the Google logo we can see that an expect statement is generated.</p>
</div>
<div class="kc-elm kc-css-2417646 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Generating-Expect-Statement-for-Image-Visibility-Assertion.png" class="" alt="Generating Expect Statement for Image Visibility Assertion" />    </div>
<div class="kc-elm kc-css-3322884 kc_text_block a-black">
<p>The other option in the record bar is the pick locator. You can use the select pick locator and then you can look at the locators that Playwright would use to identify the objects or elements in your web application.</p>
</div>
<div class="kc-elm kc-css-1843792 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Test-Generator-Pick-Locator.png" class="" alt="Test Generator Pick Locator" />    </div>
<div class="kc-elm kc-css-3188931 kc_text_block a-black">
<p>At first it looks like it&#039;s a bit difficult to actually copy that locator you need. However, if you actually click on the element, you will see the locator is entered in the VS Code bar at the top of the page. From there, you can copy the locator and you can add this into your scripts manually.</p>
</div>
<div class="kc-elm kc-css-3026158 kc_shortcode kc_single_image">
<p>        <img src="https://www.testmanagement.com/wp-content/uploads/2025/02/Copy-locator-code.png" class="" alt="Copy locator code" />    </div>
<div class="kc-elm kc-css-3861631 kc_text_block a-black">
<p>Another tip for you &#8211; once you&#039;ve used that locator the test generator does flip out of record mode. The key to continuing your recording is to put the cursor back in your script where you want to continue recording, and then click on the record button to continue where you left off.</p>
<p>In the next lesson then we&#039;re going to look at these inspectors and locators in a little bit more detail. We&#039;ll see how Playwright identifies elements in your application and how it creates those locator statements.</p>
</div>
</div>
</div>
</div>
</div>
</section>
<p>The post <a rel="nofollow" href="https://www.testmanagement.com/blog/2025/02/playwright-tutorial-2025-recording-tests/">Playwright Tutorial 2025 : Recording Tests</a> appeared first on <a rel="nofollow" href="https://www.testmanagement.com">Test Management</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
