<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
      <title>EvilTester.com on EvilTester.com - Exploratory Testing, Automation, Development (Agile &#43; Web) </title>
      <generator uri="https://gohugo.io">Hugo</generator>
    <link>https://www.eviltester.com/</link>
    <language>en-us</language>
    <author>Alan Richardson</author>
    
    <updated>Thu, 05 Mar 2026 16:08:43 GMT</updated>

    
    
    
    <item>
      <title>Free Selenium WebDriver with Java Course Released To Youtube</title>
      <link>https://www.eviltester.com/blog/eviltester/news/free-selenium-webdriver-course/</link>
      <pubDate>Thu, 19 Feb 2026 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/news/free-selenium-webdriver-course/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; Selenium WebDriver Course course has been released to YouTube as a 16 hour video. And split into 8 smaller 1-4 hour video chunks&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;free-selenium-webdriver-courses&#34;&gt;Free Selenium WebDriver Courses&lt;/h2&gt;
&lt;h3 id=&#34;playlist-and-resources&#34;&gt;Playlist and Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&#34;https://www.youtube.com/playlist?list=PLrM2ELpRbbu5cssB2fGm9gqUz5ZY_SPvQ&#34;&gt;Playlist with 9 videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://www.eviltester.com/page/onlinetraining/javawebdriver/&#34;&gt;Course Page with embedded videos and more instructions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;course-page&#34;&gt;Course Page&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.eviltester.com/page/onlinetraining/javawebdriver/&#34;&gt;course page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The course page has been updated to have the videos embedded, with some text description to make it easier to navigate.&lt;/p&gt;
&lt;p&gt;I dropped some of the heavily deprecated content and re-organised it slightly when combining the videos.&lt;/p&gt;
&lt;p&gt;Slides etc. can also be found via the &lt;a href=&#34;https://www.eviltester.com/page/onlinetraining/javawebdriver/&#34;&gt;course page&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;other-free-online-webdriver-courses&#34;&gt;Other Free Online WebDriver Courses&lt;/h3&gt;
&lt;p&gt;I should also point out that in 2024, Rex Jones and FreeCodeCamp released a 7 Hour video course to YouTube showing WebDriver with Java, which could also be worth looking at for your self-education.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=QQliGCtqD2w&#34;&gt;https://www.youtube.com/watch?v=QQliGCtqD2w&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code: &lt;a href=&#34;https://github.com/RexJonesII/FreeCodeCampSeleniumJava&#34;&gt;https://github.com/RexJonesII/FreeCodeCampSeleniumJava&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rex Jones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rexjones2.com/&#34;&gt;https://www.rexjones2.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/rexjones34/&#34;&gt;https://www.linkedin.com/in/rexjones34/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/c/RexJonesII&#34;&gt;https://www.youtube.com/c/RexJonesII&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;history-of-my-course&#34;&gt;History of My Course&lt;/h2&gt;
&lt;p&gt;I first created the course for Selenium WebDriver 2, then updated it for Selenium WebDriver 3.&lt;/p&gt;
&lt;p&gt;This was the first &amp;lsquo;big&amp;rsquo; online course I created and it got a little too large.&lt;/p&gt;
&lt;p&gt;Also it was fairly horrible to keep updating over time.&lt;/p&gt;
&lt;p&gt;It would have been fine to update if it had only been on one hosting platform.&lt;/p&gt;
&lt;p&gt;First it was on Udemy, but then they changed all their rules, controlled what you could charge, and changed their fee structure.&lt;/p&gt;
&lt;p&gt;So then I moved to Teachable, but they backtracked on their promise to handle VAT properly (which they now do I think).&lt;/p&gt;
&lt;p&gt;So then I moved to Zenler, and they then migrated to New Zenler, and then they completely abandoned the agreement that I was on for course hosting and basically turned off access to the course.&lt;/p&gt;
&lt;p&gt;I tried to keep the course updated on all platforms at the same time because I had people subscribed to all the course sites. This made maintenance a tad hard, but forced me to automate, using the sites public and private APIs. I&amp;rsquo;m quite resourceful when it comes to automating.&lt;/p&gt;
&lt;p&gt;Because of this, I did write code which could download the videos and create import routines and &amp;lsquo;mostly automated&amp;rsquo; synchronisation tools for most of the sites. This made my life a little easier and meant that I could create the free to Patreon subscribers course hosting on &lt;a href=&#34;htttps://testerhq.com&#34;&gt;testerhq.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The data structures and code that backs testerhq makes it possible for me to now script the creation of longer combined videos through the use of some command line tooling and ffmpeg magic.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always tried to honour the &amp;rsquo;lifetime access&amp;rsquo; agreement, even when the course hosting providers haven&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Up until a month or so ago, I was able to create free coupons for people to migrate from NewZenler over to Udemy, but that no longer seems to work for my courses now.&lt;/p&gt;
&lt;p&gt;So now&amp;hellip; the easiest way for people on the different course hosting site to get access is directly on Youtube. And if you want access to the individual videos, people on Udemy should still have access. NewZenler folks have no access at all. I&amp;rsquo;m not sure about Teachable. But &lt;a href=&#34;htttps://testerhq.com&#34;&gt;testerhq.com&lt;/a&gt;, which is available to anyone supporting me on Patreon has the individual videos.&lt;/p&gt;
&lt;p&gt;The TesterHQ videos are hosted on Vimeo, so I nervously await changes to Vimeo due to the ownership change over to Bending Spoons.&lt;/p&gt;
&lt;h2 id=&#34;relevance&#34;&gt;Relevance&lt;/h2&gt;
&lt;p&gt;The course is a little old now because it is based on WebDriver 3. But there aren&amp;rsquo;t that many changes from WebDriver 3 to version 4 - some methods were removed, and the WebDriverWait now uses a Duration rather than int for milliseconds.&lt;/p&gt;
&lt;p&gt;But&amp;hellip; I did also keep the source code for the course up to date, and did update it for WebDriver 4.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eviltester/seleniumWebDriverAPICourse&#34;&gt;github.com/eviltester/seleniumWebDriverAPICourse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The docs folder of the above repo contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the slides for the online course&lt;/li&gt;
&lt;li&gt;handouts and slides for physical workshops based on the online course content&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So&amp;hellip; using the code in the repo, in combination with the videos, should still work.&lt;/p&gt;
&lt;p&gt;If I get time then I might create a much tighter, more modern version of the course. But don&amp;rsquo;t hold your breath! I have other projects taking priority at the moment.&lt;/p&gt;
&lt;h2 id=&#34;thanks&#34;&gt;Thanks&lt;/h2&gt;
&lt;p&gt;Thanks to everyone who supported the course over the years.&lt;/p&gt;
&lt;p&gt;People have asked for continued access to it, so there must be some value in going back and revisiting the material in the course.&lt;/p&gt;
&lt;p&gt;You can find all the details and videos on the &lt;a href=&#34;https://www.eviltester.com/page/onlinetraining/javawebdriver/&#34;&gt;course page&lt;/a&gt;.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Software Testing Podcast - Agentic AI Quality Engineering - The Evil Tester Show Episode 030</title>
      <link>https://www.eviltester.com/show/030-agentic-ai-quality-engineering/</link>
      <pubDate>Thu, 12 Feb 2026 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/show/030-agentic-ai-quality-engineering/</guid>
      <description>&lt;p&gt;This podcast episode is a chat with Dragan Spiridonov who created the Agentic QE fleet. Agentic AI for Quality Engineering. It can work with code, or websites. We will explore Agentic AI, what it means, and how to use it to improve your Software Development and Testing. Also introduce the Agentic QE Fleet and how it augments Claude Code and Claude Flow.&lt;/p&gt;
&lt;h2 id=&#34;agentic-ai-quality-engineering&#34;&gt;Agentic AI Quality Engineering&lt;/h2&gt;
&lt;p&gt;Dragan Spiridonov created the Agentic QE Fleet tooling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/proffesor-for-testing/agentic-qe&#34;&gt;https://github.com/proffesor-for-testing/agentic-qe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://agentic-qe.dev/&#34;&gt;https://agentic-qe.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This augments Claude Code to extend the Agentic processing to cover Quality Reviews and insights. The AI Tooling can use Playwright, Vibium and other Visual Automating tools to automate browsers and capture screenshots.&lt;/p&gt;
&lt;p&gt;You can learn more about Dragan on his web sites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://forge-quality.dev/&#34;&gt;https://forge-quality.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/dragan-spiridonov/&#34;&gt;https://www.linkedin.com/in/dragan-spiridonov/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://spiridonovdragan.com/&#34;&gt;https://spiridonovdragan.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a more technical overview of the Agentic QE tool in action:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://video.agentics.org/media/t/1_htfe35tu/370465892&#34;&gt;https://video.agentics.org/media/t/1_htfe35tu/370465892&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other links mentioned in the video:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/@AgenticFoundationSerbia&#34;&gt;https://www.youtube.com/@AgenticFoundationSerbia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://quantum-qe.dev/&#34;&gt;https://quantum-qe.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/proffesor-for-testing/agentic-qe&#34;&gt;https://github.com/proffesor-for-testing/agentic-qe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ruvnet/claude-flow&#34;&gt;https://github.com/ruvnet/claude-flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://agentics.org/&#34;&gt;https://agentics.org/&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;for video archive &lt;a href=&#34;https://video.agentics.org&#34;&gt;https://video.agentics.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transcript&#34;&gt;Transcript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; welcome to the Evil Tester Show, and in this episode we&amp;rsquo;re gonna be talking about agentic AI and software development. I am joined by a guest, the creator of the Agentic QE tool, Dragan Spiridonov&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; and you can find his blog, the Quality Forge at Forge Quality Dev.&lt;/p&gt;
&lt;p&gt;Uh, so Hello Dragan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Hello, Alan. Nice to,  be here as a guest to your podcast as I&amp;rsquo;m your, you know, fan for a long time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Well, thanks for turning up. &amp;lsquo;cause  I&amp;rsquo;m a fan of your stuff and it&amp;rsquo;s making me think and learn new things and that&amp;rsquo;s important. And you have a, an awful lot of websites, so I&amp;rsquo;m not going to read them all out. I&amp;rsquo;m just gonna link to them all in the show notes.  but I think. Forge quality dev is easiest one to remember, and you just got your blog on it and you&amp;rsquo;re listing lots of experiments in there because what you&amp;rsquo;re doing with Agentic stuff is create a tool, but you&amp;rsquo;re also learning how Agentic stuff works and you&amp;rsquo;re learning in public and putting all this content out there.&lt;/p&gt;
&lt;p&gt;So&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I thought it might be worth starting if you gave a quick overview of yourself and your work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Quick one, that that will be hard. So in short, as it&amp;rsquo;s, we are now 2026, so yeah, I would say like 30 years in, it started as a computer service,  technician, went into network administration, was teaching computer science in grammar high school and assistant professor at university, combining. You know, web development, web administration, database administration. In the end, somewhere like 12 or 13 years ago, I ended up in quality assurance world all the pieces and things I&amp;rsquo;ve been doing previous years just,  clicked and  I am been learning and. Building on the quality side for now, let&amp;rsquo;s say 13 years. Uh, for the last nine years, I helped, one startup build completely quality assurance and quality engineering, left that four months ago to start my own, consultancy. Now because, these things. Agentic related are, you know, I felt obligated as I&amp;rsquo;m learning about them to start sharing that more because, I&amp;rsquo;m noticing that not many people in industry are embracing this new wave that is coming&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So, I mean, that&amp;rsquo;s hard because, &amp;lsquo;cause the agent is not the first thing you encounter when you&amp;rsquo;re doing ai. Right. We all start with the chat interfaces, chat, GBT, we do stuff. Uh, and I, I started with Claude Code in the chat system and created some applications and then essentially gave up on claude code because you can only do so much in there and it runs outta context and then stops building and then you have to move into the, the CLI.&lt;/p&gt;
&lt;p&gt;So there&amp;rsquo;s a, a kinda natural progression through this. So did you work through that progression? Did you start on the chat systems then other code systems? Or did you just dive straight in with Claude?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; No, two years ago I started experimenting with a,  prompt, so you know how I can prompt an agent. At that time, we only had chats to experiment with, so I would do like a tester,  mindset.&lt;/p&gt;
&lt;p&gt;I would give the same prompt to chat GPT, Gemini, or claude, and compare the results that I&amp;rsquo;m getting, a year ago. Or I would say maybe now more year and a half ago, I started diving deeper into really prompt engineering. So understanding how I can,  make those general prompts more  using like. Role based things, providing context markups, giving examples, so really going into prompt engineering. And that was still not enough because I would get like maybe 50, 60% of results that I could keep. So the next step. Next level was contact engineering. I would say a year ago I started diving more deeper into AI coding assistant tools like client root code that provide their own memory banks and give you like a first level for context engineering, where you are grounding your agents in a certain context of your project when you are,  letting them run in your code base that improved the results. not,  to get over 80% of the accepted results. sometime nine months ago I experienced agentic development and this approach and agentic engineering that&amp;rsquo;s like,  next level after context engineering. And, you know, the results were mind blowing and  now, you know, getting, I would say I can keep more than 90% of the things that agent produce,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So we should probably then explain what agent based AI is and how it differs then.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt;  yeah, so classical Chat GPT, LLM, approaches. That&amp;rsquo;s, you are only prompting LLM and there is,  there is general behavior there of the l LMS as uh, like a standard transformers. So they will try to,   find the best next word in, in the area and give you some answers. Agentic approach is.  agents need first to observe the environment, so they need to collect the data about the, you know, let&amp;rsquo;s say you, you give them,  some goal they need to achieve. They need to observe, collect the data that they need. They need to reason, so that&amp;rsquo;s the moment when either they&amp;rsquo;re calling the LLMs or they&amp;rsquo;re using the,  some other mechanisms that some of the folks from Agentic Foundations are developing and I&amp;rsquo;m using like Reasoning Bank and  some local specially developed models for specific purposes. And then they&amp;rsquo;re autonomously executing.  towards the targeted goal. So that&amp;rsquo;s like you are giving the goal, but you are letting the agent do the all the work and heavy lifting and reach the goal. And you as a human in the loop, you are observing the results. And if you implement correctly, you can collect and implement your agents to do the. Their work ex in explainable way, so you can observe what what they&amp;rsquo;re doing while they&amp;rsquo;re doing&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So that was an interesting description and because what you said was the agent, when it does reasoning, will call the LLM, which suggests that the agent can do things without calling an LLM where I&amp;rsquo;d always just assumed the agent is working as essentially a prompt into that LLM doing stuff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; So agents have their own also their also programs. So they&amp;rsquo;re,  pieces of software that they have their own logic. So you can code a lot of, deterministic logic into agent for types of tasks that you are certain that must be done in the deterministic way. But you call LLM only,  when there is like a, new. , Crossroads. Or, point where they need to decide in which direction, you know, what would be the next step to execute to get to the desired goal?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So is the agent more than just the agents MD file or is that the agent? Because the agent&amp;rsquo;s MD file is readable. It&amp;rsquo;s uh, eng English language. So an LLM must have to read it to understand it, but you&amp;rsquo;ve got code embedded in there to let it do things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; that&amp;rsquo;s not the agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; only, agent definition that like claude or, codex or Germany will use to start a subtask using that, like a warmup prompt. And that&amp;rsquo;s, you know, if. Part of that call. So if in the MD agent definition you have a call to a platform, like in this case my agentic QE platform, it extends and it has additional capabilities on top of what is defined in the MD file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay. Right. So the agent is kind of like a thread that starts up, it&amp;rsquo;s given some additional context. Some of the context you feed in through the agent&amp;rsquo;s file, some of it comes somewhere else, and you could essentially create specialized agents that do certain things that don&amp;rsquo;t even necessarily need to use LLMs, depending on the kind of orchestration framework that you have.&lt;/p&gt;
&lt;p&gt;Alright, see, this is why, I wanted you. In here to explain this stuff properly. And from a, a kind of, this is just gonna be an overview of what we&amp;rsquo;re we&amp;rsquo;re covering. &amp;lsquo;cause  you&amp;rsquo;ve done so many presentations on this, I&amp;rsquo;m gonna link to some of them. In the show notes so people can go down and through this, in more detail because I&amp;rsquo;m actually giving you a hard task.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;cause I&amp;rsquo;m asking you to describe all this stuff in the work without any slides, without any IDE open. You&amp;rsquo;re not allowed to look at code, you&amp;rsquo;re just gonna have to verbalize it. So we&amp;rsquo;ll see how we get on. That&amp;rsquo;s interesting with the, the agents and you&amp;rsquo;ve pretty much built. The Agentic QE system on top of Claude at the moment.&lt;/p&gt;
&lt;p&gt;So how would you describe the agentic QE system that you have built?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt;  it&amp;rsquo;s an quality oriented orchestration system with specialized agents and skills, like. Covering complete software development lifecycle quality related tasks. So whatever I was doing in the previous 13 or 14 years, like trying to become that calm shape person that,  picked up different, specialties on the way the testing the requirements to. Creating test plans, test strategies, different generating test cases on different levels, analyzing the tests for flakiness, so,  creating like a combo tool. For all the tasks that me as a tester previously needed to create separate tools. So, you know, you are also like a tool Smith, so I know you&amp;rsquo;re a colleague that creates his own tools to help him with the testing tasks. So we are using tools to surface the certain types of information and certain phases in the project as we are working on it. So my idea behind the whole fleet was to create. agentic based system that will provide tools I can use in different phases of the project and the product development to surface the information that I would be interested as a tester to identify faster risks to,  maybe uncover things that I&amp;rsquo;m not specialist in, so I&amp;rsquo;m not. You know, I have a general knowledge of security testing, but I can make my agent,  with induced with some practices that I not aware, and I can use that to surface some information that I would miss if I wouldn&amp;rsquo;t have a person of that specialization in my team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Do you think that your, background, &amp;lsquo;cause when you described your background. It was, an evolution across the entire software development process where you&amp;rsquo;re, you&amp;rsquo;re doing development work, you&amp;rsquo;re doing networking, there&amp;rsquo;s very technical stuff. You&amp;rsquo;re teaching it. It&amp;rsquo;s not, it wasn&amp;rsquo;t just a I test things role, it was very much a software development role.&lt;/p&gt;
&lt;p&gt;Then the testing on top of that showed you that quality aspect that&amp;rsquo;s required across the software development process. So your agent stack kinda reflects that. It&amp;rsquo;s not just a testing agent. That&amp;rsquo;s why this, the qe, the quality engineering aspect encompasses that whole thing.  so what&amp;rsquo;s interesting about that is when you start creating agents that cover topics that you&amp;rsquo;re not an expert in, how do you evaluate them?&lt;/p&gt;
&lt;p&gt;Like, how do you evaluate the security one? How do you evaluate the accessibility agent?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; I ask experts to evaluate that, so I&amp;rsquo;m asking other colleagues that I know that are in that field to check the results that these types of agents are producing and provide me feedback what should be improved. And I&amp;rsquo;m also not. Uh, I&amp;rsquo;m never satisfied with the first version that I get, so,  I will always ask, you know, use, that&amp;rsquo;s why I develop certain skills I&amp;rsquo;m using now to evaluate the work of my agents while working on developing my agent fleet. So,  I&amp;rsquo;m like doing a combo of agents and skills, reevaluating the results that they are,  producing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So since you&amp;rsquo;ve mentioned skills, what&amp;rsquo;s the difference between a skill and an agent?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt;  oh, this, this is like a metaphor that, I think people  understand. Uh, easiest, everybody knows Matrix. Matrix, right? The movie. So you have Neo, you have Agent Smith, both them. A learned a skill just by,  uploading it. So a skill is a knowledge of how you are doing some things. Agent is, let&amp;rsquo;s say object that executes that skill. So I know kung fu, but I need a physical, or in this case agent, I need like a body to execute the skill and,  fight the kung fu with some other agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay. And are they pulled in dynamically when the agent needs them? If you tell agent use Skill X, then it&amp;rsquo;ll go in and pull it in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; yes. And skills have&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; own related agents that they are calling because it&amp;rsquo;s not only skill is not like using only one agent. So for different,  types of skills, you can use multiple agents in parallel on sequential or hierarchical, depending on the. , Context of the task again that you are trying to solve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay, so since we&amp;rsquo;re doing this as an audio and we&amp;rsquo;re gonna start describing the agent QE fleet. So in order to use a agentic qe, you have to install Claude. Get claude working, then you do an NPM install minus G for the agentic QE fleet. Then that installs, something that you can run aqe to initialize information in your project, which then creates a set of, agents and other files in there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; there,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; And then you can start using&lt;/p&gt;
&lt;p&gt;aqe on a project and you can do that within Claude and say, Claude, use the quality engineering fleet to. Do something. What kinda things would you use it to do on your project?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Um. You can do it for different types of things, depending where your project is. So,  let&amp;rsquo;s, you know, I, I will, for example,  if your project is, is in a greenfield phase, so you&amp;rsquo;re starting with the requirements, you are generating some ideas you created maybe like a product requirements document or some documents that you want, you can use different agents to verify that.&lt;/p&gt;
&lt;p&gt;So there is like a QE requirements validator. You can use, it&amp;rsquo;ll use INVEST and SMART criteria and other,  good practices from the field to analyze the requirements to see really if they are, if we are missing something. And  a lot of times it&amp;rsquo;ll find things that are missing. There is like. Lalitkumar Bhamare, he created QCSD version of skills that there is like a QC id, SD ideation form that the whole, heuristic base software testing model. Like, SFDPO or analytic analytics. So complete, heuristic based testing applied to the ideation or to the development or the refinement. So depending on which of the phases, there are different, swarm skills.&lt;/p&gt;
&lt;p&gt;So they, he call them like, swarms, like, Q Cs, the ideation swarm or something like that. they&amp;rsquo;re,  shift left testing skill if you are in the left. Like requirements analysis, feature analysis, and the things before we start implementation, we have skills for analyzing what&amp;rsquo;s happening. Okay, we need it now we have requirements. Let&amp;rsquo;s create a test strategy. Let&amp;rsquo;s create a test plan. Let&amp;rsquo;s define what will be the test charters that we want to, and that&amp;rsquo;s usually something that you get automatically if you use that QCSD, you know, a requirement or ideations form. It&amp;rsquo;ll create you suggestions, not only which test on integration or end-to-end level to implement, but which test sessions you should exploratory next to the automation that it provided.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay, so this, because earlier on you mentioned that the agent will go out&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; out&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; and kind of find its context. So you could instantiate a QE in an existing project. It&amp;rsquo;ll have all the code. And you could then ask it to do things on the code, or you could instantiate a project in just a J any folder.&lt;/p&gt;
&lt;p&gt;You could then start adding text files that describe what testing you&amp;rsquo;ve done, what you might want to do, how the architecture works, and it&amp;rsquo;ll use that. Or you could then say, A QE, here&amp;rsquo;s a website. Here&amp;rsquo;s a URL. Go away, have a look at it. Then it will go and fetch the content, pull it down, use that as the context, and then do stuff there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Yes. And we, there are visual agents, so there are MCPs and, let&amp;rsquo;s say, libraries, that agentic fleet. Agents and skills are using to go and really do the browser. uh, I&amp;rsquo;m using even Vibium for some stuff. So some of our visual testers have like a fallback If Vibium is not working because there is some problem on the Mac.&lt;/p&gt;
&lt;p&gt;If the fallback to the agent browser, then as agent browser is already using like a Playwrite. Like an engine behind. If that is not available, it&amp;rsquo;ll just use the pure, pure Playwrite? And it run Chromium headless. It&amp;rsquo;ll capture screenshots, it&amp;rsquo;ll follow URLs. So  whatever needed, it can do also from that side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; And do I have to install the kind of playwright MCP in Claude first? Or when I use a QE, does it dynamically bring down the MCP?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; dynamically, pull as a dependency based on my MPM package. The playwright, as a depend, it should pull playwright as a dependency, but is by some chance it&amp;rsquo;s not there. You can always ask claude. Okay? Please add,  playwright, MCP and install Chromium. Run it in headless,  mode. And when you set,  set it up in your environment.&lt;/p&gt;
&lt;p&gt;You are good to go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay. So one of the interesting things about your website, the, quality Forge you have on there, I think it&amp;rsquo;s on the front page, a list of experiments. So it&amp;rsquo;s experiments that you&amp;rsquo;ve done, experiments you&amp;rsquo;re currently doing, experiments you&amp;rsquo;re gonna do. Then you blog about those experiments so we can see it.&lt;/p&gt;
&lt;p&gt;you also have the, I can&amp;rsquo;t remember what it&amp;rsquo;s called, the Serbian Agent Foundation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; There be an agentic foundation chapter in the time starting as ambassador.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Yep. And that&amp;rsquo;s all streamed on YouTube. And those videos are interesting to watch because you see the evolution of the tool and, you can see that it&amp;rsquo;s, you&amp;rsquo;re, you&amp;rsquo;re learning in public and experiment in public and. Some people might not like the videos &amp;lsquo;cause things are going wrong in the video. But I like that because then I can see it&amp;rsquo;s not just me.&lt;/p&gt;
&lt;p&gt;there&amp;rsquo;s other stuff that we need to learn and then you see how to overcome it and you, you get the thinking process. &amp;lsquo;cause there&amp;rsquo;s a lot to learn in here. So this, do you view this as a finished product or a version product? Or is this an experiment that&amp;rsquo;s ongoing?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Um. I mean, definitely a long way to be finished, but it&amp;rsquo;s quite useful currently, and I&amp;rsquo;m already getting a, a number of feedbacks from people using it on their products and getting value, especially from developers. So testers are you know, little,  we are,  skeptic by nature. I would,  call it like that. And that&amp;rsquo;s okay. And as  people are starting to use it. And experiment and see the results. I&amp;rsquo;m expecting them to provide the feedback because again, my experience is limited to my knowledge. I can build the. Fleet best based on my knowledge. But until I&amp;rsquo;m, and I&amp;rsquo;m getting, you know, there are contributors already, so Ali started contributing users as they&amp;rsquo;re using, when they,  find problems, they will report a problem and I will,  try to fix it, as my time allows. But I&amp;rsquo;m trying to allocate working daily on this project and keeping it live. it brings value in my other projects as I&amp;rsquo;m using that to test all other projects that I&amp;rsquo;m,  working, using the agentic approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So it&amp;rsquo;s interesting that, I mean, I can understand why people who are more specialized in programming get more out of it than the, people in testing field. It&amp;rsquo;s partly because they&amp;rsquo;re the ones that are using these tools more like they&amp;rsquo;re using Claude much more. It&amp;rsquo;s part of their workflow.  they don&amp;rsquo;t necessarily.&lt;/p&gt;
&lt;p&gt;They haven&amp;rsquo;t studied security testing, accessibility testing, even to the limited extent that we might have done in&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; in&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; just as part of testing. So the fact that something has a set of encoded information that they can use and it generates a human readable report, right? Because that&amp;rsquo;s one of the things when I&amp;rsquo;m using the agentic qe, I&amp;rsquo;m getting it to generate markdown, human readable reports.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not. Doing stuff for me. It&amp;rsquo;s not like raising defects around this. It&amp;rsquo;s generating a report that I read and evaluate and then I can see the gaps in. And I had it running against one of my podcast transcription apps this morning. It was telling me in black and white, all the things I knew were wrong with this.&lt;/p&gt;
&lt;p&gt;and I have to work on it. So when you&amp;rsquo;re using this, the agentic QE part is the.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; That&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Quality information and evaluation. Does that mean that Claude, you&amp;rsquo;re using Claude as your development programming tool and then Agentic QE is a, an evaluation tool on top of that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; them, but not only single, you know, not only claude. I am using, orchestration framework developed by founder of the agentics Foundation. And that helped,  that really enabled me to get here. I use claude-flow for orchestration, so there is. claude-flow for orchestration, but not only, it&amp;rsquo;s like a planning research development, CICD, GitHub action.&lt;/p&gt;
&lt;p&gt;So whatever, I need development related. There are a couple of testing agents there, but they&amp;rsquo;re not, they were not on the level that I wanted to have. That&amp;rsquo;s why I. Created and initially idea of Agentic QE fleet was like a extension for claude flow. So when I originally developed it, it was really tightly coupled with the claude flow.&lt;/p&gt;
&lt;p&gt;You couldn&amp;rsquo;t even use it without the claude flow. And then,  in the versions it,  evolved into now, you know, standalone platform that can be used not only with the Claude, but any tool that has like, you can use with the MCP. Because my,  agentic QA fleet provides MCP server. Any tool with the MCP client can access it. You can also access it through the CLI, so capabilities of the platform are not limited only to the claude code. Interface, but they provide the best results if you use the claude code interface because the subtasks system that they created and the prompts that Claude code pre prepares when he&amp;rsquo;s activating the agents or,  calling the tools in the sequences, I, I need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So that&amp;rsquo;s interesting &amp;lsquo;cause I didn&amp;rsquo;t realize that. So when I installed Agentic qe, I did see after the installation that said, now type with this claude install MCP. So I could have done that in any of the. CLI tools. I could be using that in Gemini. I could use that in open code as an MCP server, so I might try that.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s interesting. Because also at the moment, I am abusing Claude because I&amp;rsquo;ve got Claude pointed to open router. &amp;lsquo;cause you can now configure. I used to have to use the proxy, but now you can configure Claude to use that. So I&amp;rsquo;m using very different models in Claude than the Opus ones. So it&amp;rsquo;s running a little bit more slowly for me, but I can use this quite happily.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; on&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; On free models. Completely free models, so you don&amp;rsquo;t need a Claude plan for this. And, but that&amp;rsquo;s even more interesting that you&amp;rsquo;ve got the MCP server, so you could use that directly somewhere else.  so, and also, so you&amp;rsquo;ve got Claude code for coding, then you&amp;rsquo;ve got Claude Flow for Development. So Claude Code gives you the ability to plan and then execute.&lt;/p&gt;
&lt;p&gt;But Claude Flow gives you all this requirements analysis, everything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; With the claude flow agents. So&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; approach, if you watch the videos, I&amp;rsquo;m using certain agents from the claude flow. There is research agent for a,  doing the research. There is like a goal. Based agent, that creates me goal oriented action plan that I can use then to execute. There are,  different agents and recently, like a domain driven design. Uh. Approach. You know,  we introduced that, two months ago, and both the claude flow V three is rewritten using domain-driven design and heavily using now architecture decision records I&amp;rsquo;m now describing why some. Implementation decision was made and then that is keeping agents more on track to go much deeper and not,  sidetracking while working on the task. So this is, again, one small trick. That significantly or Okay. Significantly. Again, when we are a above 90% significant increases from 90 to 95. So if you can,  accept the results that you know from the, that you&amp;rsquo;re getting from the agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So you&amp;rsquo;re kind of hinting at this kinda memory system that&amp;rsquo;s in there. How does that, so one of the risks with a memory system for any kind of AI is that it learns the wrong things and, and so how do you avoid that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Oh, I have a number, I, I, I would need to go to, to list, all of them, but I have a lot of novel ways, to try to prevent that. So there is a couple of things built by, again, other genetic, foundation members. Roof created a tool called Mean Cut that will do and try to evaluate if some of them. are,  really,  going into real direction or not. So I, I, you know, I, I, I&amp;rsquo;m not even qualified enough to explain how some of these things work because, a lot of them are really like. Uh, PhD level mathematics or, academic level of, as new, new, research things that are being done in the, and as soon as something new in the mathematics pops up, guys are implementing a tool around that. So I&amp;rsquo;m having, now I, so let&amp;rsquo;s remember a couple of last things that I did. One was governance system. implemented completely governments system, that should uh, evaluation all of all skills we have in the system, and keep that evaluation against every model change that comes on the market.&lt;/p&gt;
&lt;p&gt;And it has like a built-in evaluation that tests against three models to see if the change, if the change in the model, we change the skill behavior. Uh, expected results. So there is a lot of stuff, you know, I, I, I, sometimes I even need to find, you know, ask Claude, what do we have here? So I&amp;rsquo;m creating like a, a notebook, LMs from different versions. Of my repo because you can copy paste like a URL of GitHub repo. I give it like my, release notes page or something like that. And then I&amp;rsquo;m building like a notebook, LMs, so I can have like a history and ask,  questions related to the things that we developed because it&amp;rsquo;s, it&amp;rsquo;s going really fast.&lt;/p&gt;
&lt;p&gt;I cannot even track what, what we built, but there are things that I don&amp;rsquo;t think, yeah. Anybody is doing right now in the industry. And I have like one competitive analysis document. I will share you the link later. I did that, just to see,  how Agentic QE fleet compares to,  what exists currently in the market because&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; so I will be very interested in that competitive analysis, but since you&amp;rsquo;ve mentioned the competitive space, what I find it interesting, when I first heard about your work in the Agentic QE, I, in my head it was in the competitive space of testing tooling. And I don&amp;rsquo;t think it really is, it&amp;rsquo;s, an evaluation of the entire development process.&lt;/p&gt;
&lt;p&gt;So what else would you be comparing it to?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; I can compare parts of the fleet vendors, and that&amp;rsquo;s usually when I see, when you see list, you know, I have this and they have only,  each of them has,  one box or two boxes or something like that.&lt;/p&gt;
&lt;p&gt;You know, only parts of that because  they&amp;rsquo;re covering different things and they&amp;rsquo;re focusing. I saw, most of the tools were focused on like, UI. You know, testing generation, not to count the tools that developers use that are checking code quality and on that unit integration level and there, but testers would focus their attention on the UI level, test generation, self-healing and things, and that&amp;rsquo;s wasted effort I would call it. So their information and,  testing. Gold nuggets all over the project and the process that we are working on, and there are places where we can,  make a bigger difference removing one of the bottlenecks than,  working on creating better UI tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; One of the benefits is, the Agentic QE fleet is open source so anyone can download it.  just in case anyone wants to, I&amp;rsquo;ve had best results installing it on Mac, in fact, all the AI tools. I&amp;rsquo;ve had best results, install &amp;rsquo;em on the Mac or can a virtual machine running Linux or a Linux machine. I&amp;rsquo;ve tried installing this stuff on Windows directly.&lt;/p&gt;
&lt;p&gt;Some of it works.  but when, like some of the coding tools work, when they start using tools, they all default into Bash. So you have to run it under the, the GitHub, CLI. But then when Node gets involved, some of the tools struggle because the Windows node installation is non-standard, doesn&amp;rsquo;t work as well.&lt;/p&gt;
&lt;p&gt;I mean, you&amp;rsquo;ve mentioned that you&amp;rsquo;re trying to improve that on your tool to get it working more on a Windows system, so that&amp;rsquo;ll be interesting. But it&amp;rsquo;s open source so anyone can try it and it&amp;rsquo;s uh, free.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Fork it and adapt it. So this is like my experience and in this case Lalit&amp;rsquo;s, because he was contributing a lot from his QCSD framework, combined, condensed into a fleet itself. But this is a showcase to show you what&amp;rsquo;s possible. You can fork it, you can build more specialized agents. My context is we are not doing this.&lt;/p&gt;
&lt;p&gt;I got feedback from one user, but we are not doing this like that. Okay?  use it. You have everything Engine is there. Modify the agent definition. to your context, modify domain definition to your context. So you can always ask Claude to modify to your context after forking it. you see contribution, something that everybody would,  benefit from, you know, please create a PR back and  let&amp;rsquo;s include that and let&amp;rsquo;s work as a community to make this tool, valuable to everybody. Who, wants to use it because I think will not give you 10 times, you know better, but it&amp;rsquo;ll give you some examples from which you can start,  building and, , leveling up your knowledge. and experience and using in, in your process to,  get results faster than,  needing to sit and,  code for,  three hours and, and checking your flaky tests, run like, five times or something like that. So, yeah,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So, I mean. I would advise people not to do what I did when I first looked at the tool, which is download it and go, well, I don&amp;rsquo;t use Claude, so I&amp;rsquo;m gonna take all the agents and the skills. I&amp;rsquo;m just gonna plug them into, open code and experiment it and try it. That was an interesting experiment, but ultimately I didn&amp;rsquo;t know if it was working, it wasn&amp;rsquo;t working or not.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;d say try and get it working. Properly out the box, then go and review the agents that are in there. That&amp;rsquo;s an interesting experience. &amp;lsquo;cause you can see what&amp;rsquo;s codified in there. That actually got me thinking things like what would it take for me to codify my knowledge? What? What would an agent that does what I do look like and that, that&amp;rsquo;s an interesting thought experiment, an interesting thing I think, to try and practice and do.&lt;/p&gt;
&lt;p&gt;So how would you recommend people go about learning? To use your tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Uh, I would first direct them to you. You, you already mentioned, I think oh, not, you didn&amp;rsquo;t mention that URL, but you will share it. Agentid dash QE dot dev, it&amp;rsquo;s whole explanation of the agentic QE framework playbook, with the steps with the assessment. Where you are right now, you can do your, because it&amp;rsquo;s grounded in the classical quality engineering, you can assess your current maturity status to see how ready your processes are to go into agentic. So that&amp;rsquo;s like, if you want to,  implement that in your company, in your team and processes, you can be guided there. But if you just want to experiment, take a look at the examples. There is a number of use cases. You can review the skills and then go into repo and find the skills definitions there. You know, you can even use this in the, claude code, but in the claude desktop or in the claude web. But instead of NPM install, ask Cloud, like run NPX Agentic dash QE at latest space in it. Space dash dash auto and it&amp;rsquo;ll install in the sandbox environment Agentic, QE fleet. And you can run it that. You know, first initial, just ask it, explaining what I can do with the Gent, QE fleet, and start experimenting with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I didn&amp;rsquo;t know you could do that. So can you do that on the free Claude plan as well?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Uh. I don&amp;rsquo;t think you have the claude code available in the free plan. You need PRO license at&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay. Because it&amp;rsquo;s just when you said, you mentioned you could do it on the web.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; but Claude code&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Okay. Okay. Because Claude on the web will generate code, but that&amp;rsquo;s different from Claude code. Okay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; like a,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; a code. is just the chat, but slash code, you get the code, but you need to be pro or max account to get the, access, I think to the code&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; So, so one of the things, when I&amp;rsquo;m looking at the agentic QE thing, it&amp;rsquo;s, and the, the whole agent concept, it&amp;rsquo;s one of the, motivations for me looking at paid plans of things like claude. &amp;lsquo;cause I&amp;rsquo;ve been really avoiding trying to commit to a, a tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; I&amp;rsquo;m, you know, I need to jump in. I&amp;rsquo;m working, really making the fleet, vendor independent. So that&amp;rsquo;s, you know, I, and I see now, you know, claude can be used now with any. LLMs So you know, claude itself,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; uh, Agentic QE Fleet already has capability. You can configure it to use open router to use other models.&lt;/p&gt;
&lt;p&gt;There is configuration option. You can ask it to configure it to use other models. already used something that&amp;rsquo;s called Tiny Dancer that will. Allocate different complexity of tasks to different models. So it&amp;rsquo;ll not burn your cost if you&amp;rsquo;re even using to the API, not to the paid on accounts, but to the API, like, simple tasks will go to the haiku. Models then, medium complex tasks will go to sonnet and then,  like a test strategy and some things will go to the Opus model. So it&amp;rsquo;ll already do automatically allocation of the task when the agents are being spun to different models&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Because the Haiku models,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; yeah, the haiku models are certainly very affordable through an API,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; the, sonnet and other ones are less so.  and. I, &amp;lsquo;cause when I&amp;rsquo;m looking at the agents now, I would just imagine this is just gonna burn through my API credits. I&amp;rsquo;ve assigned it all to free models, but then I&amp;rsquo;m give, I&amp;rsquo;m working on code content.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t really care so they can train their models on it Doesn&amp;rsquo;t matter to me. I.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; working on, on setting up a, OlLama, version. I cannot run everything on my Mac, so I&amp;rsquo;m,  working on setting up cloud version where I will,  have my own model. So that&amp;rsquo;s something that&amp;rsquo;s already there, but I need a model I can,  have access to and I can connect it. And when I connect both cloud to that model and my fleet to that model, I&amp;rsquo;m vendor independent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; that&amp;rsquo;s,  in the plan soon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I, I feel kind of vendor independent at the moment. &amp;lsquo;cause I&amp;rsquo;ve, I, Claude code itself is pointing to other models and your, your tool is working absolutely fine in that instance. So we&amp;rsquo;ve covered how to learn, agentic QE tool. How would people go about learning agent based AI in general?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Oh yeah. A a lot of places. But what are the good. So I&amp;rsquo;m suggesting, if you never experience anything in related to this, start with the basics. I watched like a Stanford CS 230,  set of lectures from 2025, fall winter season. So that&amp;rsquo;s seven or eight videos are really giving. good explanation of all the concepts you need to understand about agentic development, will give you like a,  good starting point to dive deeper into agentic engineering approaches promoted by agentic foundation. So we are preparing, We already have one-on-one.  we are starting working on 2 0 1, 3 0 1, 4 0 1. So different courses are coming. There will be accreditation for agentic engineering role. That&amp;rsquo;s like a future role coming. And there are all, I would say all from adjunct foundation are sharing as they&amp;rsquo;re,  learning in public.&lt;/p&gt;
&lt;p&gt;So uh, like next to my. Agentic Serbian Foundation, YouTube channel. There are regular agentic foundation, events happening every Thursday and Friday. That&amp;rsquo;s like 6:00 PM Central European time. That&amp;rsquo;s like a noon Eastern European time, American Eastern time. so, links are shared usually on the LinkedIn. People can join there. Uh, there is videos.agentics.org. Website. That&amp;rsquo;s a collection of all the recordings of all the previous sessions from the webcast and Aker spaces from last, I would say year and a half of these Thursday and Friday meetups. So there is a lot. Of content. And a really interesting thing on that website, you have like a chat agent, you can ask questions.&lt;/p&gt;
&lt;p&gt;For instance, how can I use claude flow and Q Fleet for software development or agentic development? And you will get like a slide deck,  flashcards with the lessons and uh, links to videos you can access and  look, deeper. Into the topics. So, you know,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I&amp;rsquo;ve started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt;  yeah, you can, that those are like good starting points and then you will,  follow people on LinkedIn that are sharing things and Yeah. You grow your network from there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Yeah, so I&amp;rsquo;ve started going through the the video.agentics.org. And that summary system is necessary because the videos are not hosted on YouTube. &amp;lsquo;cause if they&amp;rsquo;re on YouTube, I would just take the link, post it into Notebook LM and do it that way. So, but again, it gives you more control over, over what is happening.&lt;/p&gt;
&lt;p&gt;So one of the things you mentioned there is this is leading up to accreditation for a different role. How do you view the use of Agentic AI as changing your skillsets and your particular role?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; This is like, moving. Into a new role. I would call it like, I&amp;rsquo;m calling it for six months or more like orchestrator. So I needed like a mind shift change. I needed to,  let go of some of the things and unlearn some of the things I&amp;rsquo;ve been learning for 20 years or plus. What helps me, that&amp;rsquo;s that critical mindset. , People say, but you will, you know, become dumber. But no, I&amp;rsquo;m just thinking on a different level. It&amp;rsquo;s a different level of abstraction. I don&amp;rsquo;t, you know, I, you know, are you looking at the code?&lt;/p&gt;
&lt;p&gt;Yes. I&amp;rsquo;m looking. The code, meaning if I,  see hard coded values or I see,  something that&amp;rsquo;s not logically, you know, should be there just to,  glance over it. But as the amount of code is, you know, code is becoming irrelevant. outputs, again, focus on the output. the code is doing what is expected, is it, you know. Developed by these quality characteristics that are important for our project is the performance. uh, below 200 milliseconds is the security SOC two or iso certified, So what are the things that I&amp;rsquo;m interested? I&amp;rsquo;m, need to let go of that code, and that&amp;rsquo;s something that heavily needed to lean on this. And to let agents do all the heavy lifting thing from there. And I need to do thinking, controlling, how I saying decisive, you know, the correction measures. when I notice that behavior that it&amp;rsquo;s,  trying to go into that, that was happening more before. You know now with the guardrails and as agents are working and learning patterns, that&amp;rsquo;s also as you start using the Agent Q fleet, there is a whole memory system there where agents are learning patterns and self improving time and  do a lot of things that in the end. most of the tasks that are observed as probabilistic because they need the LLM reasoning for them to make the decision in certain places in their,  task execution. They will have patterns to recognize they can reuse, so they will become again, deterministic. But  having,  now covering them whole SDLC,  I am feeling like I&amp;rsquo;m having superpowers. Yeah, but&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I do know that feeling. Yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; okay. You know, step back. I&amp;rsquo;m still not there to make it fully autonomous. There are guys in the foundation doing everything without the human in the loop. They&amp;rsquo;re just doing the final verification when the app, okay, app is built, this is the new version, deploy to staging, let&amp;rsquo;s go and check. So they&amp;rsquo;re not even checking the git diff. And I&amp;rsquo;m still, you know, heavy on diffs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; I guess it&amp;rsquo;s, it depends on what kind of app you&amp;rsquo;re building and how you&amp;rsquo;re building it. It sounds as though when you&amp;rsquo;re using claude code with, Claude Flow, you&amp;rsquo;re getting a lot of unit tests in there at the same time, and potentially unit tests and requirement level, domain level tests, that gives you confidence so you can review those tests rather than necessarily reviewing all the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; And then it depends, I guess, how much you care about the design patterns in the code as to whether you review the code for those design patterns either being met. But you also, in the QE fleet, it will tell you whether the code complexity is too high on certain classes, in which case you can say, go in and refactor this.&lt;/p&gt;
&lt;p&gt;So you&amp;rsquo;re getting some prompts back from the QE fleet as to where you maybe should be concerned and direct some human reviews in the code. But it is interesting when you start using these tools.  &amp;lsquo;cause when it&amp;rsquo;s a, a really small prototype, I don&amp;rsquo;t really review the code. I review does it work, and I go into test mode.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ve gone into product mode to say, do this thing. Then I go into test mode. So all the skills that we&amp;rsquo;ve learned in the, the quality and testing process are really important. The skills that you learn at a more senior engineer level with a staff engineer.  leading teams, those now are important because that&amp;rsquo;s what you&amp;rsquo;re doing with the, the coding tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; you know, team of agents and you need to coordinate them and give them context and assign a task clear enough way,  so they are not lost in what they need to do. And that&amp;rsquo;s also a good thing that you pointed. I noticed that like, leadership,  management skills are also important, critical thinking, communication, collaboration, and creativity. So,  those are the skills that I see and that though they stay human related, so that that&amp;rsquo;s something that you cannot,  automate away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; But having said that I did buy a SaaS. A couple of weeks ago that I refunded &amp;lsquo;cause I was absolutely sure they were vibe coding it &amp;lsquo;cause there were bugs. And I asked for a feature request. The feature request came in about an hour later and it&amp;rsquo;s like, there&amp;rsquo;s no way this has been tested properly. And then I started using it and it was buggy and I just, I&amp;rsquo;m not, I&amp;rsquo;m not using this thing.&lt;/p&gt;
&lt;p&gt;So there are many people out there using these tools that do not have that attitude that you just mentioned or is clearly embodied in the agentic foundation yet. So when you&amp;rsquo;ve been building this tool, I&amp;rsquo;m conscious of time, but I want to try and squeeze in some extra lessons learned when you&amp;rsquo;ve been building the, the tool.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;cause a lot of people might not jump into agentic AI yet, but there&amp;rsquo;s probably lessons there that they could take in any of the, the use of AI tooling that they&amp;rsquo;ve got. So what major lessons have you picked up from the use of AI tools?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Yeah, spend your time to understand better prompt and context engineering. That&amp;rsquo;s, that&amp;rsquo;s like a ground base for,  going step further. Because if you are not familiar of,  what the good prompts looks like and what, how to set up a good context for your agents to ground them when they start working because, like. Each of the agents, the coding agents assistant, has their own grounding basic rules. So the Cloud MD agent, md, Germany, md. So in the root of each project, you go get like a basic grounding role, but don&amp;rsquo;t. Don&amp;rsquo;t try to put everything I, I notice, you know, people are doing, you know, mistakes. That was my mistake. And like your claude MD shouldn&amp;rsquo;t be more than 500 lines. Put links with helper files. If you have a need, you need to put the basic rules there. if you have a need of having more than 500 lines, because that, takes more context when claude is being loaded, so you can check the size of the context changing. As your claude MD files in is increasing, put the links and put helper files. That&amp;rsquo;s, that&amp;rsquo;s like a,  basic thing to help people keep your claude MD clean and neat with, the provided like create something that&amp;rsquo;s, they go, also think anthropic just release, constitution give it Why So it, you know. Works better if it has something that you know, some people from Identity Foundation called North Star create your golden examples, golden documentation. So you have your own way of doing things. Use that,  give that to agent and ask it now. Create me a prompt that I can repeat this every time, or create me a skill that will do this or create me agent that will do exactly this. But  start from your experience and then use the agent to augment and amplify that because it&amp;rsquo;s like a,  library on wheels so you can ask things. But again. It&amp;rsquo;s,  again, at the end, again, critical thinking. So that&amp;rsquo;s why I have either brutal honesty review skill, or I have like, six thinking hats skill to observe the problem from different perspective, not only from one,  trajectory.&lt;/p&gt;
&lt;p&gt;So if you give like a, I have a devil&amp;rsquo;s advocate agent, but that&amp;rsquo;s like a single trajectory. So you know also what works like. Trust of brains. Ask a agent like act as a team of users. It changes the behavior so you know the small tricks from prompt and context engineering. And start experimenting in building and testing because un until you start, you know, feeling it in your fingers. You know, if, experiencing that mind shift change, you, you, yeah. That, that&amp;rsquo;s, you know, you need to,  experience it in order to see how it can level your you know yourself to another level. Yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; Thank you. Yeah, I think that&amp;rsquo;s really important. That&amp;rsquo;s really important that people get to, it&amp;rsquo;s, the theory is useful, but the hands-on practical use is where you really. Get it. And also the theory can be really intimidating, right? Not everyone has a computer science background or has done the university degrees, but everyone has done the job.&lt;/p&gt;
&lt;p&gt;And you can get hands on and use this.  you can install it quite easily if you&amp;rsquo;ve got the right, Linux type setup and just start working with it. So, so that was a useful brain dump of knowledge. So now I think the hardest question is, so where is this going in the future? How the agentic ai, how&amp;rsquo;s it gonna impact testing and development?&lt;/p&gt;
&lt;p&gt;I.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; So, yeah, more and more autonomous.  smaller models, specialized models or specific reasoning banks packed for specific tasks. What I&amp;rsquo;m seeing already guys from the Foundation are doing, they&amp;rsquo;re training small co models like,  half a billion parameters, 1 billion parameters for specific tasks.&lt;/p&gt;
&lt;p&gt;In for your tech stack. So that&amp;rsquo;s where I&amp;rsquo;m seeing, and when you have these specialized trained models or reasoning banks with the specialized agents, you&amp;rsquo;re again getting the deterministic behavior that most of us expect in the software development. But, done autonomously with agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; All right. Well thanks very much, Dragan.  so everyone can find you at Forge Quality Dev, and I will include a whole bunch of other links in the show notes here and I&amp;rsquo;ll try and include some of the other ones you&amp;rsquo;ve mentioned, but that was incredibly useful for me. I&amp;rsquo;m hoping it&amp;rsquo;ll be useful for everyone else.&lt;/p&gt;
&lt;p&gt;But the key point is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; is&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alan Richardson:&lt;/strong&gt; get hands-on, experiment and have a look at the agentic qe, dot dev, try and use it, install it even at a very loose level, just on a website. You don&amp;rsquo;t even need the code base. Just see how you get on. Alright, thanks very much.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dragan Spiridonov:&lt;/strong&gt; Thank you, Alan for having me.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>A Web Testing, Automating and Tooling Masterclass</title>
      <link>https://www.eviltester.com/blog/eviltester/technical_testing/2026-02-5-web-testing-automating-tooling-masterclass/</link>
      <pubDate>Thu, 05 Feb 2026 08:30:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/technical_testing/2026-02-5-web-testing-automating-tooling-masterclass/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; We can only test to the level supported by our Ability, and the degree to which we are supported by tooling to Observe, Interrogate and Manipulate the System.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;video&#34;&gt;Video&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/bSfgADkdQug&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=bSfgADkdQug&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;00:00 Introduction&lt;/li&gt;
&lt;li&gt;00:26 Application Under Test&lt;/li&gt;
&lt;li&gt;02:51 Live Testing&lt;/li&gt;
&lt;li&gt;03:41 Testing vs Automating&lt;/li&gt;
&lt;li&gt;06:03 Testability vs Automatability&lt;/li&gt;
&lt;li&gt;09:25 Workarounds&lt;/li&gt;
&lt;li&gt;10:55 Technical Knowledge&lt;/li&gt;
&lt;li&gt;15:44 Test Approach - JavaScript&lt;/li&gt;
&lt;li&gt;17:02 Exercise - Test Approach&lt;/li&gt;
&lt;li&gt;17:24 Automated Execution Approach&lt;/li&gt;
&lt;li&gt;18:34 Exercise - Code Review&lt;/li&gt;
&lt;li&gt;20:35 Exercise - Your Project&lt;/li&gt;
&lt;li&gt;20:59 Server Side&lt;/li&gt;
&lt;li&gt;24:20 Exercise - Test Approach - API&lt;/li&gt;
&lt;li&gt;24:52 API Tooling&lt;/li&gt;
&lt;li&gt;29:14 Exercise - API Testing&lt;/li&gt;
&lt;li&gt;29:34 Automating the API&lt;/li&gt;
&lt;li&gt;31:54 API Interacting with UI&lt;/li&gt;
&lt;li&gt;37:09 End Notes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;A customer has reported that one of your pages doesn&amp;rsquo;t work. But your automated execution coverage tells you that it does. What went wrong?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what we&amp;rsquo;re going to explore now.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;difference between testing and automating,&lt;/li&gt;
&lt;li&gt;testability vs automatability,&lt;/li&gt;
&lt;li&gt;we&amp;rsquo;ll think about test coverage from a technology perspective,&lt;/li&gt;
&lt;li&gt;and we&amp;rsquo;ll look at some tools that can help you test.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the Application Under Test.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/&#34;&gt;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Infinite Scroll Challenge on the TestPages&lt;/p&gt;
&lt;p&gt;Many sites have infinite scroll. You scroll to the bottom and it loads new items.&lt;/p&gt;
&lt;p&gt;That functionality works. We have have automated coverage. That passes.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the issue?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oh yeah, sorry I forgot to mention. I&amp;rsquo;m going to encourage you to think. Ideally we would do this as a workshop, as hands on training, but it&amp;rsquo;s a video and text workbook.So all I can do is prompt you into thinking.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.eviltester.com/page/contact/&#34;&gt;Contact me&lt;/a&gt; if you are interested in live training for your team or organization.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So what&amp;rsquo;s the issue?&lt;/p&gt;
&lt;p&gt;Well, I can&amp;rsquo;t click the button. The page refreshes and scrolls too quickly and the button isn&amp;rsquo;t enabled for long enough when it is visible.&lt;/p&gt;
&lt;p&gt;This happens with a lot of infinite scroll sites, there are footers that can&amp;rsquo;t be clicked, stuff at the bottom of the screen that you can&amp;rsquo;t see.&lt;/p&gt;
&lt;p&gt;This did work at some point, because we tested it, but I guess someone changed the time out value and the automated execution assertions didn&amp;rsquo;t flag this as an issue.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s start thinking about this from a Testing perspective.&lt;/p&gt;
&lt;h2 id=&#34;live&#34;&gt;Live&lt;/h2&gt;
&lt;p&gt;If this was a live project we could just stop here and raise a defect.&lt;/p&gt;
&lt;p&gt;Obviously the timeout is wrong. Raise the defect. Move on to the next issue.&lt;/p&gt;
&lt;p&gt;But wait.&lt;/p&gt;
&lt;p&gt;We have automated coverage, and it didn&amp;rsquo;t highlight this issue.&lt;/p&gt;
&lt;p&gt;We should think about the difference between Testing and Automating.&lt;/p&gt;
&lt;h2 id=&#34;testing-vs-automating&#34;&gt;Testing vs Automating&lt;/h2&gt;
&lt;p&gt;Testing is what we do. As humans, we interact with the software and we observe, we build models,  we learn, we compare the actual interaction with the models. We report information derived from the difference between our models and the observations.&lt;/p&gt;
&lt;p&gt;When we investigate an issue and expand our models we interrogate the system more deeply to learn what&amp;rsquo;s going on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Testing is the human activity of interacting, observing, thinking, learning, experimenting.&lt;/li&gt;
&lt;li&gt;Automating, is the human activity of making the interaction and observation of the system an automated process. And that includes the comparing of observed results with the expected results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automating is a human activity which results in the output of an automated execution process. The only involvement with the human after the activity has been automated is to investigate the failure reports and  maintain it when it fails.&lt;/p&gt;
&lt;p&gt;So both Automating and Testing are human processes. But testing leads to more human processes, automating leads to an automated process that only involves humans when it fails.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; AI might change how I view the process of automating. Certainly I&amp;rsquo;ll need more distinctions in how I describe nuances around Automating, but for now, all the automating I do is Human Initiated, or Directed, and results in some automated execution process.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;testability-vs-automatability&#34;&gt;Testability vs Automatability&lt;/h2&gt;
&lt;p&gt;And let&amp;rsquo;s just quickly look at Testability and Automatability because these words are used badly when describing software.&lt;/p&gt;
&lt;p&gt;Is this system testable?&lt;/p&gt;
&lt;p&gt;Yes. I can access it in the browser, I can see it, I can interact with it. The button toggles too quickly but I can test the application.&lt;/p&gt;
&lt;p&gt;But when we talk about testability we often talk about, adding &lt;code&gt;id&lt;/code&gt;s to the elements, make it it more observable, etc.&lt;/p&gt;
&lt;p&gt;Well the &lt;code&gt;id&lt;/code&gt;s, are really for automatability, not testability.&lt;/p&gt;
&lt;p&gt;In the browser, the browser tooling makes it observable because of the technology used, not the system.&lt;/p&gt;
&lt;p&gt;Most of the time when we are talking about testability we are really talking about automatability.&lt;/p&gt;
&lt;p&gt;This application has been built with automatability in mind.&lt;/p&gt;
&lt;p&gt;It has &lt;code&gt;id&lt;/code&gt;s, there are classes, the JavaScript source is visible, it is easy to change the state and configuration variables, this thing is so easy to automate and observe. But none of that was required to help me test it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testability is not the same as automatability.&lt;/strong&gt; Keep that in mind as we continue through this process, particularly when we move to the server side interaction.&lt;/p&gt;
&lt;p&gt;With the JavaScript Infinite Scroll system, the main thing that impacts my Testability, is the bug, preventing me from testing the button functionality.&lt;/p&gt;
&lt;h2 id=&#34;workarounds&#34;&gt;Workarounds&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s quickly consider workarounds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your ability to find workarounds will impact your ability to test the system.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So your ability impacts the Testability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testability is as much about your ability to test the application as it is the application supporting you in testing it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Depending on how deep you want to go. You can only test the application to the limit that you can observe, manipulate and interrogate the application.&lt;/p&gt;
&lt;p&gt;Your ability to test the application is often impacted by the usability of the application, and that is true here. The application is not usable for one main function so it is hard to test that function.&lt;/p&gt;
&lt;p&gt;But, we can work around that, for this application, with more Technical Knowledge.&lt;/p&gt;
&lt;h2 id=&#34;technical-knowledge&#34;&gt;Technical Knowledge&lt;/h2&gt;
&lt;p&gt;When working with the web, we need to understand our tool capabilities.&lt;/p&gt;
&lt;p&gt;My tool at this point is the browser.&lt;/p&gt;
&lt;p&gt;What can I do with it?&lt;/p&gt;
&lt;p&gt;I can view the page source.&lt;/p&gt;
&lt;p&gt;I need to be able to understand HTML. Some CSS. Some JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Having the tooling ability to look at the source doesn&amp;rsquo;t help me unless I understand what I&amp;rsquo;m looking at.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So if you&amp;rsquo;re testing web applications, you probably want to understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How a browser works,&lt;/li&gt;
&lt;li&gt;How HTML works,&lt;/li&gt;
&lt;li&gt;What is CSS and how we use it,&lt;/li&gt;
&lt;li&gt;What is JavaScript and how it works.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the very least to have a reading ability of these technology artifacts.&lt;/p&gt;
&lt;p&gt;So at this level, at the source, with the technical knowledge I have&amp;hellip; I can see in the JavaScript some variables, I can see they are amendable.&lt;/p&gt;
&lt;p&gt;But, I don&amp;rsquo;t have the tooling to amend it yet.&lt;/p&gt;
&lt;p&gt;So, what else do I have available?&lt;/p&gt;
&lt;p&gt;I can look at the dev tools.&lt;/p&gt;
&lt;p&gt;I can see the DOM view shows me much the same as the source. But&amp;hellip; it can be different.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The source is what we gave the browser to work with.&lt;/li&gt;
&lt;li&gt;The DOM is what the browser created after interpreting and executing the source.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the DOM I can see the JavaScript as well.&lt;/p&gt;
&lt;p&gt;I also have the ability now, to interact and manipulate the JavaScript variables that I observed in the source.&lt;/p&gt;
&lt;p&gt;There are a few timeout and millisecond variables there.&lt;/p&gt;
&lt;p&gt;Perhaps the bug is the &lt;code&gt;scrollAfterMillis&lt;/code&gt; variable?&lt;/p&gt;
&lt;p&gt;Let me change that to &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;scrollAfterMillis
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And&amp;hellip; now it just takes longer to refresh, but I still can&amp;rsquo;t click the button.&lt;/p&gt;
&lt;p&gt;Let me try the &lt;code&gt;preLoadTimeout&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;preLoadTimeout=2000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, the button stays active for 2 seconds before it loads the next set of data. That&amp;rsquo;s my workaround to make this application testable.&lt;/p&gt;
&lt;p&gt;It also means that I can go a little deeper in the bug report and say that the root cause is the &lt;code&gt;preLoadTimeout&lt;/code&gt; being too small a value so the user doesn&amp;rsquo;t have time to click the button.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You might be interested in this &lt;a href=&#34;https://www.eviltester.com/blog/eviltester/technical_testing/2022-09-22-chrome-dev-tools-overview/&#34;&gt;video and blog post covering more details of Chrome Dev Tools for Testing&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;test-approach&#34;&gt;Test Approach&lt;/h2&gt;
&lt;p&gt;So what is my test approach for this?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;load the page&lt;/li&gt;
&lt;li&gt;scroll down&lt;/li&gt;
&lt;li&gt;see that it refreshes and adds the data I expect&lt;/li&gt;
&lt;li&gt;click the button&lt;/li&gt;
&lt;li&gt;see that it doesn&amp;rsquo;t refresh when I scroll&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is that it?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do I need to reload the page and check that it starts auto refreshing again?&lt;/li&gt;
&lt;li&gt;How long do I need to wait after stopping it, and trying to scroll to make sure it doesn&amp;rsquo;t start auto-refreshing again?&lt;/li&gt;
&lt;li&gt;What else?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;exercise---what-is-your-test-approach&#34;&gt;Exercise - What is your test approach?&lt;/h3&gt;
&lt;p&gt;After this video I encourage you to think through what your Test Approach for this application would be.&lt;/p&gt;
&lt;h2 id=&#34;test-approach-vs-automated-execution-approach&#34;&gt;Test Approach vs Automated Execution Approach&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve figure out how to test it, how would you automate it?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll show you what we have here.&lt;/p&gt;
&lt;p&gt;And this test passes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@Test&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;scrollToStopLoadingAndClick&lt;/span&gt;(){  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WebDriverWait(driver, Duration.&lt;span style=&#34;color:#a6e22e&#34;&gt;ofSeconds&lt;/span&gt;(10)).&lt;span style=&#34;color:#a6e22e&#34;&gt;until&lt;/span&gt;(  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ExpectedConditions.&lt;span style=&#34;color:#a6e22e&#34;&gt;elementToBeClickable&lt;/span&gt;(page.&lt;span style=&#34;color:#a6e22e&#34;&gt;getStopLoadingButton&lt;/span&gt;()  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ));  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    page.&lt;span style=&#34;color:#a6e22e&#34;&gt;getStopLoadingButton&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;click&lt;/span&gt;();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; WebDriverWait(driver, Duration.&lt;span style=&#34;color:#a6e22e&#34;&gt;ofSeconds&lt;/span&gt;(10)).&lt;span style=&#34;color:#a6e22e&#34;&gt;until&lt;/span&gt;(  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ExpectedConditions.&lt;span style=&#34;color:#a6e22e&#34;&gt;textToBePresentInElement&lt;/span&gt;(  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            driver.&lt;span style=&#34;color:#a6e22e&#34;&gt;findElement&lt;/span&gt;(By.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;statusMessage&amp;#34;&lt;/span&gt;)),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Clicked&amp;#34;&lt;/span&gt;)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Is that good enough?&lt;/p&gt;
&lt;p&gt;It works. It passes.&lt;/p&gt;
&lt;p&gt;But it didn&amp;rsquo;t highlight the fact that the halting functionality is unusable for a human.&lt;/p&gt;
&lt;p&gt;This is one of the issues when we automate something.&lt;/p&gt;
&lt;p&gt;We automate the functionality.&lt;/p&gt;
&lt;p&gt;We don&amp;rsquo;t automate the experience.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are interested in more details about WebDriver with Java then have a look at this &lt;a href=&#34;https://testpages.eviltester.com/reference/automating/webdriver/webdriver-java/&#34;&gt;video Masterclass on the basics of WebDriver with Java&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;exercise---critique-the-code&#34;&gt;Exercise - Critique the code&lt;/h3&gt;
&lt;p&gt;So after the video, or now, pause the video.&lt;/p&gt;
&lt;p&gt;Critique this code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand what it does&lt;/li&gt;
&lt;li&gt;What does it not do?
&lt;ul&gt;
&lt;li&gt;I can see it doesn&amp;rsquo;t try to re-scroll the page to make sure that clicking the button stopped the auto-scroll.&lt;/li&gt;
&lt;li&gt;What else does it not do?&lt;/li&gt;
&lt;li&gt;What conditions does it not check?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Should it match the user experience?
&lt;ul&gt;
&lt;li&gt;How could it?&lt;/li&gt;
&lt;li&gt;What would you change to match the user experience?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Much automated execution coverage does not match the user experience. When it doesn&amp;rsquo;t then there is a risk that the automated execution passes, but the user experience doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;And there is a risk we don&amp;rsquo;t notice.&lt;/p&gt;
&lt;p&gt;Testing will hopefully identify those issues. But automated execution often does not.&lt;/p&gt;
&lt;h3 id=&#34;exercise---consider-your-project&#34;&gt;Exercise - Consider Your Project&lt;/h3&gt;
&lt;p&gt;Is there a risk on the projects you work with that the automated execution covers the functionality, but not the user experience of that functionality?&lt;/p&gt;
&lt;h2 id=&#34;server-side&#34;&gt;Server Side&lt;/h2&gt;
&lt;p&gt;OK, so that was the JavaScript version of the Infinite Scroll.&lt;/p&gt;
&lt;p&gt;It offered us some scope for thinking like the tester.&lt;/p&gt;
&lt;p&gt;But let&amp;rsquo;s push this a little further.&lt;/p&gt;
&lt;p&gt;We also have the server side infinite scroll.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/server-side/&#34;&gt;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/server-side/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It looks the same. It has the same bug, the button is too fast. And my automated execution passes.&lt;/p&gt;
&lt;p&gt;But this page, when it needs new items to display it calls the server to get the information back.&lt;/p&gt;
&lt;p&gt;Do you trust that statement?&lt;/p&gt;
&lt;p&gt;How do you know it calls the server?&lt;/p&gt;
&lt;p&gt;Visibly, in the browser, when I test it and observe the output. It looks the same.&lt;/p&gt;
&lt;p&gt;We need to be able to be able to interact with the application from a technical perspective.&lt;/p&gt;
&lt;p&gt;What if I just think it is connecting to the server, but I accidentally release the wrong version? What if I just renamed the file?&lt;/p&gt;
&lt;p&gt;So we need to check.&lt;/p&gt;
&lt;p&gt;We need to observe the application at multiple technical levels.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s look in the dev tools again. And this time we&amp;rsquo;ll look in the network tab.&lt;/p&gt;
&lt;p&gt;Filter by &lt;code&gt;Fetch/XHR&lt;/code&gt; to see the requests made by JavaScript and I can observe a call to &lt;code&gt;moreitems&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s interrogate that request&lt;/p&gt;
&lt;p&gt;I can see a JSON response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;This is content item number 1. Scroll down
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;         to automatically load more content when the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          \&amp;#34;Click to Stop\&amp;#34; button becomes visible.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;This is content item number 2. Scroll down
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;         to automatically load more content when the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          \&amp;#34;Click to Stop\&amp;#34; button becomes visible.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great.&lt;/p&gt;
&lt;p&gt;So I have tooling to increase my ability to test this.&lt;/p&gt;
&lt;p&gt;But I need to know about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Requests&lt;/li&gt;
&lt;li&gt;Fetch and XML Http Request&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My ability to test this application will be limited if I do not have that technical knowledge and if I do not know how to use the Dev tools network tab.&lt;/p&gt;
&lt;p&gt;But at least I know now that it is making server requests.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t have to trust anyone. I could verify that this was true.&lt;/p&gt;
&lt;p&gt;So now, our testing scope just expanded.&lt;/p&gt;
&lt;h3 id=&#34;exercise---server-side-test-approach&#34;&gt;Exercise - Server Side Test Approach&lt;/h3&gt;
&lt;p&gt;Now, what do you have to test?&lt;/p&gt;
&lt;p&gt;Is it good enough to just test the front end now but scrolling up and down and clicking the button?&lt;/p&gt;
&lt;p&gt;After watching this video, take some time to think through what you want to test to cover the Server Side infinite scroll.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do we also have to test that HTTP call?&lt;/li&gt;
&lt;li&gt;How much do we have to test it?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;server-side-test-tooling&#34;&gt;Server Side Test Tooling&lt;/h2&gt;
&lt;p&gt;And&amp;hellip; do you know how to do that?&lt;/p&gt;
&lt;p&gt;How can you amend the HTTP requests?&lt;/p&gt;
&lt;p&gt;We can do some of that from Chrome.&lt;/p&gt;
&lt;p&gt;I could:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;copy as cURL&lt;/li&gt;
&lt;li&gt;copy as fetch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;with cURL I can use the command line.&lt;/p&gt;
&lt;p&gt;Or fetch I can amend it in the console.&lt;/p&gt;
&lt;p&gt;I could take the cURL and paste it into an API tool.&lt;/p&gt;
&lt;p&gt;I can do that in Bruno by creating a new request from cURL.&lt;/p&gt;
&lt;p&gt;Or in postman I can paste in the cURL command into the new request.&lt;/p&gt;
&lt;p&gt;I can experiment with it in these tools.&lt;/p&gt;
&lt;p&gt;It is important to test the API on its own.&lt;/p&gt;
&lt;p&gt;For example, when I built this, it was only when I was automating and testing the API, that I realised that I really need a limit on the count. If I let people make a request and ask for 6 million items back. That could easily bring down my server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: you can find &lt;a href=&#34;https://apichallenges.eviltester.com/tools/clients&#34;&gt;a list of API Tools on the API Challenges site&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;exercise---api-testing&#34;&gt;Exercise - API Testing&lt;/h3&gt;
&lt;p&gt;As an exercise, think through what conditions you would want to test on the API, then you can use any of the tooling approaches mentioned to experiment.&lt;/p&gt;
&lt;h2 id=&#34;automating-the-api&#34;&gt;Automating The API&lt;/h2&gt;
&lt;p&gt;I would probably want to automate the API as well.&lt;/p&gt;
&lt;p&gt;This does remove us from the user experience because the responses from this API are normally handled by the UI, so just because we see something working in the API we can&amp;rsquo;t assume that it works with the API interacting with the UI.&lt;/p&gt;
&lt;p&gt;I used RestAssured to automate the API.&lt;/p&gt;
&lt;p&gt;The coverage runs at the same time as the web UI coverage.&lt;/p&gt;
&lt;p&gt;And I have a lot more coverage at the API level, than I do at the UI level.&lt;/p&gt;
&lt;p&gt;Think about what coverage you would add for the API.&lt;/p&gt;
&lt;p&gt;Then try to automate it. I used Java, with RestAssured, but you could use any library or programming language you want.&lt;/p&gt;
&lt;p&gt;Or you could even have a set of canned requests in Postman or Bruno or any of the other API tools.&lt;/p&gt;
&lt;p&gt;For production API automating, I primarily use code and HTTP or API libraries. I don&amp;rsquo;t tend to use tools like Bruno or Postman.&lt;/p&gt;
&lt;p&gt;But for production API Testing, I do use Bruno and other tools. Because I like the flexibility and the ability to see the requests being made.&lt;/p&gt;
&lt;p&gt;Testing and Automating often sound like the same thing. But they have different aims and are supported by different tooling.&lt;/p&gt;
&lt;h2 id=&#34;api-interacting-with-ui&#34;&gt;API Interacting with UI&lt;/h2&gt;
&lt;p&gt;And now I&amp;rsquo;m in the position where I&amp;rsquo;m testing the API in isolation of the UI.&lt;/p&gt;
&lt;p&gt;Is that a risk?&lt;/p&gt;
&lt;p&gt;For example, I don&amp;rsquo;t know how the front end handles a 500 error response. I can see it is the same JSON format but it is a different status code, does that make a difference?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;For input string: &amp;#39;-1.02&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Would you test that?&lt;/p&gt;
&lt;p&gt;Do you know how to test that?&lt;/p&gt;
&lt;p&gt;One way to do that is to use a Proxy.&lt;/p&gt;
&lt;p&gt;Intercept the request, amend it to be one that triggers an error and play it through to the front end.&lt;/p&gt;
&lt;p&gt;And then I can see if the system handles error responses or not.&lt;/p&gt;
&lt;p&gt;I would either use Zap or BurpSuite.&lt;/p&gt;
&lt;p&gt;For this exercise I would use ZAP.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;open a session using Edge&lt;/li&gt;
&lt;li&gt;create a new context for testpages.eviltester.com&lt;/li&gt;
&lt;li&gt;filter the history to &amp;ldquo;Show only URLs in Scope&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Set the breakpoint on all requests and responses&lt;/li&gt;
&lt;li&gt;trigger a scroll through the UI&lt;/li&gt;
&lt;li&gt;amend the request&lt;/li&gt;
&lt;li&gt;see the result in the UI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can use tooling to increase my ability to observe the system and manipulate the system at different technology levels.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: A &lt;a href=&#34;https://apichallenges.eviltester.com/tools/proxies&#34;&gt;list of recommended HTTP Proxy Tools is available on the API Challenges site&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;end-notes&#34;&gt;End Notes&lt;/h2&gt;
&lt;p&gt;It is often surprising how much depth we have to test and automate when testing even simple pieces of functionality.&lt;/p&gt;
&lt;p&gt;The more that we extend our technical ability to cover the multiple levels of the application, and we learn how to use tooling to help us observe, interrogate and manipulate at those different technology levels, the more we can expand the coverage of our testing.&lt;/p&gt;
&lt;p&gt;Automating is not the same as Testing. Both are human processes, but the output of automating is not the same as the output of testing.&lt;/p&gt;
&lt;p&gt;But yes&amp;hellip; we can be testing, as we are automating, we may well learn things during the process of automating the application. But we should not confuse the continued execution of the output from automating with testing.&lt;/p&gt;
&lt;p&gt;Testing can miss things because we are human, or we may not have covered the conditions, or we may not have gone deep enough into the system.&lt;/p&gt;
&lt;p&gt;Automated execution can miss things because we humans forgot to add the conditions, or we didn&amp;rsquo;t assert enough. But automated execution can also miss the human user experience and tell us things are working, when they clearly are not.&lt;/p&gt;
&lt;p&gt;I hope that you do now go off and do the exercises yourself. You may not have all the skills to do this yet, you may not have tried all the tools. That just means you can revisit this exercise and application multiple times as you grow your knowledge and skill set. And repeat it when you want to evaluate or learn new tools.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why I created the Test Pages, and that&amp;rsquo;s also why this is a fairly high level overview.&lt;/p&gt;
&lt;p&gt;Remember to work through the exercises.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;exercises&#34;&gt;Exercises&lt;/h2&gt;
&lt;h3 id=&#34;the-applications-under-test&#34;&gt;The Applications Under Test&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/&#34;&gt;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/server-side/&#34;&gt;https://testpages.eviltester.com/challenges/synchronization/infinite-scroll/server-side/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;exercise---what-is-your-test-approach-for-javascript-infinite-scroll&#34;&gt;Exercise - What is your test approach for JavaScript Infinite Scroll?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;think through what your Test Approach for the JavaScript Infinite Scroll application would be.&lt;/li&gt;
&lt;li&gt;Do you need to reload the page and check that it starts auto refreshing again?&lt;/li&gt;
&lt;li&gt;How long do you need to wait after stopping it, and trying to scroll to make sure it doesn&amp;rsquo;t start auto-refreshing again?&lt;/li&gt;
&lt;li&gt;What else?
&lt;ul&gt;
&lt;li&gt;what conditions would you cover?&lt;/li&gt;
&lt;li&gt;how would you approach the testing?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;exercise---critique-the-code-1&#34;&gt;Exercise - Critique the code&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Understand what it does&lt;/li&gt;
&lt;li&gt;What does it not do?
    - I can see it doesn&amp;rsquo;t try to re-scroll the page to make sure that clicking the button stopped the auto-scroll.
    - What else does it not do?
    - What conditions does it not check?&lt;/li&gt;
&lt;li&gt;Should it match the user experience?
    - How could it?
    - What would you change to match the user experience?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Critique this code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InfiniteScrollTest&lt;/span&gt; {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; WebDriver driver;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; InfiniteScrollPage page;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@BeforeAll&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setupWebDriver&lt;/span&gt;(){  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        driver &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DriverFactory.&lt;span style=&#34;color:#a6e22e&#34;&gt;getNew&lt;/span&gt;();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; InfiniteScrollPage(driver);  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@BeforeEach&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;reload&lt;/span&gt;(){  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page.&lt;span style=&#34;color:#a6e22e&#34;&gt;open&lt;/span&gt;();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Test&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;scrollToStopLoadingAndClick&lt;/span&gt;(){  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ExpectedConditions.&lt;span style=&#34;color:#a6e22e&#34;&gt;elementToBeClickable&lt;/span&gt;(page.&lt;span style=&#34;color:#a6e22e&#34;&gt;getStopLoadingButton&lt;/span&gt;()  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ));  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page.&lt;span style=&#34;color:#a6e22e&#34;&gt;getStopLoadingButton&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;click&lt;/span&gt;();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; WebDriverWait(driver, Duration.&lt;span style=&#34;color:#a6e22e&#34;&gt;ofSeconds&lt;/span&gt;(10)).&lt;span style=&#34;color:#a6e22e&#34;&gt;until&lt;/span&gt;(  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ExpectedConditions.&lt;span style=&#34;color:#a6e22e&#34;&gt;textToBePresentInElement&lt;/span&gt;(  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                driver.&lt;span style=&#34;color:#a6e22e&#34;&gt;findElement&lt;/span&gt;(By.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;statusMessage&amp;#34;&lt;/span&gt;)),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Clicked&amp;#34;&lt;/span&gt;)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        );  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@AfterAll&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;closeDriver&lt;/span&gt;(){  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        driver.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Supporting Abstractions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DriverFactory&lt;/span&gt; {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; WebDriver &lt;span style=&#34;color:#a6e22e&#34;&gt;getNew&lt;/span&gt;() {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        WebDriver driver;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ChromeOptions options &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ChromeOptions();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		options.&lt;span style=&#34;color:#a6e22e&#34;&gt;addArguments&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--disable-smooth-scrolling&amp;#34;&lt;/span&gt;);   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        driver &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ChromeDriver(options);   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; driver;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InfiniteScrollPage&lt;/span&gt; {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; WebDriver driver;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InfiniteScrollPage&lt;/span&gt;(WebDriver driver) {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;driver&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; driver;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;open&lt;/span&gt;() {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SiteConfig.&lt;span style=&#34;color:#a6e22e&#34;&gt;SITE_DOMAIN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/challenges/synchronization/infinite-scroll/&amp;#34;&lt;/span&gt;;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        driver.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(url);  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; WebElement &lt;span style=&#34;color:#a6e22e&#34;&gt;getStopLoadingButton&lt;/span&gt;() {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; driver.&lt;span style=&#34;color:#a6e22e&#34;&gt;findElement&lt;/span&gt;(By.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;loadMoreBtn&amp;#34;&lt;/span&gt;));  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SiteConfig&lt;/span&gt; {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; String SITE_DOMAIN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://testpages.eviltester.com&amp;#34;&lt;/span&gt;;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;exercise---consider-your-project-1&#34;&gt;Exercise - Consider Your Project&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Is there a risk on the projects you work with, that the automated execution covers the functionality, but not the user experience of that functionality?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because if that&amp;rsquo;s a risk, you might want to revisit your test approach and your automated execution approach.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How might your approach need to change?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;exercise---server-side-test-approach-1&#34;&gt;Exercise - Server Side Test Approach&lt;/h3&gt;
&lt;p&gt;What do you have to test now that the Server Side calls are involved?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is it good enough to just test the front end now but scrolling up and down and clicking the button?&lt;/li&gt;
&lt;li&gt;Do we also have to test that HTTP call?&lt;/li&gt;
&lt;li&gt;How much do we have to test it?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;exercise---api-testing-1&#34;&gt;Exercise - API Testing&lt;/h3&gt;
&lt;p&gt;As an exercise, think through what conditions you would want to test on the API, then you can use any of the tooling approaches mentioned to experiment.&lt;/p&gt;
&lt;p&gt;Suggested Tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser Dev Tools - fetch requests in console&lt;/li&gt;
&lt;li&gt;Browser Dev Tools - generate cURL and use from CLI&lt;/li&gt;
&lt;li&gt;Bruno&lt;/li&gt;
&lt;li&gt;Postman&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://apichallenges.eviltester.com/tools/clients&#34;&gt;A List of API Tools is available on API Challenges site&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;exercise---ui-and-api-interactive-testing&#34;&gt;Exercise - UI and API Interactive Testing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use a Proxy to allow you to observe and interrogate the traffic from the Web Site to the Internal API backend.&lt;/li&gt;
&lt;li&gt;Amend the Request to trigger an error response and see how the front end handles it.&lt;/li&gt;
&lt;li&gt;Try testing the API from within the proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A &lt;a href=&#34;https://apichallenges.eviltester.com/tools/proxies&#34;&gt;list of recommended HTTP Proxy Tools is available on the API Challenges site&lt;/a&gt;&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>How to Test This - Selenium WebDriver</title>
      <link>https://www.eviltester.com/blog/eviltester/podcasts/how-to-test-this-jan-2026/</link>
      <pubDate>Thu, 05 Feb 2026 08:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/podcasts/how-to-test-this-jan-2026/</guid>
      <description>&lt;p&gt;In January 2026, I was guest on the &amp;ldquo;How to Test This?&amp;rdquo; Podcast.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/mamadou-ndiaye-consultant/&#34;&gt;Mamadou N&amp;rsquo;diaye&lt;/a&gt; invited me on his podcast to talk about Automating and other topics.&lt;/p&gt;
&lt;h2 id=&#34;about-this-post&#34;&gt;About This Post&lt;/h2&gt;
&lt;p&gt;All the notes below, and the transcript, are AI generated.&lt;/p&gt;
&lt;p&gt;I feel it is only fair to release the summary like this because this is actually how I initially decide if a podcast episode is one that I will listen to.&lt;/p&gt;
&lt;p&gt;I subscribe to over 80 podcasts and it is impossible to listen to that many, and do anything else. So I build a tool to do the heavy lifting, subscribing to the RSS feeds, transcribing and summarizing them. I look through the list of new podcasts and then based on the titles, descriptions, and summaries, I decide if I listen to the podcast.&lt;/p&gt;
&lt;p&gt;Podcast RSS feeds don&amp;rsquo;t have standard way of saying if the episode has a transcript, or a location to download one from, so I have to transcribe it using local AI tooling.&lt;/p&gt;
&lt;p&gt;I build my tooling using Python, but it would be perfectly possible to use &lt;a href=&#34;https://n8n.io/&#34;&gt;n8n&lt;/a&gt; to automate this process.&lt;/p&gt;
&lt;p&gt;I use this tooling to create the &lt;a href=&#34;https://www.patreon.com/eviltester&#34;&gt;podcast episode summary documents that I release on Patreon&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;podcast-how-to-test-this&#34;&gt;Podcast: How To Test This?&lt;/h1&gt;
&lt;p&gt;Interview episodes where Mamadou N&amp;rsquo;diaye talks with with software testing experts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://podcasters.spotify.com/pod/show/spidey1944&#34;&gt;https://podcasters.spotify.com/pod/show/spidey1944&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://anchor.fm/s/1060f2ec0/podcast/rss&#34;&gt;https://anchor.fm/s/1060f2ec0/podcast/rss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/@HowToTestThis&#34;&gt;https://www.youtube.com/@HowToTestThis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/mamadou-ndiaye-consultant/&#34;&gt;https://www.linkedin.com/in/mamadou-ndiaye-consultant/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;episode-how-to-test-with-selenium---alan-richardson&#34;&gt;Episode: How to Test with Selenium - Alan Richardson&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Show Notes: &lt;a href=&#34;https://podcasters.spotify.com/pod/show/spidey1944/episodes/How-to-Test-with-Selenium---Alan-Richardson-e3eh6ut&#34;&gt;https://podcasters.spotify.com/pod/show/spidey1944/episodes/How-to-Test-with-Selenium---Alan-Richardson-e3eh6ut&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download: &lt;a href=&#34;https://anchor.fm/s/1060f2ec0/podcast/play/114907549/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2026-1-2%2F417304710-44100-2-6685d3c793c56.mp3&#34;&gt;https://anchor.fm/s/1060f2ec0/podcast/play/114907549/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2026-1-2%2F417304710-44100-2-6685d3c793c56.mp3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Published: 2026-02-02 12:37:08+00:00&lt;/li&gt;
&lt;li&gt;Duration: 01:05:41&lt;/li&gt;
&lt;li&gt;Host: Mamadou N&amp;rsquo;diaye&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;video&#34;&gt;Video&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/m_dRvWj7ibM&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=m_dRvWj7ibM&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;h2 id=&#34;audio&#34;&gt;Audio&lt;/h2&gt;
&lt;iframe src=&#34;https://creators.spotify.com/pod/profile/spidey1944/embed/episodes/How-to-Test-with-Selenium---Alan-Richardson-e3eh6ut/a-acetkm6&#34; height=&#34;102px&#34; width=&#34;400px&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The podcast covers the development and application of Selenium and WebDriver in software testing, focusing on their role in improving test coverage and identifying potential failures through strong technical knowledge. It compares Selenium with more modern tools such as Playwright, noting that while Selenium is praised for its simplicity and consistency, Playwright offers additional features and a higher level of abstraction. The discussion also highlights frequent pitfalls in test automation, including attributing problems to the tools themselves, excessive automation beyond necessity, and insufficient communication between developers and testers. Practical advice includes implementing abstraction layers, prioritizing high-risk test cases, and avoiding overly technical, low-level APIs in test scripts.&lt;/p&gt;
&lt;p&gt;The podcast further explores the importance of understanding application architecture, along with design patterns such as Page Object Model and Screenplay Pattern, which help in organizing and maintaining test code effectively. It encourages test automation professionals to learn programming languages like Java, JavaScript, or Python, practice in controlled environments, and develop a strong portfolio with clean and well-documented code. The role of AI in testing is also addressed, with the suggestion that it should be used as an aid for learning and support rather than a substitute for technical understanding. Ultimately, the episode promotes a balance between technical expertise and soft skills, advocating for close collaboration with developers and a commitment to continuous learning to keep up with the fast-changing landscape of software testing.&lt;/p&gt;
&lt;h2 id=&#34;briefing&#34;&gt;Briefing&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&#34;overview-1&#34;&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This briefing summarizes key insights from a recent episode of the &lt;em&gt;How to Test This&lt;/em&gt; podcast, which focuses on modern software testing practices. The episode features &lt;strong&gt;Alan Richardson&lt;/strong&gt;, known as &lt;strong&gt;Evil Tester&lt;/strong&gt;, who brings over &lt;strong&gt;25 years of experience&lt;/strong&gt; in software development and testing. Hosted by &lt;strong&gt;Mamadou&lt;/strong&gt;, a seasoned quality insurance consultant with &lt;strong&gt;over 10 years of industry experience&lt;/strong&gt;, the discussion explores &lt;strong&gt;Selenium&lt;/strong&gt;, &lt;strong&gt;Playwright&lt;/strong&gt;, &lt;strong&gt;automation practices&lt;/strong&gt;, and the &lt;strong&gt;importance of technical knowledge&lt;/strong&gt; for testers.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;key-takeaways&#34;&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;1-introduction-to-the-podcast-and-host&#34;&gt;&lt;strong&gt;1. Introduction to the Podcast and Host&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;How to Test This&lt;/em&gt; aims to help &lt;strong&gt;software testers understand risk&lt;/strong&gt; and &lt;strong&gt;adopt new testing solutions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Host &lt;strong&gt;Mamadou&lt;/strong&gt; is a &lt;strong&gt;quality insurance consultant&lt;/strong&gt; with over &lt;strong&gt;10 years of industry experience&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-alan-richardson--the-guest&#34;&gt;&lt;strong&gt;2. Alan Richardson  The Guest&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alan Richardson&lt;/strong&gt; is known online as &lt;em&gt;&amp;ldquo;Evil Tester&amp;rdquo;&lt;/em&gt;, and has &lt;strong&gt;25 years of experience&lt;/strong&gt; in software development and testing.&lt;/li&gt;
&lt;li&gt;Active in the community through platforms such as:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EvilTester.com&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YouTube&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patreon&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Has authored notable books including:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Java for Testers&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Selenium Simplified&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dear Evil Tester&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;episode-focus-testing-with-selenium&#34;&gt;&lt;strong&gt;Episode Focus: Testing with Selenium&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;3-alan&#34;&gt;&lt;strong&gt;3. Alan&amp;rsquo;s Background and Journey&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Began as a &lt;strong&gt;programmer&lt;/strong&gt; and transitioned into &lt;strong&gt;testing&lt;/strong&gt; via &lt;strong&gt;test consultancies&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Developed skills in &lt;strong&gt;test management, consultancy, and development&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Currently focuses on &lt;strong&gt;improving testing practices&lt;/strong&gt; and educating others.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;4-the-origin-of-the-name&#34;&gt;&lt;strong&gt;4. The Origin of the Name &amp;ldquo;Evil Tester&amp;rdquo;&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Emphasizes the importance of &lt;strong&gt;exposing bad practices and risks&lt;/strong&gt; early.&lt;/li&gt;
&lt;li&gt;Believes in &lt;strong&gt;deep technical understanding&lt;/strong&gt; to challenge flawed design choices and &lt;strong&gt;build technically proficient testers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;mindset-of-a-tester-vs-developer&#34;&gt;&lt;strong&gt;Mindset of a Tester vs. Developer&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No fundamental difference&lt;/strong&gt; in mindset between &lt;strong&gt;testers and developers&lt;/strong&gt;  &lt;strong&gt;multiple mindsets apply based on the role at a given time&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;professional software developer&lt;/strong&gt; can perform &lt;strong&gt;coding, design, management, marketing, and testing&lt;/strong&gt; depending on the project need.&lt;/li&gt;
&lt;li&gt;Alan identifies as a &lt;strong&gt;developer who tests&lt;/strong&gt;, highlighting the &lt;strong&gt;overlap&lt;/strong&gt;, not the exclusivity, of roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;importance-of-technical-knowledge-for-testing&#34;&gt;&lt;strong&gt;Importance of Technical Knowledge for Testing&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Understanding &lt;strong&gt;technology&lt;/strong&gt; is essential for &lt;strong&gt;identifying failure points&lt;/strong&gt; and &lt;strong&gt;injection points&lt;/strong&gt; in systems.&lt;/li&gt;
&lt;li&gt;Key technologies to understand include:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTML, JavaScript, HTTP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Technical knowledge allows testers to:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maximize impact&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expand test coverage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test directly at the backend&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Without this, &lt;strong&gt;testing may be limited to the front end&lt;/strong&gt;, reducing overall effectiveness.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;what-is-selenium&#34;&gt;&lt;strong&gt;What is Selenium?&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selenium&lt;/strong&gt; is a &lt;strong&gt;browser automation library&lt;/strong&gt; with a &lt;strong&gt;consistent API&lt;/strong&gt; across languages like &lt;strong&gt;Java, Python, and TypeScript&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;standard protocols&lt;/strong&gt; like &lt;strong&gt;WebDriver&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Influenced &lt;strong&gt;WebDriver&lt;/strong&gt; and &lt;strong&gt;bidirectional (BD) protocols&lt;/strong&gt;, which are used in tools like &lt;strong&gt;Playwright&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;selenium-vs-playwright&#34;&gt;&lt;strong&gt;Selenium vs. Playwright&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Selenium WebDriver&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Playwright&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Type&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Library&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Capabilities&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Lightweight, consistent&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;More built-in features, language-specific&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Recommendation&lt;/td&gt;
          &lt;td&gt;Preferred for its &lt;strong&gt;simplicity and consistency&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Offers more features but is &lt;strong&gt;language-specific&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Use Case&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;UI testing, precise control&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;AI-driven automation, easier for beginners&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;automation-with-ai-tools&#34;&gt;&lt;strong&gt;Automation with AI Tools&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Playwright&lt;/strong&gt; is &lt;strong&gt;permissive&lt;/strong&gt;, making it &lt;strong&gt;ideal for AI-assisted automation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebDriver&lt;/strong&gt; is &lt;strong&gt;strict&lt;/strong&gt; about &lt;strong&gt;element handling&lt;/strong&gt;, which can make it &lt;strong&gt;more fragile&lt;/strong&gt; in dynamic environments.&lt;/li&gt;
&lt;li&gt;Automation tools like &lt;strong&gt;WebDriver&lt;/strong&gt; are still &lt;strong&gt;viable for unit tests&lt;/strong&gt;, but should ideally &lt;strong&gt;use abstraction layers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;best-practices-in-automation&#34;&gt;&lt;strong&gt;Best Practices in Automation&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Avoid using &lt;strong&gt;Thread.sleep()&lt;/strong&gt;  it leads to &lt;strong&gt;fragile and unreliable tests&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;WebDrivers improved synchronization approaches&lt;/strong&gt; (e.g., &lt;code&gt;Duration&lt;/code&gt; instead of seconds).&lt;/li&gt;
&lt;li&gt;Playwright &lt;strong&gt;abstracts synchronization&lt;/strong&gt;, which makes it &lt;strong&gt;easier for new users&lt;/strong&gt;, but &lt;strong&gt;understanding synchronization remains important&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;common-mistakes-with-webdriver-and-test-automation&#34;&gt;&lt;strong&gt;Common Mistakes with WebDriver and Test Automation&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blaming the tool&lt;/strong&gt;: Many issues are due to &lt;strong&gt;browser driver incompatibilities&lt;/strong&gt;, not WebDriver itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Premature switching&lt;/strong&gt;: Many users &lt;strong&gt;switch to Playwright or AI tools prematurely&lt;/strong&gt; without fully mastering WebDriver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Misunderstanding scope&lt;/strong&gt;: WebDriver is &lt;strong&gt;not for API automation&lt;/strong&gt;; it&amp;rsquo;s strictly for &lt;strong&gt;browser automation&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;test-automation-prioritization-and-best-practices&#34;&gt;&lt;strong&gt;Test Automation Prioritization and Best Practices&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avoid over-automation&lt;/strong&gt;  not everything needs to be automated.&lt;/li&gt;
&lt;li&gt;Automation should be a &lt;strong&gt;team effort&lt;/strong&gt;  not just the responsibility of testers or developers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use proper abstraction layers&lt;/strong&gt;, not direct use of WebDriver in test scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid conditional statements&lt;/strong&gt; like &lt;em&gt;if-else&lt;/em&gt; in tests unless absolutely necessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;data-management-in-testing&#34;&gt;&lt;strong&gt;Data Management in Testing&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data should be managed carefully&lt;/strong&gt; to avoid test failures due to &lt;strong&gt;missing referential integrity&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;data factories&lt;/strong&gt; to generate &lt;strong&gt;test-specific, consistent data&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Best practice: &lt;strong&gt;Set up data either ahead of time or just before execution&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Important data should be obvious and directly specified&lt;/strong&gt; in the test.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;collaboration-with-developers&#34;&gt;&lt;strong&gt;Collaboration with Developers&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Encourages &lt;strong&gt;collaboration between testers and developers&lt;/strong&gt; to avoid &lt;strong&gt;role isolation and silos&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Developers should &lt;strong&gt;update test code&lt;/strong&gt; when they make changes to the application.&lt;/li&gt;
&lt;li&gt;Build &lt;strong&gt;common ground&lt;/strong&gt; by using similar tools and understanding the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;leveling-up-as-a-test-automation-engineer&#34;&gt;&lt;strong&gt;Leveling Up as a Test Automation Engineer&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Practice platforms&lt;/strong&gt; like &lt;strong&gt;Test Pages&lt;/strong&gt; and &lt;strong&gt;API Challenges&lt;/strong&gt; are recommended for real-world experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn the language used in your job&lt;/strong&gt; for maximum practical benefit.&lt;/li&gt;
&lt;li&gt;AI tools can be used to &lt;strong&gt;consume information, critique code&lt;/strong&gt;, and &lt;strong&gt;speed up learning&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn by doing&lt;/strong&gt;, &lt;strong&gt;document your process&lt;/strong&gt;, and &lt;strong&gt;embrace mistakes as learning opportunities&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;programming-language-recommendations&#34;&gt;&lt;strong&gt;Programming Language Recommendations&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Language&lt;/th&gt;
          &lt;th&gt;Use Case&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Best for &lt;strong&gt;JVM environments&lt;/strong&gt;, especially with &lt;strong&gt;Selenium&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Widely used, &lt;strong&gt;versatile&lt;/strong&gt;, and &lt;strong&gt;easy to learn&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Ideal with &lt;strong&gt;Playwright&lt;/strong&gt;, good for &lt;strong&gt;web automation&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Great for &lt;strong&gt;frontend automation and web testing&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;portfolio-building-tips&#34;&gt;&lt;strong&gt;Portfolio Building Tips&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Build your &lt;strong&gt;portfolio naturally&lt;/strong&gt; during your learning journey.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;GitHub&lt;/strong&gt; to showcase your &lt;strong&gt;repositories&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Focus on &lt;strong&gt;clean, well-structured code&lt;/strong&gt; with &lt;strong&gt;CI/CD, page objects, code coverage&lt;/strong&gt;, and &lt;strong&gt;static analysis&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keep projects &lt;strong&gt;private&lt;/strong&gt; until they are &lt;strong&gt;polished&lt;/strong&gt; enough to be shared publicly.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;final-advice-and-call-to-action&#34;&gt;&lt;strong&gt;Final Advice and Call to Action&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Emphasized the role of &lt;strong&gt;AI&lt;/strong&gt; in the &lt;strong&gt;future of testing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Encouraged &lt;strong&gt;continuous learning&lt;/strong&gt;, &lt;strong&gt;technical and soft skills&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Final call to action:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learn by doing&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document your process&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never be afraid to make mistakes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share and reflect on your learning journey&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;recommended-resources&#34;&gt;&lt;strong&gt;Recommended Resources&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Practice sites:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Testpages.eviltester.com&lt;/strong&gt; - &lt;a href=&#34;https://testpages.eviltester.com/&#34;&gt;https://testpages.eviltester.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apichallenges.eviltester.com&lt;/strong&gt; - &lt;a href=&#34;https://apichallenges.eviltester.com/&#34;&gt;https://apichallenges.eviltester.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tools:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebDriver&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Playwright&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-assisted code generators&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The episode highlights the &lt;strong&gt;importance of technical knowledge&lt;/strong&gt;, the &lt;strong&gt;evolution of automation tools&lt;/strong&gt;, and the &lt;strong&gt;pressing need for collaboration, abstraction, and continuous learning&lt;/strong&gt; in software testing. As AI and modern tools reshape the testing landscape, testers must adapt, deepen their understanding, and focus on &lt;strong&gt;quality, collaboration, and abstraction&lt;/strong&gt; in their automation practices.&lt;/p&gt;
&lt;h2 id=&#34;final-notes&#34;&gt;Final Notes&lt;/h2&gt;
&lt;p&gt;Here are the key insights and takeaways from the podcast text:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding Risk and Testing&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Risk-oriented approach&lt;/strong&gt;: The podcast emphasizes the importance of understanding and managing risk in software testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adoption of new testing solutions&lt;/strong&gt;: It encourages testers to explore and adopt new testing solutions to improve efficiency and effectiveness.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Guest Introduction: Alan Richardson (&amp;ldquo;Evil Tester&amp;rdquo;)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Alan Richardson&amp;rsquo;s background&lt;/strong&gt;: Alan is a seasoned software developer and tester with 25 years of experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experience in testing&lt;/strong&gt;: He has worked on various projects and has written several books on testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activation on multiple platforms&lt;/strong&gt;: Alan is active on multiple platforms, including EvilTester.com, YouTube, Patreon, GitHub, and LinkedIn.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Career Background and Transition&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;As a programmer, Alan started by focusing on systems design and programming&lt;/strong&gt;: His background as a developer helped him transition into software testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gained experience in test management&lt;/strong&gt;: He has experience in test management, consultancy, and development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Current focus&lt;/strong&gt;: Alan now: focuses on improving testing practices, creating educational content, and helping testers understand software better.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Mistakes to Avoid in Testing&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Avoiding premature tool switching&lt;/strong&gt;: This can lead to frustration and decreased productivity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not understanding the technology&lt;/strong&gt;: This can result in inefficient and unmaintainable tests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proper use of automation tools&lt;/strong&gt;: Correctly using tools like WebDriver or Playwright is crucial for effective testing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Learning and Development&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Understand the underlying technology&lt;/strong&gt;: Dissecting web automation tools like WebDriver and Playwright is essential for optimal use and test preparation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Develop technical skills&lt;/strong&gt;: Amplify testing skills and become a &lt;strong&gt;testers-programmer&lt;/strong&gt; in your own right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acquire essential skills&lt;/strong&gt;: Key skills involve HTML, JavaScript, HTTP, and CSS, which will help you to navigate the evolution of web applications.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Testing with Selenium&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Selenium introduction&lt;/strong&gt;: Selenium is a library used to automate web browsers, providing a consistent API across multiple programming languages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selenium importance&lt;/strong&gt;: It has influenced and helped define standards for browser automation, such as the WebDriver protocol and the bidirectional (BD) protocol.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Common mistakes made by Selenium users&lt;/strong&gt;: Avoid premature tool-switching, misunderstand the technology, and make proper use of automation tools.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;transcript&#34;&gt;Transcript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NOTE: auto-transcripts usually have a typos. I tend to skim read them, as an extra aid to decide if I listen to the podcast. But by the time I hit the transcript I&amp;rsquo;ve usually decided if I listen to the episode or not.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hey everyone, welcome back to How to Test This, the podcast designed to help software testers understand risk and adopt new testing solutions with ease and confidence. Your host is Mamadou, a quality insurance consultant with over 10 years of experience across multiple industries. In each episode, he&amp;rsquo;ll talk to different experts and learn from them about how they test.&lt;/p&gt;
&lt;p&gt;Welcome Alan Richardson. Alan Richardson is commonly known online as Evil Tester. He is an experienced IT professional with 25 years of experience in software development and testing. He is an independent consultant and coach helping teams improve their testing and automation approaches. A speaker at Confluence WorldWard and trainer with many technical web testing courses.
of that, he&amp;rsquo;s an author of several books, helping testers, for example, Java for testers, Selenium Simplified, Dear Evil Tester, and many other books. He&amp;rsquo;s also a passionate content creator in this blog, EvilTester.com. He has blog posts, articles, tutorial, podcasts. He shares a weekly newsletter. He&amp;rsquo;s also very active on YouTube, Patreon, GitHub, LinkedIn.&lt;/p&gt;
&lt;p&gt;So thank you very much, Alan, for being here and being open to share your experience.&lt;/p&gt;
&lt;p&gt;No problem. Thanks for inviting me.&lt;/p&gt;
&lt;p&gt;Okay. In this episode, we&amp;rsquo;ll be talking about testing with Selenium. First, we&amp;rsquo;ll start with Alan&amp;rsquo;s background and experience. Then we&amp;rsquo;ll discuss what is Selenium and why it could be important as a tester to learn. Next, we&amp;rsquo;ll talk about common mistakes Selenium users tend to make. After that, we&amp;rsquo;ll discuss some practical tips
on how to make the most out of Selenium. To conclude, we&amp;rsquo;ll share recommendations to get started in your journey. If you&amp;rsquo;re interested in this tool or also getting a better, becoming a better tester. So without further ado, let&amp;rsquo;s get started. Thank you again, Alan, for being here. I wanted to know how did you got into testing? At what point did you decide to make a living out of it?&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s given I&amp;rsquo;ve been doing this for a long time. That&amp;rsquo;s a long story. So essentially I started as a programmer because I was very technical going through university. I went, I studied programming at university, computing, systems design, all that stuff. And my projects at university, I always wanted to be really technical. So I wrote a COBOL interpreter from scratch, which was bootstrapped by a design
tool. So it was a GUI design tool that was generating everything. And I wrote a COBOL interpreter that sat inside a GUI design tool so that you could create Jackson structure programs and interpret them and trace them through. So then naturally I got a job as a programmer doing C and C++ for a company that was building GUI design tools. And then they went bankrupt. So I got a job at a test consultancy, helping them build test tools.&lt;/p&gt;
&lt;p&gt;Then they went bankrupt. Then I got a job at another test consultancy. So then I had to start learning testing because I was building tools for them. But I was also at one site doing testing and testing was not something that you learned at university. So we&amp;rsquo;d learned system design, architecture, programming, but not testing. So it was really interesting for me at the start because I could use all the programming skills, all design skills, all the analysis skills. And I was learning testing skills. And at that point
testing was for me a very technical process. Lots of programming. The tools were way too expensive. So you had to build your own tools. You were working with the development team. No one really, everyone was in flux. If you just use standard waterfall models, everyone went wrong. So you had to figure out how to do things in a more lean way. So just over time, I started to specialize more in software testing, but still doing programming on the side, then doing consultancy because I was a consultant, then contract
testing, then moved into test management to control the process. Cause I was so annoyed with the way that people manage things. Then you start going to independence, you do consultancy and that means talking at conferences, training, blog posts, everything else. And then I&amp;rsquo;ve continued to stay in development. And over the last couple of years, I&amp;rsquo;ve mainly been doing development work. And now I&amp;rsquo;m back looking at the, how can we learn to test better and practice things
better and create material and content for that. Yeah, exactly. Exactly. And you also known as Evil Tester. What&amp;rsquo;s the story behind this name? So it started because I was on a lot of projects that were really annoying and frustrating and testing wasn&amp;rsquo;t getting the respect it deserved. The development teams were not getting the respect they deserve. Everyone was split into silos. Testing was seen as this
necessary evil where we were kind of holding things up because we were raising bugs because the development process was being constrained and no one was designing things. No one had the time to build it properly. So we were getting blamed for those things. And it gradually just got to the point where I was thinking, well, if you want, if you think we&amp;rsquo;re doing something bad and horrible and evil, I can show you what that means in your application and I can really hit it hard. So then I learned to really
understand the technicalities of these applications and really raise risks and try and prevent these designs from happening before they even got through the design process to really hit it hard very early. And that was that whole concept for me of I will show you what it means to be evil to your application. And I will take the steps necessary and raise the risks and learn the tools. And you will not be able to bamboozle me in any
shape or form because I will understand the technology. I will learn your programming language. I will know what we&amp;rsquo;re doing. I will look at the code. I will have it running locally. I will pull this thing apart. So that also helps bring me back into the development world from a testing perspective because you really need to know the technicalities if you&amp;rsquo;re doing programming. And I think knowing the technicalities really helps when you&amp;rsquo;re doing testing.&lt;/p&gt;
&lt;p&gt;Yeah. But to me, I&amp;rsquo;m under the impression like you need two different mindsets to be a tester and also a developer. So do you consider yourself as a tester who automates or a developer who tests?&lt;/p&gt;
&lt;p&gt;So I consider myself a developer who develops because I don&amp;rsquo;t believe that there are two different mindsets in the person. I believe there are two different, there are multiple mindsets that you apply for the role that you were doing at that time.&lt;/p&gt;
&lt;p&gt;When you are programming, you are trying to create something and construct it and make it as well defined and elegant and working as you can. But then you have to step back from that and figure out where is it going to go wrong? How can I architect it so it doesn&amp;rsquo;t go wrong? How can I break it? If I don&amp;rsquo;t believe that you are one thing or the other. So I try to go meta to that. And for me, a software developer, a professional software developer can code. They can design.&lt;/p&gt;
&lt;p&gt;They can do the management. They could do the marketing. They could sell it to people. They can test it. They can do performance testing, security testing, that whole set of things. And depending on what our focus is at that time, we build a mentality for doing that and a set of models that help us do the right thing at that time. So partly I believe that because I&amp;rsquo;ve done so much programming that I cannot believe
that I can&amp;rsquo;t program. I have evidence that I can program. I have evidence that I can test. So I don&amp;rsquo;t believe it&amp;rsquo;s one thing or the other. And I&amp;rsquo;ve worked in product and I&amp;rsquo;ve worked in marketing. So I don&amp;rsquo;t believe that any of these are exclusive to each other. They have a lot of overlap and it&amp;rsquo;s just recognizing where that overlap is and what skills you need in order to be good at that role at that time.&lt;/p&gt;
&lt;p&gt;Okay. And during your career,
you&amp;rsquo;ve written many books about Selenium, Java. What problem did you see that motivates you to help testers become more technical?&lt;/p&gt;
&lt;p&gt;So part of the problem is I don&amp;rsquo;t think people often understand the technology enough to see the risks that are there. So even, even when you&amp;rsquo;re programming something, you often don&amp;rsquo;t really know the technology. You know how to get the technology working.&lt;/p&gt;
&lt;p&gt;But you don&amp;rsquo;t necessarily know the technology enough to pull it apart and see where the risks are. So we find those out in live. And testing when we&amp;rsquo;re looking at it, we don&amp;rsquo;t need to necessarily know the technology well enough to build it, but we need to know the technology well enough to know where can it go wrong and where are the injection points that I can take control of and where are the interface points that trouble can often creep in. And so if you&amp;rsquo;re testing a web application,
if you don&amp;rsquo;t know HTML, you can&amp;rsquo;t look at the source code and understand it. If you don&amp;rsquo;t know JavaScript, you can&amp;rsquo;t look at the source code and see where it&amp;rsquo;s going wrong. You can&amp;rsquo;t experiment with front end. If you don&amp;rsquo;t know HTTP, you can&amp;rsquo;t look at the network traffic and understand how it&amp;rsquo;s communicating with the backend. So you don&amp;rsquo;t necessarily know where you should focus your attention. So if you don&amp;rsquo;t know any of the technology, you&amp;rsquo;re going to spend all the time on the front end.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not going to be able to maximize your impact. If you understand the technology, you can say, well, I&amp;rsquo;ve done the front end for a while. Now I&amp;rsquo;m going to look at all the HTTP messages and that allows me with tooling to go a lot faster. I can expand the scope of what I&amp;rsquo;ve done, the coverage, and I can hit the backend very hard without having to go through the front end. And you can build a different model. So that&amp;rsquo;s why I think the technology is important.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s talk about Selenium for a complete beginner. Can you explain to us what Selenium is and what Selenium is not? So Selenium is a library that allows you to automate a browser. And that&amp;rsquo;s basically it. So if you use Selenium in TypeScript, you use Selenium in Python or use it in Java, you&amp;rsquo;ve pretty much got the same interface. So it&amp;rsquo;s a very standard tool.&lt;/p&gt;
&lt;p&gt;Selenium uses standard protocols to talk to the browser. So it&amp;rsquo;s evolved over years and Selenium essentially set some of the standards for how tools interoperate with browsers now. So the whole Selenium team did so much hard work to create web standards for the WebDriver protocol and now the bi-directional protocol that is also used by Playwright.&lt;/p&gt;
&lt;p&gt;Jason Huggins&amp;rsquo; new tool Vibium is using the BD protocol and WebDriver can switch between the BD and the old protocol at the moment. So that&amp;rsquo;s still in evolution. But these are now standards that other tools can use. So they&amp;rsquo;ve done so much work to do that, but also Selenium is an abstraction so that we don&amp;rsquo;t necessarily need to know the protocol. The actual interface that we use when we&amp;rsquo;re writing code has not really been impacted by the underlying protocol changes, which means that
you learn the API and it&amp;rsquo;s fairly consistent over years. They do tend to take things out that are slightly surprising, but then if you understand code, you can then go back and look at how they implemented it and then re-implement it yourself because it&amp;rsquo;s very often just the support abstractions that have been taken away. But basically it&amp;rsquo;s, for me, Selenium WebDriver is a library that we use to automate browsers and that&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;So in comparison to something like Playwright, Playwright is a framework and it&amp;rsquo;s different in the different languages. So you have more capabilities if you&amp;rsquo;re using Playwright from TypeScript than you do from Java. And in TypeScript is a whole framework where it will do your execution for you so you don&amp;rsquo;t need to have a test execution framework. Whereas if you&amp;rsquo;re using WebDriver in Java, you need to add something like JUnit because that&amp;rsquo;s your
test execution framework. But in TypeScript, if you&amp;rsquo;re using Playwright, Playwright is your execution framework. So it does a lot more. And what I like about WebDriver is it is very constrained and focused on automating the browser. Because we&amp;rsquo;re in a world of AI now and there are MCP tools, model context, protocol tools for all of the different libraries. So you&amp;rsquo;ve got one for&lt;/p&gt;
&lt;p&gt;WebDriver, which is fairly crude. Then you&amp;rsquo;ve got one for Chrome itself. Then you&amp;rsquo;ve got one for Playwright. And these are used by the AI tools for automating. So Playwright, because it&amp;rsquo;s very permissive with waits,, it can be used very easily for automating with AI. If you use something like WebDriver for automating with AI, it will be a lot harder.&lt;/p&gt;
&lt;p&gt;Because WebDriver is much less permissive. With WebDriver, you find something on a page. WebDriver hooks onto that thing and says, this is it. And if the page changes and I lose touch with this and I will throw a stale element exception and you&amp;rsquo;ll have to fix it. Playwright doesn&amp;rsquo;t actually grab hold of anything. Playwright says, when you want me to work with something on the page, I will find it and I will find it each time I&amp;rsquo;m looking for it. So if it&amp;rsquo;s moved or it&amp;rsquo;s changed or we&amp;rsquo;ve refreshed
the page, I don&amp;rsquo;t care. I&amp;rsquo;ll try and find it. Which in my mind makes it really useful for automating when you don&amp;rsquo;t want to take as much control over the process, but use WebDriver when you want to automate for testing. Like I like to automate for testing, which means when we&amp;rsquo;re, I&amp;rsquo;m going to keep talking. When we automate, very often when we&amp;rsquo;re testing, when we&amp;rsquo;re automating,
we&amp;rsquo;re automating unit tests. People talk about, we&amp;rsquo;ve got the setup, then you&amp;rsquo;ve got the action, then you&amp;rsquo;ve got the comparison part. I can&amp;rsquo;t remember, people have different ways of explaining that. But with WebDriver, you would set things up, you would do your actions, then you would find all the elements that you want to do comparisons on, then do the assertions on those elements. If anything has changed when you start doing comparisons, your test will fail.&lt;/p&gt;
&lt;p&gt;Right. You do the setup, you do your actions. And when you start doing assertions, you&amp;rsquo;re still using Playwright locators. So your assertions are also waiting for things to happen. So you&amp;rsquo;re still essentially allowing the page to change and evolve during your assertion process. So you can get away with a bad user experience when you&amp;rsquo;re automating with Playwright. It&amp;rsquo;s one of the risks.&lt;/p&gt;
&lt;p&gt;With WebDriver, you don&amp;rsquo;t, because WebDriver will just fail, it will stop. And I like that. I like to have complete control over the setup and the comparison. And I want to know if something is not the way that I have modeled it. With Playwright, that is sometimes taken away and it makes it a lot easier to automate without having to fully understand the application. So, I mean, that&amp;rsquo;s why people seem to prefer Playwright now, because of the auto weights.&lt;/p&gt;
&lt;p&gt;The concern I have is that people often, there&amp;rsquo;s nothing wrong with the auto weights, right? There&amp;rsquo;s nothing wrong with that. And it makes it nice and easy to do things, but it introduces risks into your process that WebDriver doesn&amp;rsquo;t. So hopefully everyone using Playwright understands the risks that these functionalities that make it easy to automate introduce into their automated execution. With WebDriver, you have to learn how the page and application works and
pause for certain state conditions, then interoperate with the page, which can make it harder in the early days. But if you know how to do that in WebDriver, you&amp;rsquo;ll know how to do that in Playwright and you know how to do that in any other tool. But if you rely completely on Playwright with its auto weights, I think it will make you weaker longer term. But Playwright to me is something that&amp;rsquo;s been built for AI automating.&lt;/p&gt;
&lt;p&gt;Rather than experienced automating in a tight constrained environment. So it really depends what kind of automated execution process people want. And for, let&amp;rsquo;s say you have a new tester coming to you and looking to learn a new tool. So what consideration would you take to guide him towards Selenium or Playwright based on his profile, the type of project, the context?&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s hard because if you&amp;rsquo;re working on a project, you&amp;rsquo;re there to get results and you get results within the confines of your experience. So if you&amp;rsquo;re new to automating, you&amp;rsquo;re going to pick the tool that makes it easiest for you to do the work. And at the moment, that&amp;rsquo;s going to be Playwright. Your main issue is going to be, you&amp;rsquo;re probably going to have to learn TypeScript in order to use Playwright effectively.&lt;/p&gt;
&lt;p&gt;TypeScript is okay. It&amp;rsquo;s a little bit harder to set up than something like Java. Code completion is getting better. There&amp;rsquo;s a lot of asynchronous calls that can be a little bit hard to understand. So I don&amp;rsquo;t always know if people fully understand what is happening under the covers when they&amp;rsquo;re using TypeScript. With Java, it&amp;rsquo;s all very sequential and you can do async stuff if you need to, but out of the box, everyone&amp;rsquo;s going to wait, which in that sense makes it easy to program. So if you&amp;rsquo;re going to learn something, you have to focus on the results.&lt;/p&gt;
&lt;p&gt;You want to achieve and then do experiments to get those results as quickly as possible. But if I was learning anything at the moment related to code, I would be using the AI tooling to help me. So, I mean, I use AI tooling a lot when I&amp;rsquo;m coding. Inside my IDE, I have a plugin called Continue, which allows me to do kind of code completion activities and ask questions in a chat.&lt;/p&gt;
&lt;p&gt;About the code that I&amp;rsquo;m working with and generate code or from the command line, I&amp;rsquo;ll use something like open code with various models to generate code. And that allows you to get started very quickly because you could say in open code, create a project using WebDriver or using Playwright that will help me automate this URL and then say, here&amp;rsquo;s this particular page. I want you to create some tests.&lt;/p&gt;
&lt;p&gt;And cover this and it will start writing code for you. You can then use that to make sure you understand where it&amp;rsquo;s written because you&amp;rsquo;re going to have to maintain it. But you&amp;rsquo;re getting examples that are contextual to your application. So it&amp;rsquo;s not like they&amp;rsquo;re just random application examples. They&amp;rsquo;re for your system. And if it stops working, you need to understand how it&amp;rsquo;s working. But I would try and take advantage of that.&lt;/p&gt;
&lt;p&gt;I would take advantage of AI as much as possible because it&amp;rsquo;s scraped everything. It&amp;rsquo;s probably scraped my books and they&amp;rsquo;re in an AI somewhere. It&amp;rsquo;s scraped all the GitHub repos where we&amp;rsquo;ve all created examples on how to use WebDriver and Playwright and everything else. So it&amp;rsquo;s going to be pretty good at giving you basic code. And particularly if you&amp;rsquo;re doing web automating, you can use the AI to say specifically, take this URL, create a page object
that uses WebDriver or Playwright and then create an example test that uses it. If you know the patterns for automating, you can get the AI to implement those patterns. So you don&amp;rsquo;t just get something like a recorder. If you&amp;rsquo;re using something like Playwright recorder or any of the recording tools, they&amp;rsquo;ll record, go to URL, click this horrible locator, click this, click this, do this thing, click this thing, do this thing. But it won&amp;rsquo;t build the concept of abstraction layers to make it easier to
maintain. So you have to learn the right architecture for your test execution code in order to guide the AI. So there&amp;rsquo;s stuff you will have to learn, but you can also use AI to teach you. So ask the AI questions like, what are the best practices for WebDriver or for automating with Playwright or for doing this? And it will give you some answers that you can then go and research that you can experiment with.&lt;/p&gt;
&lt;p&gt;If I was learning at the moment and because I&amp;rsquo;m still learning things, I use AI to help me do that. So I&amp;rsquo;m using AI all the time to learn new stuff. Okay. Thank you. And I also wanted to talk about your book. It was written like back in 2012. How has Selenium changed over time with all the new requirements such as web applications, CI/CD, DevOps, like how it has evolved for you? Is it still compatible?&lt;/p&gt;
&lt;p&gt;So WebDriver hasn&amp;rsquo;t changed a lot. It changed enough that the code that you would have written back then isn&amp;rsquo;t fully compatible, but that&amp;rsquo;s only because they tightened up the API. So it used to be things like when you were creating a WebDriver wait, you would put in a number of seconds. Now you put in a duration, which is a standard Java class. So they tightened up the API and made it much better. So you can wait on durations of milliseconds or whatever else.&lt;/p&gt;
&lt;p&gt;But again, if you encounter code that was written back then and said, I need to upgrade this to WebDriver for whatever the current version is, the AI can make a fairly good stab at that. You can understand what&amp;rsquo;s different. We&amp;rsquo;ve got so much code completion now that when you see it in the IDE, it will probably suggest how you can make it better. But WebDriver hasn&amp;rsquo;t changed so much at the API level.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s changed a lot under the covers. And now WebDriver is even easier. The complaints you often hear about WebDriver are, well, you have to download the drivers. You have to set up the browsers. You don&amp;rsquo;t have to do any of that anymore. You don&amp;rsquo;t even have to introduce a secondary package because they did create a secondary package that you had to install, but now that&amp;rsquo;s incorporated in the main WebDriver. So now if you say, create a new Chrome driver, it will go away, download the Chrome driver, download the browser for you.&lt;/p&gt;
&lt;p&gt;And make it instantly accessible in the same way that Playwright does. So there&amp;rsquo;s a lot fewer barriers to entry. Okay. And back to your story, when you start adopting Syriam, was it easy for you or did you struggle? Was it easy? How was it when you started? So none of these things were easy at this start. I mean, the reason I wrote the book Java for Testers is I was trying to learn Java and the books were a nightmare.&lt;/p&gt;
&lt;p&gt;I had no idea why I was doing anything because it would start with a couple of chapters of, now write this text file with these declarations in it. Now do this. Now run this command. And it didn&amp;rsquo;t work. And I had no idea how to fix it. The IDEs were not good enough. So I tried to work backwards and make it as simple as possible. But also at that time, WebDriver wasn&amp;rsquo;t WebDriver, it was Selenium. So it was Selenium RC, which was essentially injecting JavaScript into the
page and using a very different API. It&amp;rsquo;s kind of like the way that Cypress operates, I think. Then WebDriver came along and that built a different API on top, but it was using a different communication mechanism. Then they standardized the communication mechanism. So you got the initial WebDriver protocol and it was using the DevTools protocol as well. Then you&amp;rsquo;ve got the BD protocol. So it&amp;rsquo;s become easier over time.&lt;/p&gt;
&lt;p&gt;So when you&amp;rsquo;re injecting JavaScript, you can&amp;rsquo;t do things like, okay, now switch to this tab because you simply can&amp;rsquo;t. So there was a whole bunch of things we could not automate at that point. But then with WebDriver you could, so automating became easier. And the reason I learned it in depth so much was to make sure we didn&amp;rsquo;t introduce bad coding practices so that the worst thing you can ever do when you&amp;rsquo;re automating something is put in a sleep, like thread sleep.&lt;/p&gt;
&lt;p&gt;Because that&amp;rsquo;s going to be so flaky and eventually you would just keep increasing it. WebDriver had a kind of implicit wait where it would wait for, it would do a kind of retry type mechanism. It&amp;rsquo;s a bit clumsy, but again, that would leave you open to vulnerabilities. So I&amp;rsquo;d learned how to wait really thoroughly by reading the code, learning HTML properly, learning how JavaScript works, knowing how to synchronize effectively.&lt;/p&gt;
&lt;p&gt;So I created some content on how to do that because that to me was the core of how to make robust automating, learning how to wait effectively. So now Playwright has come along and it&amp;rsquo;s gone. You don&amp;rsquo;t need to learn that synchronization stuff anymore. We&amp;rsquo;ll cover that for you, which makes it easy to get started. But when things go wrong, you do have to understand that. And Playwright does let you step in and synchronize more effectively.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t need to, and you probably shouldn&amp;rsquo;t start with that until you need it with Playwright, which is kind of the reverse of WebDriver. WebDriver, you really need to understand the application state and you really need to wait at specific times. Because the framework, the library won&amp;rsquo;t help you. But as an API, it hasn&amp;rsquo;t changed too much over the years.&lt;/p&gt;
&lt;p&gt;So I imagine the mistakes are changing all the time. So the biggest mistake I think people make with WebDriver is they blame WebDriver when things are going wrong. And usually it&amp;rsquo;s not WebDriver&amp;rsquo;s fault.&lt;/p&gt;
&lt;p&gt;The driver that&amp;rsquo;s supplied by the browser has introduced some incompatibilities. That happened recently with the Chrome driver. Then people don&amp;rsquo;t know that, well, if I go and look in the actual code of WebDriver on GitHub, someone will have raised an issue and the answer is probably there. So people are very supportive on that community. But generally people go WebDriver doesn&amp;rsquo;t work. Therefore, we must throw everything away and start again with a completely new framework like Playwright, which everyone is using.&lt;/p&gt;
&lt;p&gt;Playwright uses TypeScript, so we&amp;rsquo;re not going to use Java anymore. So we&amp;rsquo;ll learn TypeScript and Playwright at the same time. So the biggest mistake people make is blaming the tool, not learning how to use it properly, then throwing it away and adopting a new tool when they didn&amp;rsquo;t fully understand why they were migrating. I haven&amp;rsquo;t really found a problem that I couldn&amp;rsquo;t solve with WebDriver, an effect of synchronization. And then I&amp;rsquo;ve been doing this for a long time.&lt;/p&gt;
&lt;p&gt;But the mistake I think people is they don&amp;rsquo;t learn the tool in depth. And there&amp;rsquo;s actually a lot less to learn with WebDriver than there is with Playwright, because Playwright is a framework. So all you&amp;rsquo;ve got is a library. And also people then look at WebDriver and go, well, I&amp;rsquo;m doing API stuff as well. WebDriver doesn&amp;rsquo;t handle API. Therefore, WebDriver is not a good enough tool. And it&amp;rsquo;s like, no, no, WebDriver is a very specific tool to let you automate browsers.&lt;/p&gt;
&lt;p&gt;If you want to then automate the API, you bring in a new library to help you automate the API. And then you build abstractions on top to help you. So WebDriver is kind of a tool that if you know how to program well and know how to architect your test execution code and know how to understand the web technologies, I think you can do well with it. But people very often don&amp;rsquo;t put the effort in to learn those technology aspects.&lt;/p&gt;
&lt;p&gt;And you could argue that they don&amp;rsquo;t need to, so we should use an easier tool. And that&amp;rsquo;s great. Then use something like Playwright. And then you go, well, we need to use AI. Great. Start using Vibium or whatever other web tool you&amp;rsquo;ve got. But all of those are abstractions away from the technology and the act of automating. And so if you&amp;rsquo;re not learning how to automate effectively, at some point something&amp;rsquo;s going to go wrong and you&amp;rsquo;re not going to know how to fix it. So I still think it&amp;rsquo;s really important
to get as low level as you can. And so I mean, it&amp;rsquo;s really useful even if you&amp;rsquo;re programming to try and learn some sort of assembly language or some sort of C++ or C where the guardrails are removed. And if you do something wrong, your machine crashes. It&amp;rsquo;s really important to go through that process. But most people don&amp;rsquo;t do that anymore. So I guess it&amp;rsquo;s kind of old fashioned. Experience the pain first so you know how to overcome anything.&lt;/p&gt;
&lt;p&gt;Okay. And another common mistakes we tend to see is like new testers who get too good at test automation. They tend to want to automate everything. Do you think, how do you prioritize what needs to be automated or not? So I think, so that&amp;rsquo;s not just the tester&amp;rsquo;s fault. That&amp;rsquo;s a, that&amp;rsquo;s actually a process problem because very often what&amp;rsquo;s happening is we&amp;rsquo;ve split the team into
people who write the code, people who test the application, people who write code to automate the application. So these people have to justify their roles and the people who write the code now don&amp;rsquo;t have to worry about automating it. So they don&amp;rsquo;t really have to worry about the scope. They will automate it, but they probably won&amp;rsquo;t use the same tools. So they&amp;rsquo;ll be using the JavaScript libraries to automate the JavaScript before it actually hits the browser.&lt;/p&gt;
&lt;p&gt;Then you&amp;rsquo;ve got these test automators or SDETs or whatever the role is, whose entire job is to automate. So they&amp;rsquo;re going to automate as much as they can because that&amp;rsquo;s their job. Their job is not also to try and prioritize some testing or prioritize some development. Their job is to increase that expansion. So that&amp;rsquo;s what they do. So they would get too much automated execution. And because they&amp;rsquo;re not collaborating with the programmers, they&amp;rsquo;re not seeing what coverage has already been done by the programming team. So you get a lot
of overlap. They may not be working as closely with the programmers, so they might not develop their programming skills as much. So they might be slightly weaker programmers and not know how to architect the code. If you have a process where everyone is working together and everyone understands the overlap, then the prioritization decision is made for the project, not the role. And then you can get a good overlap of coverage because people who are
animating the SDET role can focus externally on the API or the UI, but they don&amp;rsquo;t have to go into extreme coverage steps because they know that there&amp;rsquo;s a lot of unit testing being done at all the different levels in the stack. And the people who are doing the testing can know what coverage is there at base level. So they can then go, right, we will rely on the CI going green for those barriers and we will just go really deep in these areas because we see risk in this section, which is really
hard for these two people to automate. So we&amp;rsquo;ll hit this really hard. So it&amp;rsquo;s that. I think a lot of that is a process problem rather than a mistake that the people use. But also if they a lot of it, I guess also is I think people don&amp;rsquo;t know how to create abstractions properly. So they put too much in the test code rather than an abstraction layers. And so they spend a lot of their time maintaining what they&amp;rsquo;ve got.&lt;/p&gt;
&lt;p&gt;And then they end up updating it, which is also a communication problem. If your locators are breaking when the new release comes in, it&amp;rsquo;s probably not. I mean, it might be because you did bad locators, but it&amp;rsquo;s because you didn&amp;rsquo;t know. And it&amp;rsquo;s because the people who changed the locators in the application didn&amp;rsquo;t also update the automated execution, which they probably should have done. So a lot of process issues seem like tooling or skill issues, but they can be solved by people communicating effectively.&lt;/p&gt;
&lt;p&gt;Page object. So I still use page object models. Yeah. I mean, I think the issue with page object model is that people think of it as a page object when really it&amp;rsquo;s an object or components, which you can find on a page and some of it will be a page. Some of it will be a repeated section of HTML code.&lt;/p&gt;
&lt;p&gt;It will be a react component that is being used. It&amp;rsquo;s about knowing how to abstract the application, but very often no one is taught these things. I mean, I mentioned earlier on that I started at university and we learned systems design, modeling, programming. We learned how to model things and create abstractions. People don&amp;rsquo;t know how to do that. Now there&amp;rsquo;s a book and it&amp;rsquo;s the domain driven design
book is a very good modern overview of how to model an application and create abstractions. And if people learned that and applied it into software testing, essentially what you&amp;rsquo;ve got there is a, an application web domain. So you then have to model that with objects. If you&amp;rsquo;ve got an API, you model the API communication domain and you create objects for those. So it&amp;rsquo;s not so much.&lt;/p&gt;
&lt;p&gt;That it&amp;rsquo;s page objects. It&amp;rsquo;s that we&amp;rsquo;re modeling the application in a way that allows us to automate it better. And that page object models are often mentioned that, well, we don&amp;rsquo;t need page object models anymore because we&amp;rsquo;ve got the screenplay pattern. Screenplay pattern uses actors and essentially functionality to do things, which is another way of modeling the world, right? But we&amp;rsquo;re not modeling the physical application at that point. We&amp;rsquo;re modeling the user.&lt;/p&gt;
&lt;p&gt;But there&amp;rsquo;s no reason why the actions that the agent that you&amp;rsquo;ve modeled in the screenflow pattern can&amp;rsquo;t be using page objects because that action can involve using particular page object. So you can model the physical world in terms of page objects. Then you can model the functional use world as actors and screenflow. And then hopefully it&amp;rsquo;s a little bit easier to manage because there&amp;rsquo;s fewer actions and you update the page objects.&lt;/p&gt;
&lt;p&gt;Page object when the physical application changes, that&amp;rsquo;s what these abstractions are for. They should only have to change when the thing they&amp;rsquo;re modeling changes, but otherwise they create an API that allows someone else to use it without worrying about those changes. So your tests should never really have to change very much because they&amp;rsquo;re using either actors with actions that can do things or page objects with methods that will make things happen.&lt;/p&gt;
&lt;p&gt;But if the underlying page changes, you don&amp;rsquo;t change the test, you change the physical abstraction that it maps onto. Okay. So it seems like you need to have a very strong foundation. So for people who are starting in this journey to non selenium, so what paths would you recommend? Like, do you focus on WebDriver, IDE, coding? Well, so the first thing, if you&amp;rsquo;re, so it depends how fast you have to work.&lt;/p&gt;
&lt;p&gt;Because if you&amp;rsquo;re learning it to improve your skills, you can take your time. You can experiment with WebDriver a little bit. You can make a mess. You can learn programming at the same time. And you can gradually improve. I mean, one of the reasons I created the test pages site, so testpages.evotest.com is a site that you can go to. It&amp;rsquo;s got all HTML controls laid out in different ways so that you can practice automating them.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s got standard applications so you can practice testing. And then you can experiment with different tools on the same application, very small chunks. So you can learn it and iterate over time. If you&amp;rsquo;re learning it for work, you&amp;rsquo;ve got this objective that you have to hit, which is we need to be automating something. We need this thing automated. So you&amp;rsquo;re going to have to just automate that as best you can and use AI to generate it if you have to, but then you work back
backwards from, I&amp;rsquo;ve created this thing. Do I understand how it works? If not, I need to go and learn backwards, even to the level of, I don&amp;rsquo;t know what a class is in Java. Go and learn. You have to learn what it is because you&amp;rsquo;re going to have to figure out which bits are important, which bits are not, whether you need a constructor, whether you don&amp;rsquo;t. So you can work backwards. You can read other people&amp;rsquo;s code. That is one of the best ways to learn. Read other people&amp;rsquo;s code.&lt;/p&gt;
&lt;p&gt;If it&amp;rsquo;s on GitHub, download the code, change it, see what breaks. This is how we used to learn in the olden days because you read lots of code because it was in magazines. Then you type some of it in, it would break. So you try and fix it. You can do that now. Lots of people create example code. Very often I&amp;rsquo;ll go and look at people&amp;rsquo;s GitHub repos and you don&amp;rsquo;t critique it and say this is wrong, but AI can do that.&lt;/p&gt;
&lt;p&gt;Examples, you can get AI to go have a look at this code that I&amp;rsquo;ve just written. How could I make that better? Because you&amp;rsquo;re still a junior at this point, it can give you advice, but it&amp;rsquo;s fundamentally about experimenting and finding the right place to experiment. Automating Google is generally not a good way of experimenting because it changes too often. It&amp;rsquo;s not necessarily easy to automate, even though it looks simple, but using all the applications that are designed for that is the way to start.&lt;/p&gt;
&lt;p&gt;So also on test pages, I have a list of other applications. So I&amp;rsquo;m trying to collect not just the stuff that I do or promote stuff that I do. There&amp;rsquo;s about 20 different other test applications listed there that you can use for practicing and use all of them, explore and experiment. I&amp;rsquo;ve got the same thing with the API challenges. So apichallenges.evotest.com, which is an API practice site. And again, that has a list of other APIs that
you can use to practice because when we&amp;rsquo;re learning how to test, we can do whatever we want with the applications that we&amp;rsquo;re paid to test, but you shouldn&amp;rsquo;t be going away and testing Amazon or testing eBay or testing anyone else&amp;rsquo;s site. There are practice sites designed for that. They&amp;rsquo;re designed to gradually make it more complicated so you can actually learn because the real world is complicated and messy and it could be hard to learn in there because you very often you don&amp;rsquo;t know what&amp;rsquo;s going on.&lt;/p&gt;
&lt;p&gt;But now we do have the advantage that AI can, we can use AI to help pinpoint what is going wrong, give me some potential solutions, try them out. They don&amp;rsquo;t work. You could ask a different AI system. I think it&amp;rsquo;s a lot easier now to work much, much faster than it ever was before. Okay. And is it also a good idea to integrate Selenium with the unique test engine from the get go? Yes. I mean, absolutely.&lt;/p&gt;
&lt;p&gt;If you see examples of people using WebDriver or even Playwright from a main method, that&amp;rsquo;s wrong. Unless you&amp;rsquo;re building an application to automate something, that&amp;rsquo;s fundamentally wrong. What we want is a test execution framework like JUnit or TestNG. You could use Playwright if you&amp;rsquo;re using TypeScript or any of the other test execution frameworks. Because you&amp;rsquo;re working in the IDE, you&amp;rsquo;ve got that programming
framework, you can refactor to abstraction layers, put your abstraction, depending on how you structure the project, you could put the abstraction layers in the main package or leave them in the test package. It really depends how you&amp;rsquo;re working. But absolutely. Because it&amp;rsquo;s really important to understand that when you&amp;rsquo;re learning to automate with a coding library, you are learning to code. There&amp;rsquo;s really no difference in using WebDriver.&lt;/p&gt;
&lt;p&gt;As there is using an application that parses XML files. So it&amp;rsquo;s just another library with an API that does something on your behalf. Okay. And earlier you said flaky test doesn&amp;rsquo;t come necessarily from the tool, but mostly from the testers. So what does a good Selenium test look like to you? So if I looked in someone&amp;rsquo;s code and looked at the
so if it was Java, I look in their test class, I look at a method that is annotated with that test, which will execute as a test. I&amp;rsquo;m expecting to see almost no WebDriver API in there. I&amp;rsquo;m expecting everything to be put into some sort of abstraction there. Because otherwise the test is not maintainable. So I&amp;rsquo;m expecting to see standard assertions, which are using either&lt;/p&gt;
&lt;p&gt;J unit assertions or any of the other Java assertion libraries. And I&amp;rsquo;m expecting to see no if statements because generally we don&amp;rsquo;t have conditional work within tests. It is possible to write tests that do that. If you&amp;rsquo;re writing model-based tests, but most of the time we don&amp;rsquo;t. So chances are, if you&amp;rsquo;ve got an if statement in your test, you&amp;rsquo;ve probably, that should probably be an abstraction and you shouldn&amp;rsquo;t see that in your test or you should be writing data-driven
tests that are controlling the data more effectively or setting up better. But the main thing I&amp;rsquo;m looking for is if I&amp;rsquo;m looking at a test for automate something, I probably shouldn&amp;rsquo;t necessarily know which library you&amp;rsquo;re using. Even if you&amp;rsquo;re using Playwright, I would expect most of it to be hidden behind an abstraction layer. I would expect to have to dive into the code a level below the test class to know what libraries you&amp;rsquo;re using.&lt;/p&gt;
&lt;p&gt;How do you view data management? Because I know you also had a tool, created a tool to help generate this. What&amp;rsquo;s best practice for data management? So that&amp;rsquo;s an interesting question. Cause a lot of times when people look at stuff that I create, they go, well, you didn&amp;rsquo;t cover data management or how we set things up. It&amp;rsquo;s like, well, because that&amp;rsquo;s, isn&amp;rsquo;t that obvious? I mean, I thought we knew how to do it. Basically for data management,
when you&amp;rsquo;re creating a test, you&amp;rsquo;re either setting up the data that you need beforehand. And it&amp;rsquo;s going to be in some before method or some test environment set up par and it&amp;rsquo;s going to be coded in there. Or the data that you&amp;rsquo;re using doesn&amp;rsquo;t matter because it&amp;rsquo;s just kind of filler. In which case it probably shouldn&amp;rsquo;t be specified in your test. It should be coming in from some factory. Like when we&amp;rsquo;re learning testing, we experienced
the concept of boundary classes and a boundary class is really a set where it doesn&amp;rsquo;t matter which of these items I use. They should all achieve the same outcome. If we have a boundary class in our automating, we could just put the boundary class in as the value rather than a specific value. It shouldn&amp;rsquo;t really matter. So data management in test is about making the data that is important, obvious, and putting the data that is less important in a factory so that we don&amp;rsquo;t have
to maintain all the time. So we only have one place to maintain it. So if I was automating something and we were creating a user, I would want a factory that creates the user object. Then in my test, I would want to specify, okay, I&amp;rsquo;m creating a user that has a name that&amp;rsquo;s too long. So then I would override the name to be 50 characters, but the rest of the data is unimportant. I don&amp;rsquo;t care what&amp;rsquo;s there and it&amp;rsquo;s coming from the factory, but it&amp;rsquo;s that 50 character name that is there. If it&amp;rsquo;s data management,
if it&amp;rsquo;s data management for environments, then what&amp;rsquo;s hard is are we controlling the conditions that we want to test effectively? So sometimes we&amp;rsquo;ve done a lot of work with unit tests. We&amp;rsquo;ve created a whole bunch of automated execution, but we still want to play in live files to see how the system works because the system is still going wrong.&lt;/p&gt;
&lt;p&gt;So data management is important. This is where it gets hard because you need data that has referential integrity. If you&amp;rsquo;re taking data from live and there&amp;rsquo;s a person&amp;rsquo;s address there, if there&amp;rsquo;s an address checking system in your environment, that address needs to be pre-populated in that address checking system to allow the flow to work. So it&amp;rsquo;s about referential integrity most of the time, making sure that if you&amp;rsquo;re creating a transaction,
that the account already exists before you create the transaction, otherwise it will fail. So you have to understand the scope of what&amp;rsquo;s involved and then set the environment up either ahead of time or immediately before the test. Or if you decide this is too hard to manage, what you do is you take some of the data that&amp;rsquo;s there, but pull out of the environment data that matches the conditions that you want. So if you&amp;rsquo;re
pre-populating your environment from live with data that has been partially anonymized, you may want a customer that has more than a thousand dollars in their bank account, but you find it hard to set that data in advance. You do a query in your environment to find a customer that has that, check all the conditions on there, then pull that back and use that in your test. But that&amp;rsquo;s slightly more advanced. Like most of the time it&amp;rsquo;s about control and it should be fairly
small and isolate control because the test execution flow that we&amp;rsquo;re covering should be fairly small. Okay. Another question for you regarding working with developers. Do you have any advice on how we can work effectively with them versus working by myself, isolated in silo? Like how can we work together as a team? So the way we do that is by working together as a team.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s obvious that I think one of the things that I&amp;rsquo;m concerned about is that I think roles are one of the worst things that we can do to teams where people fit in their role. They only talk to other people in their role. They have little silos and we have teams, but teams are in different buildings because the programmers sit in this building and testers sit in this building. But again, how do you get on with most people?&lt;/p&gt;
&lt;p&gt;Finding some common ground. And hopefully if you&amp;rsquo;re working on a project, part of the common ground is the project. But the more technical that you can, so the easy thing to do is to say, let&amp;rsquo;s put all the hard work on the tester, right? And the tester needs to become interested in programming so that they can talk to developers. They need to understand the technology a bit so that they can talk to the developers about the technology and understand what they&amp;rsquo;re saying.&lt;/p&gt;
&lt;p&gt;There should be some give and take such that the developers know that they&amp;rsquo;re speaking to someone who potentially doesn&amp;rsquo;t understand the technology and can explain it. But sometimes you work on teams where that isn&amp;rsquo;t the case. In which case do the best you can to educate yourself so that you&amp;rsquo;re not talking from a base level of, I don&amp;rsquo;t understand the application. I don&amp;rsquo;t want to understand the application. I&amp;rsquo;m not prepared to learn anything technical about the application. Please tell me everything I need to know.&lt;/p&gt;
&lt;p&gt;Elaborate. So that means everyone is learning a bit of everything else. One of the things I used to do is I used to, if I was on a project and I didn&amp;rsquo;t know the language that they were using, I would try and learn that language. And I would ask the programmers for help in how to learn that language. So if they were using TypeScript, I don&amp;rsquo;t know TypeScript, they&amp;rsquo;re using TypeScript. I&amp;rsquo;ll go and ask, what does this code do? How does this work? Can you help me with this? Or I&amp;rsquo;m looking at the code and I don&amp;rsquo;t
understand it. Can you help me understand it? That&amp;rsquo;s their area of domain knowledge. So they can explain it and they&amp;rsquo;re probably more likely to want to explain it to someone that is making an effort to try and learn. So the main thing is to try and break down the barriers and not let the role get in the way. View them as peers on the team. They&amp;rsquo;re not better than you. They&amp;rsquo;re not worse than you. They&amp;rsquo;re not stupid because they code in mistakes. They have the same time
pressures that you do. So educate them in what you do and how you do it. Learn what they do. Try and pair in both ways. Pair so that you can see the unit testing that they&amp;rsquo;re doing in the coding. Have them pair with you so that they can see the testing that you do. They can see how hard it is to automate if they haven&amp;rsquo;t put the right data IDs on the front end. Like shared pain is a really good way to collaborate.&lt;/p&gt;
&lt;p&gt;And build bridges. Got it. So now that we know what mistakes to avoid and what best practice to adopt, let&amp;rsquo;s talk about what to do to level up. Do you have any resources, books, websites you recommend for a test automation engineer who wants to level up? So all the practice sites are there to help practice. So API challenges has a list of exercises. It&amp;rsquo;s designed so that
if you can do all those challenges in the API challenges, then you probably know how to understand and test APIs. If you could automate everything in test pages, you probably know how to automate. So it&amp;rsquo;s about go through, test these things, experiment with them. And if you spot something that you can&amp;rsquo;t do, that&amp;rsquo;s a gap that we have to learn. Initially use AI, do web searches, do blogs. I mean, I have a huge number of&lt;/p&gt;
&lt;p&gt;YouTube subscriptions and channels that I look at and monitor. I have about, I mean, I had to write tools to help me consume so much information. So I have a podcast subscriber that I&amp;rsquo;ve written that subscribes to about 80 to a hundred podcasts, downloads them, transcribes them, summarizes them. So I can read the transcript and the summary to go through it quickly. And there are other tools out there that you can use. NotebookLM is really good. So if you subscribe
to a whole bunch of channels on YouTube, instead of watching the video, take the video link, paste it into NotebookLM. NotebookLM will pull the transcript back. You can then ask it questions, get summaries. Then you can go and watch the video if it seems something that&amp;rsquo;s useful. So try to do it smart, because we&amp;rsquo;re in the age of AI now. Use the AI tooling to 10X your productivity as much as possible. It&amp;rsquo;s no longer about buying a book, working through that book,
for a year and coming out an expert at the end. It&amp;rsquo;s about incrementally moving forward, taking all the little questions and gap areas, multitasking your learning process to build a model and filling it in as you&amp;rsquo;re going through. So it really just depends on how much time people have got and the objectives they&amp;rsquo;re trying to achieve.&lt;/p&gt;
&lt;p&gt;So today I was working in Python and Java. So I&amp;rsquo;ve got an application that&amp;rsquo;s using a lot of AI stuff. It&amp;rsquo;s in Python. Another one that&amp;rsquo;s written in Java. I quite like Kotlin. So it really depends if you&amp;rsquo;re working. So the best application to learn, the best programming language to learn is the one that&amp;rsquo;s being used in your work. That&amp;rsquo;s absolutely the best, because then you have code that you can look at that is live in production.&lt;/p&gt;
&lt;p&gt;And the libraries that are there, you&amp;rsquo;ve got experts who can help teach you. And the next best language to learn is the one that you see in Java for jobs that you want to do. So then you learn that one, because that might help you get a job or a different job. But then you experiment and you put things on GitHub and you either create your own applications or you automate the existing practice applications.&lt;/p&gt;
&lt;p&gt;So I like things about all the languages and dislike things about all the languages. But I think the main ones to learn at the moment would be a JVM based language, like either Java or Kotlin, a JavaScript language, so either TypeScript or JavaScript, and then a more loose language like Python, possibly Ruby, but it depends on your environment. But you can&amp;rsquo;t really go wrong with Python.&lt;/p&gt;
&lt;p&gt;At the moment, because it&amp;rsquo;s AI based, but I don&amp;rsquo;t think people use it for automating very much. Whereas I think TypeScript and Java, possibly C# are probably the main automating languages. But then you&amp;rsquo;ve got some people going, no, no, we use Python. We use the Python bindings for this. So it really depends. I don&amp;rsquo;t think you can go wrong with TypeScript and Java at the moment. Okay. And for people looking for jobs, for example, do you recommend them building a portfolio?&lt;/p&gt;
&lt;p&gt;And what would you put in it if so? So I would build a portfolio and then I would build a portfolio naturally because I&amp;rsquo;m learning stuff and my portfolio is the results of me having learned something. So at the minimum I would have a GitHub account with some GitHub repos. The issue you always have with a portfolio is you want it to make it look good.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t want it to make you look bad, but the issue you have when you&amp;rsquo;re creating a portfolio is you probably create it when you know the least. So anyone whose experience is going to look at it and it&amp;rsquo;s going to make you look bad. So if you&amp;rsquo;re doing an automation project as part of your portfolio, you shouldn&amp;rsquo;t just leave it as, well, it passes, it automates, it works. You need to then push it a little bit further on GitHub, put it into GitHub actions so that it&amp;rsquo;s running as part of a&lt;/p&gt;
&lt;p&gt;CI/CD process. You want to look at it and go, well, I&amp;rsquo;ve heard about these things called page objects. Can I use page objects? Try and use them in your project. I&amp;rsquo;ve heard about ScreenFlow Power. Can I use it in your project? Get AI to critique your work. Use the static analysis tools, build them into your process, like use linters and use code coverage to make sure you&amp;rsquo;ve got unit tests and things that are there. You want that to be a good development process. It can be small. It could be really small.&lt;/p&gt;
&lt;p&gt;It can only automate a couple of small examples, as long as it&amp;rsquo;s really tight, really good code. If you&amp;rsquo;re learning something and you&amp;rsquo;ve got some good portfolio examples, make the stuff you&amp;rsquo;re learning private until it&amp;rsquo;s good enough to be public. So it really depends how comfortable you are learning in public. I mean, I have stuff, I do have private repos, but it&amp;rsquo;s because there are potentially things I might try and commercialize, but otherwise most of the stuff is public. I mean, I write, I put out videos of me making mistakes
and not knowing stuff because I&amp;rsquo;m learning. And I think it&amp;rsquo;s really important that people see that everyone struggles when they&amp;rsquo;re learning and that we make mistakes. If you only ever see polished content, then you think you&amp;rsquo;re stupid because you&amp;rsquo;re making mistakes, but these people never make any mistakes online. But they&amp;rsquo;ve all made mistakes as they&amp;rsquo;re learning. It&amp;rsquo;s just they might not have learned in public.&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s almost best not to put out, I really believe this, but instead put out, I experimented with this and I achieved this and I learned this and do it as kind of scientific observation as possible. But also that&amp;rsquo;s what we learned in testers when we&amp;rsquo;re writing defect reports, because then we get less pushback. So all the skills that you&amp;rsquo;ve learned in your job use that in your communication.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re trying to get another job. Okay. And beyond what&amp;rsquo;s technical, what other skills should testers focus on? So anything that helps them, I mean, in the back here, this chunk here is filled with Chinese strategic warfare philosophy. Like, so they are of war, martial
techniques, book of five rings, things like that, because strategy is really important. We have to learn how to think in projects to know how best to tackle things. So I learned that from like old Chinese philosophy and up here are kind of modern strategy books, but also down here and down here are books on psychology and communication, because that is something that we have to
do as well. Not just in terms of how we communicate with people, but every application that we work with is a codified result of people communicating to each other. Therefore it&amp;rsquo;s going to be filled with misunderstandings, ambiguities, miscommunications. And a lot of time that&amp;rsquo;s what we do in the testing role is to find those miscommunications that have been
encoded in the application. If we don&amp;rsquo;t know what the miscommunications are in the first place, it&amp;rsquo;s much harder to look for. So psychology is a useful thing to learn. So I try and learn practical psychology by looking at brief therapy type processes and hypnosis. Other people like to look at sociology because they like the kind of group dynamics and the kind of metal models of how people think. So it&amp;rsquo;s really what you&amp;rsquo;re naturally inclined towards. Like even if you were inclined towards physics or chemistry,
or biology, that concept of how do you build an effective experiment is really important because that&amp;rsquo;s what we do when we&amp;rsquo;re testing. So try and find your natural inclinations and map them onto testing. It&amp;rsquo;s a little bit harder to map things like guitar playing and drums, but there will be things that you could impose on there if you were an expert guitarist or drummer.&lt;/p&gt;
&lt;p&gt;So last question for you today. How do you see the future of testing and what will be your final advice for aspiring testers? So the future testing is interesting because it really, at the moment, the thing that&amp;rsquo;s shaken up the world is AI. When you do a lot of coding using AI, you find yourself in the position of a tester and a reviewer naturally. So the more that I&amp;rsquo;m coding with AI,&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not so much the coder anymore. I&amp;rsquo;m the person that is coming up with the requirements, the acceptance criteria. I&amp;rsquo;m checking whether it works. I&amp;rsquo;m hinting, here&amp;rsquo;s the bug. Please go and fix it. So those skills that I&amp;rsquo;ve developed in testing are now really helpful for me coding with AI. And so that&amp;rsquo;s a natural extension. But if you&amp;rsquo;re coding with AI, you need to understand the underlying technology and the programming. Otherwise you can&amp;rsquo;t fix it when it goes wrong.&lt;/p&gt;
&lt;p&gt;And you can&amp;rsquo;t review it. So I think I still believe that the the gamma of software development skills is important, but you don&amp;rsquo;t have to learn them all at once, right? You can pick and choose today. I&amp;rsquo;ll learn a bit of project management today. I&amp;rsquo;ll do some testing. I&amp;rsquo;ll learn some security testing. I&amp;rsquo;ll learn this technology bits and pieces, bring it together. So I guess the best thing to say is don&amp;rsquo;t be so narrowed in on your role.&lt;/p&gt;
&lt;p&gt;That that&amp;rsquo;s all you learn. If you&amp;rsquo;re a tester, don&amp;rsquo;t exclude programming because you don&amp;rsquo;t think that&amp;rsquo;s part of the role. Don&amp;rsquo;t exclude management or product. Take an interest in all these parts to whatever level and try and become a well-rounded software professional.&lt;/p&gt;
&lt;p&gt;Cool. Thank you. Well, good to speak to you. You&amp;rsquo;re welcome. So thank you. So that concludes today&amp;rsquo;s episode. I hope you find today&amp;rsquo;s episode valuable. If you did, please share it with your colleagues and stay tuned for upcoming episodes. We will continue to learn from experts about their favorite testing
tools and tips to become better software testers. So I am Mamadou, and this was how to test this. Thank you again and see you next time. Bye. Bye bye.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Test Interaction with HTML form fields</title>
      <link>https://www.eviltester.com/blog/eviltester/news/html-form-field-testing/</link>
      <pubDate>Thu, 15 Jan 2026 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/news/html-form-field-testing/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; When testing web apps we need to test the interaction between the browser implemented controls and our system. We don&amp;rsquo;t test the browser.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;testing-html-form-fields&#34;&gt;Testing HTML Form Fields&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/_MmW3M_r1Ls&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=_MmW3M_r1Ls&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;h2 id=&#34;testing-web-technology&#34;&gt;Testing Web Technology&lt;/h2&gt;
&lt;p&gt;I like to use the term Technical Testing.&lt;/p&gt;
&lt;p&gt;Many people don&amp;rsquo;t. I think other people view the term as implying that some people are technical and other people are not.&lt;/p&gt;
&lt;p&gt;I use the term to cover &amp;ldquo;Testing which is informed by Technical knowledge&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;So if you&amp;rsquo;re testing a web application, you need to understand web technology, you need technical understanding of how browsers and the web works, otherwise you can&amp;rsquo;t test it effectively.&lt;/p&gt;
&lt;p&gt;In this video I try to explore some of the reasons why this is important.&lt;/p&gt;
&lt;p&gt;If I&amp;rsquo;m testing a web application and it has a form, and in the form is a date field which has a date control calendar pop up which lets me set a date.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.eviltester.com/images/blog/web/date-drop-down.png&#34; alt=&#34;Calendar control image&#34;&gt;&lt;/p&gt;
&lt;p&gt;What should I test?&lt;/p&gt;
&lt;h3 id=&#34;what-should-i-test&#34;&gt;What should I test?&lt;/h3&gt;
&lt;p&gt;Should I test that&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the calendar popup works on mobile and every web browser?&lt;/li&gt;
&lt;li&gt;the calendar control works with keyboard?&lt;/li&gt;
&lt;li&gt;the calendar control correctly switches years and months when I click the control buttons?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, no. Not if the HTML looks like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;input id=&amp;#34;datetime-local-input&amp;#34; 
 type=&amp;#34;datetime-local&amp;#34; name=&amp;#34;datetime-local&amp;#34;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All of the complex UI interaction is implemented by the browser.&lt;/p&gt;
&lt;p&gt;All our application does is use an off-the-shelf browser provided control.&lt;/p&gt;
&lt;h3 id=&#34;do-i-not-test-the-functionality&#34;&gt;Do I not test the functionality?&lt;/h3&gt;
&lt;p&gt;When we are using off-the-shelf controls like this we have to test the interaction between the control and our application.&lt;/p&gt;
&lt;p&gt;If we added JavaScript event listeners to the control to perform extra validation or functionality then&amp;hellip; yes we have to test that.&lt;/p&gt;
&lt;p&gt;If we use the date entered in the control by the user, then we have to test that our application can handle the data supplied by the value of that control.&lt;/p&gt;
&lt;p&gt;If we are not using the date then we should question why we have the control on our application UI.&lt;/p&gt;
&lt;h3 id=&#34;learn-to-spot-technology-risks&#34;&gt;Learn to spot technology risks&lt;/h3&gt;
&lt;p&gt;I can see from the HTML above that there might be an accessibility risk, because I don&amp;rsquo;t see any ARIA attributes associated with that control.&lt;/p&gt;
&lt;p&gt;So we might not have configured the control in the page properly to implement all the accessibility requirements we might want.&lt;/p&gt;
&lt;p&gt;If we had created a custom control, or it is specialised React control, then we do want to test it because we just introduced a technology risk that might impact mobile and different browsers. We might also have functional bugs.&lt;/p&gt;
&lt;p&gt;But if we are using built in browser controls we don&amp;rsquo;t need to test as much functionality related to the control. We need to test the functional interaction with our application and custom code.&lt;/p&gt;
&lt;h3 id=&#34;test-the-domain-configuration&#34;&gt;Test the Domain Configuration&lt;/h3&gt;
&lt;p&gt;We shouldn&amp;rsquo;t spend a long time testing validation messages from custom controls, but if a control has been configured then we need to test that the configuration is correct.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;input id=&amp;#34;password-input&amp;#34; type=&amp;#34;password&amp;#34; name=&amp;#34;password&amp;#34;
 pattern=&amp;#34;^[A-Za-z0-9_]{4,12}$&amp;#34; maxlength=&amp;#34;14&amp;#34; required=&amp;#34;true&amp;#34;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I don&amp;rsquo;t need to test that the password control above shows dots instead of letters and hides the input. But I do need to check that the configuration we supplied for the validation pattern and length are correct. And I need to make sure that the password is actually required (because we configured that it is).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: eagle-eyed readers, who have a technical understanding of how the configuration works will probably have spotted a bug in the above configuration. Yes. We should find that bug in our testing. And we know to look for it because we understand that the control has been configured with our application domain rules, and that&amp;rsquo;s what we are testing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;dont-trust-the-client&#34;&gt;Don&amp;rsquo;t Trust the Client&lt;/h3&gt;
&lt;p&gt;The greater the technical understanding we have of the web technology, the less we will trust any data that the server receives.&lt;/p&gt;
&lt;p&gt;We can edit the DOM to bypass domain configuration.&lt;/p&gt;
&lt;p&gt;We can use JavaScript to enter data that bypasses browser validation.&lt;/p&gt;
&lt;p&gt;We can bypass the browser altogether and just communicate directly with the server.&lt;/p&gt;
&lt;p&gt;A greater technical understanding allows us to understand the risks of the technology more effectively&lt;/p&gt;
&lt;h2 id=&#34;testing-web-apps&#34;&gt;Testing Web Apps&lt;/h2&gt;
&lt;p&gt;All of the examples above are from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com&#34;&gt;testpages.eviltester.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also have a guide to testing HTML elements to describe some of the risks and issues that we might have when using or configuring off-the-shelf HTML fields and elements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/reference/input-elements/&#34;&gt;Testing Input Elements - Notes and Exercises&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had to learn web technologies when testing web applications.&lt;/p&gt;
&lt;p&gt;I have seen people functionally test the browser implemented controls because they didn&amp;rsquo;t learn web technologies.&lt;/p&gt;
&lt;p&gt;This means they wasted time, because they didn&amp;rsquo;t understand the technology they were testing.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>New Version of CounterString Extension</title>
      <link>https://www.eviltester.com/blog/eviltester/news/counterstring-new-version-dec-2025/</link>
      <pubDate>Sun, 04 Jan 2026 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/news/counterstring-new-version-dec-2025/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; Generate CounterStrings, random data from Regex, ranges of data, and strings made by concatenating repeated data.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I released a new version of my CounterString generation Chrome Extension with new features and a new UI.&lt;/p&gt;
&lt;h2 id=&#34;counterstring-extension&#34;&gt;CounterString Extension&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/EXytN-CR7nM&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=EXytN-CR7nM&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;h2 id=&#34;source-and-download-links&#34;&gt;Source and Download Links&lt;/h2&gt;
&lt;p&gt;I have a tool page for the CounterString extension with more details.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.eviltester.com/page/tools/counterstringjs/&#34;&gt;https://www.eviltester.com/page/tools/counterstringjs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But you can find the tool:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eviltester/counterstringjs&#34;&gt;source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/counterstring/keklpkmokeicakpclclkdmclhgkklmbd&#34;&gt;on the chrome store&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I first released the CounterString Extension in 2019 (I think), and at that point it was a simple input field that created a string and added it as a value to the input field.&lt;/p&gt;
&lt;p&gt;Now it can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate CounterStrings&lt;/li&gt;
&lt;li&gt;Configurable length and delimiters&lt;/li&gt;
&lt;li&gt;Generate Random Data From Regex&lt;/li&gt;
&lt;li&gt;Generate Character Ranges&lt;/li&gt;
&lt;li&gt;Repeat text, characters and regex&lt;/li&gt;
&lt;li&gt;Add generated data as value, with input event, to an input field&lt;/li&gt;
&lt;li&gt;Trigger Key events to &amp;rsquo;type&amp;rsquo; the data with configurable speed&lt;/li&gt;
&lt;li&gt;Binary Chop Calculator for field length exploration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of this was a result of migrating code from my Java Test Tool Hub (which I think I worked on about 12 years ago):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eviltester/testtoolhub&#34;&gt;https://github.com/eviltester/testtoolhub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From the Test Tool Hub I took the:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Robot - I had to find a different way of triggering events, but this allows &amp;rsquo;typing&amp;rsquo; the data into the field rather than just amending the value.&lt;/li&gt;
&lt;li&gt;Increased customization of the CounterStrings&lt;/li&gt;
&lt;li&gt;Ranges of Data&lt;/li&gt;
&lt;li&gt;Repeated Data&lt;/li&gt;
&lt;li&gt;Binary Chop Range Calculation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the Data from Regex was repurposing some code from my &lt;a href=&#34;https://anywaydata.com&#34;&gt;AnyWayData.com&lt;/a&gt; test data generator which uses the same JavaScript library to generate data from a Regex - &lt;a href=&#34;http://fent.github.io/randexp.js/&#34;&gt;RandExp&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;counterstrings&#34;&gt;CounterStrings&lt;/h2&gt;
&lt;p&gt;I wrote about &lt;a href=&#34;https://www.eviltester.com/2018/05/counterstring-algorithms&#34;&gt;CounterString Algorithms&lt;/a&gt; in an earlier blog post.&lt;/p&gt;
&lt;p&gt;This extension uses both reverse generation and forward generation.&lt;/p&gt;
&lt;p&gt;I initially learned about CounterStrings from &lt;a href=&#34;https://satisfice.com&#34;&gt;James Bach&lt;/a&gt;. James has a tool called &lt;a href=&#34;https://www.satisfice.com/download/perlclip&#34;&gt;PerlClip&lt;/a&gt; which is a command line tool to generate data directly into the clipboard. This uses a reverse algorithm where the full string is generated and then reversed to paste into a field.&lt;/p&gt;
&lt;p&gt;A forward algorithm allows &amp;rsquo;typing&amp;rsquo; the String character by character without generating the full string first.&lt;/p&gt;
&lt;p&gt;While I don&amp;rsquo;t generate the full String first, I do precompute a Schema which I then follow to generate the String, so it takes about the same processing time, but uses less memory and allows streaming of the result.&lt;/p&gt;
&lt;p&gt;I created a different algorithm this time, which is much simpler to understand, but probably takes longer to execute. I&amp;rsquo;ll need to update the algorithm page at some point, but you can see the algorithm implemented in the source code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eviltester/counterstringjs/blob/master/extension/js/generateSchema.js&#34;&gt;github.com/eviltester/counterstringjs/blob/master/extension/js/generateSchema.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;other-counterstring-tools&#34;&gt;Other CounterString Tools&lt;/h2&gt;
&lt;p&gt;A quick hunt around the web revealed a few more CounterString tools that I don&amp;rsquo;t think I had found all of these before. So these might be interesting for anyone thinking of creating their own implementation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PERL: &lt;a href=&#34;https://www.satisfice.com/download/perlclip&#34;&gt;https://www.satisfice.com/download/perlclip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TYPESCRIPT: &lt;a href=&#34;https://github.com/j19sch/counterstring/&#34;&gt;https://github.com/j19sch/counterstring/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RUBY: &lt;a href=&#34;https://github.com/jamesmartin/counterstring&#34;&gt;https://github.com/jamesmartin/counterstring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JAVA: &lt;a href=&#34;https://github.com/eviltester/testtoolhub&#34;&gt;https://github.com/eviltester/testtoolhub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PYTHON: &lt;a href=&#34;https://github.com/deefex/pyclip&#34;&gt;https://github.com/deefex/pyclip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RUST: &lt;a href=&#34;https://github.com/thomaschaplin/rust-counter-strings&#34;&gt;https://github.com/thomaschaplin/rust-counter-strings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another Chrome Extension:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Pawel-Albert/utilities-for-testing-extension&#34;&gt;https://github.com/Pawel-Albert/utilities-for-testing-extension&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;and some associated Test Pages that I haven&amp;rsquo;t seen before&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pawel-albert.github.io/utilities-for-testing-extension/&#34;&gt;https://pawel-albert.github.io/utilities-for-testing-extension/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Software Testing Podcast - AI Optimism or Pessimism - The Evil Tester Show Episode 029</title>
      <link>https://www.eviltester.com/show/029-ai-optimism-or-pessimism/</link>
      <pubDate>Thu, 18 Dec 2025 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/show/029-ai-optimism-or-pessimism/</guid>
      <description>&lt;p&gt;Rather than retrospect on the year in general. This podcasts looks at how I&amp;rsquo;ve been approaching the learning of AI. Where the industry has gone wrong and what to look forward to with AI.&lt;/p&gt;
&lt;h2 id=&#34;ai-optimism-or-pessimism&#34;&gt;AI Optimism or Pessimism&lt;/h2&gt;
&lt;p&gt;I sat down to think what am I optimistic about, and what am I pessimistic about with the Software Development industry&amp;rsquo;s use of AI.&lt;/p&gt;
&lt;p&gt;I see a lot of positive benefits for AI use in the Software Development Process.&lt;/p&gt;
&lt;p&gt;There are many risks involved with adding AI into products and we should rightly be concerned about those and try to identify how to test AI enabled applications properly.&lt;/p&gt;
&lt;p&gt;Many of the statements concerning how Software Testing has to evolve concern me. e.g. more technical skills,  more focus on risk, point out flaws in process, identify architecture risk. I thought Software Testing already did this. So perhaps one good thing from AI is an evaluation of what part Software Testing plays in the Development Process and what are the fundamental skills and knowledge we need in order to Test software effectively.&lt;/p&gt;
&lt;h2 id=&#34;ai-productivity&#34;&gt;AI Productivity&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m incredibly optimistic about what I can personally do with AI. It&amp;rsquo;s massively increased what I can get done, especially in programming, content creation, and marketing.&lt;/p&gt;
&lt;p&gt;But companies are cutting jobs and blaming AI. But companies have always looked for scapegoats when trimming staff AI is just the latest excuse.&lt;/p&gt;
&lt;p&gt;If leadership truly saw their people as the reason for their growth, they&amp;rsquo;d use AI to amplify productivity and expand the team&amp;rsquo;s capabilities, not use it as a reason to shrink down.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;If companies viewed the staff as a core engine for growth, they wouldn&amp;rsquo;t want to get rid of people when AI comes in. They&amp;rsquo;d want to use AI to make the staff more effective and grow the company. Clearly they don&amp;rsquo;t.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Many management teams see staff as a cost center, not as an engine for growth. Sales gets viewed as the engine of growth and is often paid on commission, so it seems cheap. The product is a &amp;rsquo;thing to be sold&amp;rsquo;. And management&amp;hellip; are always essential.&lt;/p&gt;
&lt;p&gt;Some organizations don&amp;rsquo;t think &amp;ldquo;how do we help our people do more?&amp;rdquo; They take the position: &amp;ldquo;how can we do the same (or less) with fewer people?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;AI is the scapegoat. Not the cause.&lt;/p&gt;
&lt;h2 id=&#34;short-term-pessimism&#34;&gt;Short-Term Pessimism&lt;/h2&gt;
&lt;p&gt;AI is overhyped. Leadership decisions are being made based on hope, not the technology&amp;rsquo;s actual capabilities.&lt;/p&gt;
&lt;p&gt;In the short term, I&amp;rsquo;m a bit pessimistic, not about AI itself, but about how people (management) are choosing to react to it. Too many seem to want to use AI to restrict and constrain, instead of to grow.&lt;/p&gt;
&lt;p&gt;But our work is already changing. New tools exist. We can&amp;rsquo;t afford to be complacent. We need to experiment and figure out where AI makes sense.&lt;/p&gt;
&lt;h2 id=&#34;how-should-we-use-ai&#34;&gt;How Should We Use AI?&lt;/h2&gt;
&lt;p&gt;Not every product needs AI enablement and features. Too much risk, particularly if you do not know how to test the results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I do NOT use AI for direct human-to-human communication.
&lt;ul&gt;
&lt;li&gt;If you get an email from me, I wrote it. If I get one from you, I read it, not an AI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I would not use AI for company procedures or performance reviews.
&lt;ul&gt;
&lt;li&gt;Adding AI to these human, recognition-based workflows is a mistake.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I won’t use AI as a buffer between people.
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t use AI to hide. Engage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do use AI to summarize public podcasts, blog posts, etc, Stuff I choose to consume, but not personal, direct communication.&lt;/p&gt;
&lt;p&gt;Management is about people, and putting an AI buffer between you and your team leads to bad communication and alienation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Your boss should already know what you&amp;rsquo;re doing. They should be helping you explain the value that you&amp;rsquo;ve added. This is a human process of recognizing value. It&amp;rsquo;s not something that we add AI into the middle of.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;how-i-learned-ai&#34;&gt;How I learned AI&lt;/h2&gt;
&lt;p&gt;When I started playing with AI, I created a podcast summarizer. My process for learning anything new is to find a project and use the new technology to build something.&lt;/p&gt;
&lt;p&gt;I wanted to consume more podcasts but couldn’t keep up. So, I wrote a tool using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hugging Face libraries&lt;/li&gt;
&lt;li&gt;Whisper AI for transcription&lt;/li&gt;
&lt;li&gt;Different LLM models for summarization&lt;/li&gt;
&lt;li&gt;Prompt engineering&lt;/li&gt;
&lt;li&gt;Ollama for running models locally&lt;/li&gt;
&lt;li&gt;OpenRouter for connecting to cloud-based models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I did everything locally as much as possible, partly to learn the limits before relying on cloud or paid models. Only after learning the limits did I see real value in some of the paid services.&lt;/p&gt;
&lt;p&gt;Don’t believe in &amp;lsquo;magic&amp;rsquo; from big models until you know what smaller, free models can actually do.&lt;/p&gt;
&lt;h2 id=&#34;step-by-step-adoption&#34;&gt;Step By Step Adoption&lt;/h2&gt;
&lt;h3 id=&#34;step-1-chat-interfaces&#34;&gt;Step 1: Chat Interfaces&lt;/h3&gt;
&lt;p&gt;At first, I used AI the same way most people, from a chat interface, like ChatGPT or Claude. It worked but had limits. I wanted something embedded into my IDE.&lt;/p&gt;
&lt;h3 id=&#34;step-2-embedding-into-the-ide&#34;&gt;Step 2: Embedding into the IDE&lt;/h3&gt;
&lt;p&gt;Now, I use a plugin called &lt;a href=&#34;https://continue.dev/&#34;&gt;Continue&lt;/a&gt;, which works in both IntelliJ and Visual Studio Code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initially connected to Ollama (local code models)&lt;/li&gt;
&lt;li&gt;Later I Switched to OpenRouter for bigger cloud models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now, I can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jump into a chat interface via my IDE&lt;/li&gt;
&lt;li&gt;Still use chatbots like Claude/ChatGPT for generic things&lt;/li&gt;
&lt;li&gt;Never look at Stack Overflow anymore, everything&amp;rsquo;s in the IDE chat&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-3-agentic-coding&#34;&gt;Step 3: Agentic Coding&lt;/h3&gt;
&lt;p&gt;I started using agentic tools, like OpenCode, on the command line. They can scan my whole codebase, not just what&amp;rsquo;s open in the IDE.&lt;/p&gt;
&lt;p&gt;I use it to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a page object model for a URL&lt;/li&gt;
&lt;li&gt;Write a test for that model&lt;/li&gt;
&lt;li&gt;Generate K6 Scripts&lt;/li&gt;
&lt;li&gt;Create swagger files&lt;/li&gt;
&lt;li&gt;Write scripts&lt;/li&gt;
&lt;li&gt;Write API Abstractions&lt;/li&gt;
&lt;li&gt;&amp;hellip; so much&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now instead of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Writing the test&lt;/li&gt;
&lt;li&gt;Building abstractions and models manually&lt;/li&gt;
&lt;li&gt;Iteratively improving&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I let the AI generate code, then I come in and change or adapt what I need.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I&amp;rsquo;m using it as a tool to help me create things faster. Then I come in and use my knowledge and experience to review the code or expand it.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;step-4-openspec-for-better-requirements&#34;&gt;Step 4: OpenSpec for Better Requirements&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Fission-AI/OpenSpec&#34;&gt;OpenSpec&lt;/a&gt; helps generate and maintain evolving and up to date requirements documentation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specs are continuously updated as requirements change&lt;/li&gt;
&lt;li&gt;OpenCode has documentation to work from, in addition to my prompts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I use OpenSpec, I&amp;rsquo;m letting the Agentic Coding Assistant write even more code, than when I use it iteratively at the CLI.&lt;/p&gt;
&lt;p&gt;This has helped me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;write a new application faster&lt;/li&gt;
&lt;li&gt;Keep requirements and documentation in sync&lt;/li&gt;
&lt;li&gt;Automate coverage incrementally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m not sure how well it would scale to a full team, but it works well for a solo dev.&lt;/p&gt;
&lt;p&gt;But&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI sometimes makes strange design choices&lt;/li&gt;
&lt;li&gt;If you don&amp;rsquo;t review and refactor, your codebase can fall apart fast&lt;/li&gt;
&lt;li&gt;Human review is still necessary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI saves time, but still requires fundamental core skills to evaluate their output and fix them when they go wrong.&lt;/p&gt;
&lt;p&gt;I use AI for programming all the time, but not for actual testing.&lt;/p&gt;
&lt;h2 id=&#34;agentic-ai-in-testing&#34;&gt;Agentic AI in Testing&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m beginning to look into Agentic AI tools specifically designed for testing.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m currently experimenting with AQE Fleet from &lt;a href=&#34;https://www.linkedin.com/in/dragan-spiridonov/&#34;&gt;Dragan Spiridonov&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/proffesor-for-testing/agentic-qe&#34;&gt;https://github.com/proffesor-for-testing/agentic-qe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://forge-quality.dev/&#34;&gt;https://forge-quality.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pros-and-cons&#34;&gt;Pros and Cons&lt;/h2&gt;
&lt;p&gt;Right now, I am optimistic about AI empowering individual development team members. It makes us faster, and the tools are getting better.&lt;/p&gt;
&lt;p&gt;But I am pessimistic about the way companies choose to adapt to AI. Focus on headcount reduction instead of increased effectiveness and growth.&lt;/p&gt;
&lt;h2 id=&#34;what-is-testing&#34;&gt;What is Testing?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I keep seeing posts that testers need to evolve into quality engineers and risk analysts and customer experience advocates because we&amp;rsquo;ll be reviewing the systems for risk more than we&amp;rsquo;re and testing them&amp;hellip; but I thought we already did those things.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;People keep saying testers now need to be risk analysts, customer experience advocates, technical experts, etc. But that&amp;rsquo;s what good testers have always done. It almost feels like AI is forcing companies to rediscover what software testing really is, and always has been.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Free Technical Web Testing Course Released To Youtube</title>
      <link>https://www.eviltester.com/blog/eviltester/news/free-technical-web-testing-course/</link>
      <pubDate>Thu, 18 Dec 2025 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/news/free-technical-web-testing-course/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; Technical Web Testing course has been released to YouTube as a 6 hour video.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;free-technical-web-testing-101-course&#34;&gt;Free Technical Web Testing 101 course&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/jWwfMo5Ziz0&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=jWwfMo5Ziz0&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Slides etc. can be found via the &lt;a href=&#34;https://www.eviltester.com/page/onlinetraining/techwebtesting101/&#34;&gt;course page&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;practice-sites-now&#34;&gt;Practice Sites Now&lt;/h2&gt;
&lt;p&gt;The sites I use in the course are a little old.&lt;/p&gt;
&lt;p&gt;If you want to practice with the techniques in the course then I maintain lists of sites to practice with here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/reference/other-sites/&#34;&gt;https://testpages.eviltester.com/reference/other-sites/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://apichallenges.eviltester.com/practice-sites&#34;&gt;https://apichallenges.eviltester.com/practice-sites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;course-history&#34;&gt;Course History&lt;/h2&gt;
&lt;p&gt;The course was created in 2013 or 2014. Originally as a free course, then I added a bunch of content and it turned into 6 hours plus 3 hours of additional webinar content.&lt;/p&gt;
&lt;p&gt;Every course provider I hosted it on has changed terms and conditions multiple times making it painful to maintain and support.&lt;/p&gt;
&lt;p&gt;Since the examples and videos are now showing their age, and one course provider changed their terms and conditions so much that I now no longer have access to their course platform and can&amp;rsquo;t support it.&lt;/p&gt;
&lt;p&gt;I decided to make the course free.&lt;/p&gt;
&lt;p&gt;The course is too big to make free on Udemy so I&amp;rsquo;ve combined all the videos into one and made them free on Youtube.&lt;/p&gt;
&lt;p&gt;Thanks to everyone who supported the course over the years.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>An overview of the Basic Shopping Cart Practice Web Page</title>
      <link>https://www.eviltester.com/blog/eviltester/testpages/basic-shopping-cart/</link>
      <pubDate>Mon, 15 Dec 2025 11:19:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/testpages/basic-shopping-cart/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; an overview of the basic shopping cart that you can use to explore, automate through the UI or REST API and perform security testing on.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Shopping Cart Application offers a lot of possibility for testing due to the multi-state and multi-page nature. With the added bonus of a REST API which is documented using OpenAPI spec there are even more ways to interact with it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/apps/basiccart/&#34;&gt;Find the Shopping Cart Application Here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;overview-video&#34;&gt;Overview Video&lt;/h2&gt;
&lt;p&gt;The video provides an overview of the shopping cart:&lt;/p&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/KrpD5RtmDb0&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=KrpD5RtmDb0&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;h2 id=&#34;shopping-carts-for-practicing&#34;&gt;Shopping Carts for Practicing&lt;/h2&gt;
&lt;p&gt;This is not the first Shopping Cart practice Application.&lt;/p&gt;
&lt;p&gt;I know of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.saucedemo.com/&#34;&gt;SwagLabs&lt;/a&gt; Saucelabs demo application.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://practicesoftwaretesting.com/&#34;&gt;Toolshop&lt;/a&gt; from  this has &lt;a href=&#34;https://testsmith.ams3.cdn.digitaloceanspaces.com/artifacts/practicesoftwaretesting-bookmarks.html&#34;&gt;multiple versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://automationintesting.online/&#34;&gt;Restful Booker&lt;/a&gt; could be classed as a shopping cart&lt;/li&gt;
&lt;li&gt;and my &lt;a href=&#34;https://testpages.eviltester.com/apps/basiccart/&#34;&gt;Basic Shopping Cart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SwagLabs is pure JavaScript so there are no HTTP calls, but you can explore and test the interaction with local browser storage, and the various users that you can login with change the display so you can use it for visual testing and admin access.&lt;/p&gt;
&lt;p&gt;Toolshop, Restful Booker and my Shopping Cart all have APIs and the data is cleared regularly. I think Restful Booker clears data every 15 minutes. Shopping Cart clears data on a rolling basis by limiting the amount stored, so if there are a lot of users at any one time (about 200+), you might notice your old orders clearing from the backend.&lt;/p&gt;
&lt;p&gt;When I was designing the Basic Shopping Cart I very deliberately chose to make sure that there was no possible way of having any PI data in the system. This meant that the checkout process does not ask for email addresses, credit card details, or even passwords. The users are &amp;lsquo;canned&amp;rsquo; with pre-defined passwords. This means you can perform security testing without any issues.&lt;/p&gt;
&lt;p&gt;Really you shouldn&amp;rsquo;t add any PI data to any testing practice site, but when applications use forms, the auto-complete might be switched on, and your details might be auto-populated into the form.&lt;/p&gt;
&lt;p&gt;I do like the other Shopping Carts and have used all of them when practicing my testing.&lt;/p&gt;
&lt;h2 id=&#34;why-a-shopping-cart&#34;&gt;Why A Shopping Cart?&lt;/h2&gt;
&lt;p&gt;Shopping Cart applications offer a lot of scope.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There tend to be multiple pages offering navigation scope.&lt;/li&gt;
&lt;li&gt;Pagination if there are enough products.&lt;/li&gt;
&lt;li&gt;API and server side interaction.&lt;/li&gt;
&lt;li&gt;Checkout Process has state - tracked locally via cookies or browser storage, and possibly server side as well. Having state in two places offers scope for state moving out of sync and creating mismatch between server and client.&lt;/li&gt;
&lt;li&gt;Usually a registration or login process. Which also lends itself to security testing.&lt;/li&gt;
&lt;li&gt;Tend to be content rich.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Content rich applications are interesting. The first time we automate them we tend to hard code product names and ids. Then we realise that there is usually a CMS (Content Management System), and users can edit content, which then causes our automated execution to fail.&lt;/p&gt;
&lt;p&gt;This might lead us to using the API and UI as a consistency Oracle for content. Does the API serve data consistently. Is the data rendered correctly. So we don&amp;rsquo;t automate or test exclusively through the UI, we use the UI and API in combination when we want to assert on data conditions.&lt;/p&gt;
&lt;h2 id=&#34;creation-of-the-shopping-cart&#34;&gt;Creation of the Shopping Cart&lt;/h2&gt;
&lt;p&gt;To build the application I started API first. The API was completely hand coded. This meant that I could test the flows and the functionality before spending any time on the UI. I was able to experiment with various authentication flows and data representations until I had one that I thought was rich enough and removed any PI risks.&lt;/p&gt;
&lt;p&gt;Once I had the backend covered I used &lt;a href=&#34;https://opencode.ai/&#34;&gt;OpenCode&lt;/a&gt; to incrementally add basic REST API automated coverage, and then expanded the coverage.&lt;/p&gt;
&lt;h2 id=&#34;frond-end-creation&#34;&gt;Frond End Creation&lt;/h2&gt;
&lt;p&gt;I wanted the front-end to be simple JavaScript, HTMl and CSS, and avoid the use of frameworks.&lt;/p&gt;
&lt;p&gt;My Test Applications are designed to be entry points. They will be challenging enough naturally, so I didn&amp;rsquo;t want to clutter the learning effort for people practicing by using React.&lt;/p&gt;
&lt;p&gt;The Front End was creating by prompting through OpenCode and then I would amend and refactor where necessary. This allowed me to create the front-end quickly. But because I prompt in very small increments the code is more closely aligned with the style of coding I use, and makes it easier for me to amend in the future.&lt;/p&gt;
&lt;p&gt;The models used were spread across free models from &lt;a href=&#34;https://opencode.ai/zen&#34;&gt;OpenCode Zen&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grok Code Fast 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or I used &lt;a href=&#34;https://openrouter.ai/kwaipilot/kat-coder-pro:free&#34;&gt;Kat Coder Pro (free)&lt;/a&gt; on OpenRouter.&lt;/p&gt;
&lt;p&gt;I try to use a mix of models in the CLI, and then a different set of models in the IDE. In the IDE I have &lt;a href=&#34;https://continue.dev/&#34;&gt;Continue&lt;/a&gt; configured to use OpenRouter models.&lt;/p&gt;
&lt;h2 id=&#34;creating-content&#34;&gt;Creating Content&lt;/h2&gt;
&lt;p&gt;Al the content was generated via AI tooling.&lt;/p&gt;
&lt;p&gt;I prompted GTP-OSS-20B via OpenRouter to create 100 &amp;rsquo;thing&amp;rsquo; name variations. I fed it the sample &amp;rsquo;thingy&amp;rsquo; words and adjectives. I could have varied this more, and I could easily have used a normal combinatorial algorithm to do this but the AI interface was fast enough.&lt;/p&gt;
&lt;p&gt;With a set of 100 names, I then asked for one line descriptions, using the same process. The are all output as JSON to make it easy for me to amend in the code.&lt;/p&gt;
&lt;p&gt;Since this data is &amp;lsquo;content&amp;rsquo; I can vary it over time. For the first release I just need 100 different products to add to the product list.&lt;/p&gt;
&lt;h2 id=&#34;creating-product-images&#34;&gt;Creating Product Images&lt;/h2&gt;
&lt;p&gt;Generating the images was a little more interesting.&lt;/p&gt;
&lt;p&gt;I am deliberately trying to keep my AI cost as low as possible to see how far I can push my use of AI with minimal cost.&lt;/p&gt;
&lt;p&gt;My biggest cost on OpenRouter was using Nano Banana to create 2 experimental images when it was first released. The Nano Banana images cost 50c each and they didn&amp;rsquo;t end up the way I wanted. This was not an experiment I wanted to repeat with the product images. I&amp;rsquo;d need at least 100 and I might want to regenerate them if they didn&amp;rsquo;t work out.&lt;/p&gt;
&lt;p&gt;First I tried image generation models through the local install of &lt;a href=&#34;httpsL//localai.io&#34;&gt;localai.io&lt;/a&gt; but I don&amp;rsquo;t think my machine is powerful enough. The process was slow and the output was basically a random png and completely unsuitable.&lt;/p&gt;
&lt;p&gt;Rather than spend another couple of hours experimenting to improve this, I decided to try one of the image models on OpenRouter. These are easy to automate but past experience made me hesitant. However, as I was looking at the costs I noticed that the image pricing was quite cheap for one of the models, but this was only shown in the comparison page.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://openrouter.ai/compare/openai/gpt-5-image-mini/google/gemini-3-pro-image-preview&#34;&gt;https://openrouter.ai/compare/openai/gpt-5-image-mini/google/gemini-3-pro-image-preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPT 5 Image Mini was estimated at $0.002 per K generated.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t expect to have good results with this but I tried it through a simple prompt and was surprised at the image quality.&lt;/p&gt;
&lt;p&gt;It took me about 20 minutes to write code to call the API and experiment with prompts. This led to some good random product images and they were about $0.007 per image, so I could generate 100 images for about $0.70.&lt;/p&gt;
&lt;p&gt;I used the product descriptions generated earlier and fed them through into OpenRouter with my script to generate the images you can see in the product pages.&lt;/p&gt;
&lt;h2 id=&#34;generating-image-descriptions&#34;&gt;Generating Image Descriptions&lt;/h2&gt;
&lt;p&gt;Rather than use Lorem Ipsum I wanted to generate fanciful and long descriptions for each of the products.&lt;/p&gt;
&lt;p&gt;I wanted to use AI to generate a fuller paragraph style description of each product.&lt;/p&gt;
&lt;p&gt;I found that the lava:7b model will run nicely on Ollama locally and it is very small. It has vision capabilities, so it can read images.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ollama.com/library/llava:7b&#34;&gt;https://ollama.com/library/llava:7b&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It only consumes about 5gb when running so it fits comfortably in my GPU memory.&lt;/p&gt;
&lt;p&gt;I used this via api calls to describe each of the images in turn. I was very surprised at the quality of the descriptions when running locally.&lt;/p&gt;
&lt;p&gt;This worked out well enough for my experiment and in total cost around $0.70 to generate and describe 100 images.&lt;/p&gt;
&lt;p&gt;I thought that 100 was enough to allow pagination experiments and build on over time.&lt;/p&gt;
&lt;p&gt;In total to do all this programmatically took about an hour to write code and 4 hours to run.&lt;/p&gt;
&lt;p&gt;I think it would probably have taken longer for me to search the web, find a tool to do all this, if a single tool even existed at all.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tool Vendors Take Note: it is becoming easier and easier for people to create their own tooling, cheaply and with the exact functionality they need.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;automating-the-web-ui&#34;&gt;Automating the Web UI&lt;/h2&gt;
&lt;p&gt;I used OpenCode to generate the Page Object Models and an initial set of coverage, I then amended and refactored to expand the coverage as I required.&lt;/p&gt;
&lt;p&gt;This has become my normal approach to generating automated execution code now. This is also different from the way I code manually.&lt;/p&gt;
&lt;p&gt;When coding manually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I write the test first,&lt;/li&gt;
&lt;li&gt;and grow the Page Object Model organically through refactoring,&lt;/li&gt;
&lt;li&gt;this way I only create the abstraction code that I need in the test.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When coding with AI, I reverse this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I generate the Page Object
&lt;ul&gt;
&lt;li&gt;I give OpenCode access to the Chrome Dev Tools MCP so that it can read the DOM and it generates accurate locators.
Sometimes I refine them, but they are usually good enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;During the Page Object creation, in the same prompt I ask for
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;A set of basic tests which use the Page Object Model methods to cover the basic functionality. Do not test the Page Object, use the Page Object to avoid putting any locators for &amp;lsquo;driver.&amp;rsquo; methods in the test code.&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I then review and refactor.&lt;/li&gt;
&lt;li&gt;Then I iteratively expand with small prompts, targeting specific coverage with each prompt.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve found this works well, avoids rework and is fast.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;automating-the-rest-api&#34;&gt;Automating the REST API&lt;/h2&gt;
&lt;p&gt;I prompted OpenCode to read the routing code that I had written in Java for the API and create basic coverage for the each of the API end points in turn. This led to the creation of the payload objects and incrementally build up an API abstraction.&lt;/p&gt;
&lt;p&gt;By targeting each endpoint individually I could gradually grow the code, keep control of it, make sure it was using my style of coding and automating and didn&amp;rsquo;t need a lot of refactoring later.&lt;/p&gt;
&lt;p&gt;I then prompted to recreate the UI automated execution flows using only the API abstractions that I had just built up.&lt;/p&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;p&gt;The general rule we are told is that you test first, then automate. You can see from the above description that I do not abide by this rule.&lt;/p&gt;
&lt;p&gt;I used the automated coverage to handle the basic flows and flush out any simple errors. This creates an automated safety net that can help me when I&amp;rsquo;m fixing any issues that I find from testing. Without the basic automated coverage I might introduce more errors when fixing bugs than I remove.&lt;/p&gt;
&lt;p&gt;Testing was performed via exploration using Chrome, heavily reliant on the dev tools and viewing requests in BurpSuite.&lt;/p&gt;
&lt;p&gt;I then moved on to testing the REST API directly.&lt;/p&gt;
&lt;p&gt;This helps me build up a list of issues, some of which I fix, but since it is a testing app, some of them I don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;The automated coverage tells me that it can work. My testing convinces me where it fails to work.&lt;/p&gt;
&lt;h2 id=&#34;security-testing&#34;&gt;Security Testing&lt;/h2&gt;
&lt;p&gt;I coded in some security issues, so I made sure to test these.&lt;/p&gt;
&lt;p&gt;I used Bruno as my API client to explore all these issues.&lt;/p&gt;
&lt;p&gt;Some of them I removed because they would be annoying to the user if exploited when they were trying to test the application, so they are primarily information leakage rather than amendment. But&amp;hellip; it might be possible if you test deep enough.&lt;/p&gt;
&lt;p&gt;The only tool used during this process was Bruno to issue requests.&lt;/p&gt;
&lt;h2 id=&#34;performance-testing&#34;&gt;Performance Testing&lt;/h2&gt;
&lt;p&gt;I didn&amp;rsquo;t want to go live with the cart unless I could convince myself that it could handle multiple users.&lt;/p&gt;
&lt;p&gt;I used OpenCode to convert my API automated execution scenarios into &lt;a href=&#34;https://k6.io/&#34;&gt;K6&lt;/a&gt; scripted scenarios such that I could scale Virtual Users and hit the application functionality.&lt;/p&gt;
&lt;p&gt;I do not recommend the Shopping Cart as a target for performance testing, that isn&amp;rsquo;t what it is designed for.&lt;/p&gt;
&lt;p&gt;Butch Mayhew maintains a list of sites designed for practicing Performance testing against in his &lt;a href=&#34;https://github.com/BMayhew/awesome-sites-to-test-on?tab=readme-ov-file#performance-testing&#34;&gt;Awesome Sites To Test On&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Two from Blazemeter and one from OctoPerf:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.demoblaze.com/&#34;&gt;BlazeMeter Demo Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blazedemo.com/index.php&#34;&gt;BlazeMeter Simple Travel Agency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://petstore.octoperf.com/actions/Catalog.action&#34;&gt;Octoperf Pet Store Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This took me about an hour in total, because I had to fix a couple of errors in the generated k6 script, but I think using OpenCode saved me a couple of hours since I&amp;rsquo;m not a K6 expert and have to re-learn it every time I use it.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Software Testing Podcast - BrowserStack Community QnA - The Evil Tester Show Episode 028</title>
      <link>https://www.eviltester.com/show/028-browserstack-qna/</link>
      <pubDate>Fri, 12 Dec 2025 09:00:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/show/028-browserstack-qna/</guid>
      <description>&lt;p&gt;The answers given during an AMA session held on Discord on the 11th of December 2025, following a live LinkedIn video stream. The session focused on &amp;ldquo;Mastering Automatability for Test Automation&amp;rdquo;. The main theme is the concept of Automatability, which I view as &lt;strong&gt;the ability to automate&lt;/strong&gt;, this personal skill is more critical than reliance on specific tools. The discussion covers various topics, including how to separate automation problems from application design issues, dealing with slow UIs and non-automation friendly third-party widgets, evaluating automation readiness, and addressing common architectural failings related to large-scale UI automation.&lt;/p&gt;
&lt;h2 id=&#34;discord-and-linkedin&#34;&gt;Discord And LinkedIn&lt;/h2&gt;
&lt;p&gt;This was a Browserstack hosted event. The initial Q&amp;amp;A session started on Linkedin with a conversation between Alan Richardson and David Burns.&lt;/p&gt;
&lt;p&gt;Recording can be found here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/events/7404135559247343616/&#34;&gt;LinkedIn Event&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The session then moved to Discord. The Browserstack discord has many AMA and interviews so is worth signing up to have a look at.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://discord.com/channels/1290239387031961602/1389791860116951100/threads/1447958914791637012&#34;&gt;the Browserstack Knowledge-hub forum on Discord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://discord.com/channels/1290239387031961602/1447958914791637012&#34;&gt;Alan Richardson AMA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other AMA sessions include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://discord.com/channels/1290239387031961602/1431252937102987274&#34;&gt;Jason Huggins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://discord.com/channels/1290239387031961602/1426181624038690857&#34;&gt;Gil Zilberfeld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://discord.com/channels/1290239387031961602/1415293533090222163&#34;&gt;Testers&amp;rsquo;s Day Panel with Vikas Mittal, Jenna Charlton and Manish Saini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Join the BrowserStack Community on Discord and discover many more sessions, videos and conversations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.browserstack.com/community&#34;&gt;https://www.browserstack.com/community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;qa-session-questions-and-summaries&#34;&gt;Q&amp;amp;A Session Questions and Summaries&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve listed the questions and summary answers. Full answers can be found in the podcast, audio or video, or on the &lt;a href=&#34;https://discord.com/channels/1290239387031961602/1447958914791637012&#34;&gt;Discord AMA chat&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;qa-1-understanding-automatability-for-a-first-automation-framework&#34;&gt;Q&amp;amp;A 1: Understanding Automatability for a First Automation Framework&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; If I&amp;rsquo;m building my first test automation framework, what&amp;rsquo;s the one thing about automatability I should understand?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most important thing to understand is that automatability refers to &lt;strong&gt;your ability to automate&lt;/strong&gt;. By having a strong ability to automate, you become less dependent on specific tools, making it easier to create workarounds and choose from multiple tools. Developing experience in how to automate allows you to succeed more often, and means you are not reliant on a tool interacting with your system, which makes workarounds harder. Automating is fundamentally about your understanding of &lt;em&gt;what&lt;/em&gt; and &lt;em&gt;how&lt;/em&gt; to automate, and practicing the application of that ability.&lt;/p&gt;
&lt;h3 id=&#34;qa-2-separating-automation-problems-from-application-design-problems&#34;&gt;Q&amp;amp;A 2: Separating Automation Problems from Application Design Problems&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How do you separate automation problems from application design problems?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If an issue causes problems when you are automating, I would call it an &lt;strong&gt;automation problem&lt;/strong&gt;. While this problem might be &lt;em&gt;triggered&lt;/em&gt; by an application design problem (such as a state-based system that is hard to track, or features that are harder to automate), the issue itself remains distinct. If the team cannot change the application design, they must figure out how to automate the application as it is. This might involve absorbing the issue, figuring out how to automate it at a different level (not end-to-end), or handling it through testing processes using observability tools like DataDog.&lt;/p&gt;
&lt;h3 id=&#34;qa-3-slow-uis-and-testabilityautomatability&#34;&gt;Q&amp;amp;A 3: Slow UIs and Testability/Automatability&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; When dealing with slow UIs is the slowness a testability issue an automatability issue or both?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Slowness is likely &lt;strong&gt;both, and more&lt;/strong&gt;, because it is also a usability/user experience issue. If the slow UI impacts the user experience, it is more likely to be addressed than if it only impacts testing or automation. In cybernetics terms, testers or automators must possess the &amp;ldquo;requisite variety&amp;rdquo; to handle the variety (slowness) in the system being tested, which means knowing how to synchronize or potentially cleaning the environment to improve speed. The focus would be on the &lt;em&gt;impact&lt;/em&gt; of the slowness, rather than the slowness itself, and whether the team or its tools can absorb the variation in response times.&lt;/p&gt;
&lt;h3 id=&#34;qa-4-handling-non-automation-friendly-third-party-widgets&#34;&gt;Q&amp;amp;A 4: Handling Non-Automation Friendly Third-Party Widgets&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How do you handle third party widgets like payment gateways that are inherently not automation friendly?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If a third-party widget is &amp;ldquo;not automation friendly&amp;rdquo; for one tactic (e.g., UI automation), it might become easier to automate by adopting different tactics, such as issuing HTTP requests using cookies collected from the UI. Teams may not need to automate the full flow of the widget, but instead focus on ensuring the widget is &lt;strong&gt;wired up correctly&lt;/strong&gt; within their own application. This can involve only testing partway through the flow, or using a mock or stub in the environment so that the full widget flow doesn&amp;rsquo;t need to be tested constantly.&lt;/p&gt;
&lt;h3 id=&#34;qa-5-evaluating-automation-readiness-and-consultancy-frameworks&#34;&gt;Q&amp;amp;A 5: Evaluating Automation Readiness and Consultancy Frameworks&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How do you evaluate an application&amp;rsquo;s automation readiness during consulting? Do you follow a framework?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I do &lt;strong&gt;not&lt;/strong&gt; use a formal consulting frameworks. The closest methodology used is the meta model from Neuro-Linguistic Programming, which involves asking questions to build a model of the client&amp;rsquo;s environment and processes, comparing it to the reality they face.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.eviltester.com/nlp-for-testers/&#34;&gt;learn more about NLP and Testing&lt;/a&gt; in this paper I wrote.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regarding automation readiness, an application is considered ready to automate &amp;ldquo;as soon as someone wants to automate it&amp;rdquo;. Readiness is judged by whether the client is prepared to &lt;strong&gt;commit to whatever it takes&lt;/strong&gt; to automate the application at that specific point in time to achieve their desired outcomes, regardless of the application&amp;rsquo;s current state.&lt;/p&gt;
&lt;h3 id=&#34;qa-6-architectural-patterns-failing-in-large-scale-ui-automation&#34;&gt;Q&amp;amp;A 6: Architectural Patterns Failing in Large-Scale UI Automation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; What architectural patterns do you see repeatedly failing when it comes to large scale UI automation?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Recurring issues often stem from the team lacking the &lt;em&gt;ability to automate&lt;/em&gt; and consequently blaming the tool for problems, rather than creating necessary workarounds. Common process anti-patterns, not strictly architectural patterns, include deploying differently into test and production environments (not using the same install process).&lt;/p&gt;
&lt;p&gt;A major failure point is &lt;strong&gt;test data maintenance&lt;/strong&gt;, especially trying to use production data or any data that the team does not control. Automating against specific data conditions without control over that data causes random test failures. This can be worked around by hardcoding tests against data &lt;em&gt;conditions&lt;/em&gt; instead of specific data, and dynamically selecting the required data during execution.&lt;/p&gt;
&lt;h3 id=&#34;qa-7-prioritizing-testability-and-automation-in-sprint-planning&#34;&gt;Q&amp;amp;A 7: Prioritizing Testability and Automation in Sprint Planning&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; If testability improves debugging and automation improves scale, how do we prioritize them during sprint planning?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Prioritization can be based on &lt;strong&gt;what the team wants to achieve&lt;/strong&gt; (the outcomes) by the end of the sprint, specifically focusing on the expected coverage from testing and automation. It is beneficial to plan for features that need extensive testing to be delivered early in the sprint. Ideally, testing and automating occur in parallel, and teams automate at lower levels (like unit level) to reduce the necessary coverage at the higher UI level. Issues often arise when teams are divided into isolated roles, creating process problems that hinder effective interaction and prioritization.&lt;/p&gt;
&lt;h3 id=&#34;qa-8-playwright-and-the-illusion-of-reduced-automatability-design-needs&#34;&gt;Q&amp;amp;A 8: Playwright and the Illusion of Reduced Automatability Design Needs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; Do modern frameworks like Playwright reduce the need for high automatability design or is that an illusion?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is an &lt;strong&gt;illusion&lt;/strong&gt;. Frameworks like Playwright are designed to absorb application variability through features like retry mechanisms (for synchronization) and locator strategies (like visible text), which reduces the need for constant notification when minor changes occur. This absorption capability makes Playwright effective for agent-based automation where the goal is checking an end-to-end path and the final result.&lt;/p&gt;
&lt;p&gt;However, this absorption can hide issues that a team might want exposed. Even when using Playwright, developers must still understand how to automate and structure their code using abstraction layers (like page objects, domain objects) to ensure long-term maintainability and efficiency.&lt;/p&gt;
&lt;h3 id=&#34;qa-9-explaining-automatability-as-an-investment-to-leadership&#34;&gt;Q&amp;amp;A 9: Explaining Automatability as an Investment to Leadership&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How do I explain to leadership that improving automatability is an investment not a delay?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The explanation depends on what is being improved. If improving automatability means increasing the team&amp;rsquo;s ability to automate, it can be presented as an &lt;strong&gt;investment in staff training&lt;/strong&gt;. If it involves adding technical aids (like IDs in the UI), leadership might perceive it as a delay because they may not value UI execution coverage or may already be confident in unit-level automation. To convince leadership, the team could demonstrate the return on investment by &lt;strong&gt;showing the alternative world&lt;/strong&gt;. This involves comparing the current reality to a scenario where improved automatability allows the team to do beneficial things they otherwise couldn&amp;rsquo;t, thereby highlighting the value gained.&lt;/p&gt;
&lt;h3 id=&#34;qa-10-ai-agents-dealing-with-dynamic-elements&#34;&gt;Q&amp;amp;A 10: AI Agents Dealing with Dynamic Elements&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; We are exploring AI agents for our teams and I want to know how does the AI agent deal with dynamic elements like rotating banner banners, third party widgets or AB tests?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How the agent deals with dynamic elements depends on how it works (e.g., building high-level BDD scripts or generating code). Agents often operate on &lt;strong&gt;first principles&lt;/strong&gt;. If an agent uses a BDD approach, it works from a runtime specification and handles dynamic elements because it works from scratch for each execution, constantly aiming to fulfill the objective. For example, if an unexpected pop-up appears, the agent clears it and continues.&lt;/p&gt;
&lt;p&gt;If the agent writes code, it uses what is often called &amp;ldquo;autohealing&amp;rdquo;. This process automatically amends the script based on the current application state, prioritizing the achievement of the objective regardless of whether the change is &amp;ldquo;right&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;qa-11-early-signals-of-flaky-features&#34;&gt;Q&amp;amp;A 11: Early Signals of Flaky Features&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; What early signals tell you that a feature will become flaky once automated?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Early signals involve understanding the &lt;strong&gt;synchronization points&lt;/strong&gt; of the page. A feature is likely to be flaky if the application is populated or amended over time by JavaScript and the automation tool is not synchronizing properly on the DOM buildup. If a page is being constantly updated in the background without clear visual indicators (like spinners, which are easy to synchronize on), flakiness is more likely.&lt;/p&gt;
&lt;p&gt;The signal is the update process itself, particularly when it is non-deterministic (e.g., how totals are updated in a shopping cart). The core question is whether synchronization is required to prevent flakiness, and if it is difficult to synchronize, that is a strong signal. If necessary, automatability might be enhanced by adding an extra flag to the DOM to signal when the update is complete.&lt;/p&gt;
&lt;h3 id=&#34;qa-12-layers-to-focus-on-in-microservices-for-automatability&#34;&gt;Q&amp;amp;A 12: Layers to Focus on in Microservices for Automatability&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; In microservices setups which layers should teams focus on first to increase overall automatability?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The foundational layer to focus on is the &lt;strong&gt;human understanding&lt;/strong&gt; of the architecture and the requirements for automation. In microservices specifically, teams would typically focus on the &lt;strong&gt;interface layer&lt;/strong&gt; and their ability to automate it while keeping the interface standard.&lt;/p&gt;
&lt;p&gt;If microservices are communicating via HTTP messages compliant with a version standard, automation can be relatively easy. If interfaces are internal and change randomly, issues may arise, requiring attention to managing event-based queues if applicable. Strategies include using versioned interfaces or having a process to update automated coverage and abstraction layers when microservice interfaces change. It is crucial to avoid replicating interface objects (like payload objects) directly into test code, as this can prevent tests from spotting issues when new or removed fields occur in the application interface.&lt;/p&gt;
&lt;h3 id=&#34;qa-13-budget-limited-automatability-fixes-for-fastest-roi&#34;&gt;Q&amp;amp;A 13: Budget-Limited Automatability Fixes for Fastest ROI&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; For a team with limited budget which problems around automatability should we fix first to get the fastest return on investment?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The fastest return on investment comes from enhancing the team&amp;rsquo;s &lt;strong&gt;ability to automate&lt;/strong&gt;. This improvement allows teams to develop workarounds, find alternative solutions, and identify when to use different techniques. It is not about purchasing multiple or expensive tools. Instead, investment could be placed in training, practicing, exploring the capabilities of existing tools, and eliminating fundamental issues like test flakiness by fixing the root causes.&lt;/p&gt;
&lt;h3 id=&#34;qa-14-collaborating-earlier-to-avoid-automatability-rework&#34;&gt;Q&amp;amp;A 14: Collaborating Earlier to Avoid Automatability Rework&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How can developers and testers collaborate earlier to avoid expensive rework on automatability issues?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Collaboration is achieved by &lt;strong&gt;removing the barriers&lt;/strong&gt; that cause people to be isolated into silos, such as separate programming, testing, or test automation teams. The core issue is often that a &amp;ldquo;development team&amp;rdquo; is defined only as a programming team, instead of encompassing responsibility for design, programming, product suitability, testing, and production.&lt;/p&gt;
&lt;p&gt;Practical steps include involving the programming team in the automated execution maintenance. When programmers contribute, they often ensure data IDs are present, which removes many hard-to-automate issues typically found during end-to-end testing. Sharing the responsibility for maintenance ensures people understand and resolve related issues earlier.&lt;/p&gt;
&lt;h3 id=&#34;qa-15-automatability-in-continuous-delivery-and-trunk-based-development&#34;&gt;Q&amp;amp;A 15: Automatability in Continuous Delivery and Trunk-Based Development&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How should teams think about automatability when shifting towards continuous delivery and trunk-based development?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This environment requires high automated execution coverage that runs quickly, often with features being merged multiple times a day. Automatability is achieved by ensuring the person or pair responsible for creating a feature is &lt;strong&gt;also responsible for adding automated execution coverage&lt;/strong&gt; (unit tests). These tests demonstrate that the feature has been tested and provide future checks against accidental changes impacting the functionality.&lt;/p&gt;
&lt;p&gt;Teams could focus on structuring unit tests at the &lt;strong&gt;domain level&lt;/strong&gt; (e.g., focusing on users or orders) rather than strictly class level. This approach results in a degree of internal end-to-end flow tests without needing extensive external system testing. Furthermore, application architecture can be designed so that interfaces (like HTTP interfaces) can be tested primarily at the domain level, reducing the need for numerous actual HTTP calls.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Convert Chrome Dev Tools Recording to WebDriver Java Code Using Free OpenCode AI Agent</title>
      <link>https://www.eviltester.com/blog/eviltester/ai/chrome-dev-tools-recording-ai-writes-code/</link>
      <pubDate>Mon, 24 Nov 2025 10:19:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/ai/chrome-dev-tools-recording-ai-writes-code/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; Record and Playback is a notoriously bad way to automate. But what if we record, then have AI write code from the recording? Answer: it is a little better.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I performed an experiment to try tand demonstrate how to replicate the AI-powered test automation features commonly found in commercial SaaS testing tools using open source solutions. The process involved recording user interactions in an application with Chrome DevTools Recorder, exporting the recording as JSON, and then using an AI tool to convert the JSON into JUnit tests with WebDriver and page objects.&lt;/p&gt;
&lt;h2 id=&#34;overview-video&#34;&gt;Overview Video&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/9P_-9AvucwE&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=9P_-9AvucwE&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;In this video I:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;record some web actions using Chrome Dev Tools recorder&lt;/li&gt;
&lt;li&gt;fail to play them back because record and playback is notoriously bad&lt;/li&gt;
&lt;li&gt;feed the recorded JSON file into OpenCode with a prompt&lt;/li&gt;
&lt;li&gt;check the results of the AI process writing Automated Execution using WebDriver and Java&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We do get working automated coverage out the back. I would need to edit it a little, and if I wanted to do this longer term I would need to amend the prompt to meet my coding preferences.&lt;/p&gt;
&lt;h2 id=&#34;process&#34;&gt;process&lt;/h2&gt;
&lt;p&gt;I used the triangle application on Test Pages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/apps/triangle/&#34;&gt;https://testpages.eviltester.com/apps/triangle/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test Pages has a deliberately hard to automate side bar. The easy automation is through the top level menu.&lt;/p&gt;
&lt;p&gt;But I recorded the Triangle application by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clicking on the side menu bar to open the Triangle application&lt;/li&gt;
&lt;li&gt;and the instructions&lt;/li&gt;
&lt;li&gt;reading the instructions&lt;/li&gt;
&lt;li&gt;clicking back on the triangle application&lt;/li&gt;
&lt;li&gt;interacting with the app to generate invalid and valid triangles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I tried to playback the recording in the Chrome Dev Tools, it failed.&lt;/p&gt;
&lt;p&gt;Most of us experience failure with record and playback tooling.&lt;/p&gt;
&lt;h2 id=&#34;ai-tooling&#34;&gt;AI tooling&lt;/h2&gt;
&lt;p&gt;I have OpenCode, configured to use Chrome Dev Tools MCP, and working with Kat Code Pro Free in OpenRouter, but could just as easily have used any of the free coding LLMS on Open Code Zen or with Ollama locally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://opencode.ai/&#34;&gt;https://opencode.ai/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ChromeDevTools/chrome-devtools-mcp/&#34;&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openrouter.ai/&#34;&gt;https://openrouter.ai/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openrouter.ai/kwaipilot/kat-coder-pro:free&#34;&gt;https://openrouter.ai/kwaipilot/kat-coder-pro:free&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I used a basic prompt&lt;/p&gt;
&lt;p&gt;&amp;ldquo;given the json attached, convert the json into a set of junit tests using webdriver and page objects to recreate the flows recorded by the user. The json file is a recording made in Chrome Dev Tools recorder&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The process took about 5 minutes to run.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It opened the web page a few times,&lt;/li&gt;
&lt;li&gt;created some Page Objects.&lt;/li&gt;
&lt;li&gt;Found that the menu interaction was hard.&lt;/li&gt;
&lt;li&gt;Decided to jump straight to the triangle page and automate that way&lt;/li&gt;
&lt;li&gt;It did replicate the functional interaction included in the recording&lt;/li&gt;
&lt;li&gt;it did generate assertions for the results&lt;/li&gt;
&lt;li&gt;I could have used the test code generate with some small amendments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lessons-learned&#34;&gt;Lessons Learned&lt;/h2&gt;
&lt;p&gt;SAAS tools which take this approach will use Agents, which are essentially longer prompts. I should have added into the prompt more conditions:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;given the json attached, convert the json into a set of junit tests using webdriver and page objects to recreate the flows recorded by the user. The json file is a recording made in Chrome Dev Tools recorder. In the test code, do not write any findElement code, always abstract the location and interaction into a page object. Use existing page objects where possible and try to re-use existing methods. Make sure that any page object methods you use are used in a test so we have coverage of the interactions.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Over time, if I wanted to continue to automate using this process, I would refine the prompt further until I got the results I wanted, and possibly encode this prompt as an agent.&lt;/p&gt;
&lt;h2 id=&#34;would-i-do-this&#34;&gt;Would I do this?&lt;/h2&gt;
&lt;p&gt;Unlikely that I would do this in the real world.&lt;/p&gt;
&lt;p&gt;This seems like the replication of a record and playback approach.&lt;/p&gt;
&lt;p&gt;I do create Page Objects and have created initial execution coverage using AI.&lt;/p&gt;
&lt;p&gt;I have some empathy for AI tooling scanning applications and building flows through the application to automatically interact and generate a wide variety of data, to increase the scope of coverage across a few simple flows. I can see potential in augmenting a team to allow the team to go off and do more detailed stuff. Provided the AI tooling doesn&amp;rsquo;t get noisy and keep distracting the team.&lt;/p&gt;
&lt;p&gt;For any functionality as simple as I experimented with here, I hope that when people evaluate SAAS tools, that they also compare the paid tools to the capabilities of Open Source tools.&lt;/p&gt;
&lt;p&gt;Nothing wrong with paid tools. They are incredibly valuable when they make hard things simple, and add value when they make hard things easier.&lt;/p&gt;
&lt;p&gt;But, when the activity is simple and the functionality differences between Open Source and paid are small, I hope companies consider &amp;ldquo;what if we upskilled our staff a little such that we could use the Open Source tools&amp;rdquo;.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>Using Free OpenCode AI Agent to create Page Objects for WebDriver with Java</title>
      <link>https://www.eviltester.com/blog/eviltester/testpages/opencode-generate-page-objects/</link>
      <pubDate>Thu, 20 Nov 2025 10:19:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/testpages/opencode-generate-page-objects/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; OpenCode is a free and easy to use AI coding agent, it can be coupled with free models and MCP servers to create test automation code quickly and easily.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I had two sessions using Grok to create Page Objects.&lt;/p&gt;
&lt;p&gt;The recorded session was the second, and it did not go as &lt;a href=&#34;https://github.com/eviltester/ai-supported-testing-experiments/tree/main/opencode/create-page-object&#34;&gt;smoothly as the first&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;overview-video&#34;&gt;Overview Video&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/vurzGimLlT8&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=vurzGimLlT8&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Curious about coding test automation with free AI tools? See how OpenCode generates page objects and WebDriver tests in real time. Also see the Chrome DevTools MCP Server in action so that the locators are pulled from the DOM, reducing manual effort in creating Automated Execution Code.&lt;/p&gt;
&lt;p&gt;In this video I used Grok Code Fast 1 because it is currently free on OpenCode Zen, so anyone can repeat the experiment without additional requirements or funds.&lt;/p&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll find AI Generated code for on Github:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eviltester/ai-supported-testing-experiments/tree/main/opencode/create-page-object&#34;&gt;https://github.com/eviltester/ai-supported-testing-experiments/tree/main/opencode/create-page-object&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The application under test:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/apps/text-transformer/&#34;&gt;https://testpages.eviltester.com/apps/text-transformer/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;accelerating-test-automation-with-opencode-and-ai&#34;&gt;Accelerating Test Automation with OpenCode and AI&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been using OpenCode, a free, command-line interface for AI-driven code generation, to build page objects and tests for a WebDriver Java project. When configured to use Chrome DevTools MCP, the AI Tooling can pull down the DOM from the page under test and use it to create accurate locators and coverage flows.&lt;/p&gt;
&lt;h2 id=&#34;what-is-opencode-and-why-use-it&#34;&gt;What is OpenCode and Why Use It?&lt;/h2&gt;
&lt;p&gt;OpenCode is a completely free CLI tool for operating code agents. Running from the terminal, you can use AI models to generate code automatically. OpenCode supports a variety of model providers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenCodeZen (completely free for certain models, no billing details required)
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://opencode.ai/zen&#34;&gt;https://opencode.ai/zen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenRouter (paid credits, but many free models as well)
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://openrouter.ai/&#34;&gt;http://openrouter.ai/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Possibility to run local models with tools like Ollama, keeping everything on your machine
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ollama.com/&#34;&gt;https://ollama.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Switching between models is easy, letting you experiment and find which AI delivers the best results on your codebase.&lt;/p&gt;
&lt;p&gt;During my WebDriver code experiments I&amp;rsquo;ve used Grok Code Fast 1, Kat Coder Pro, GPT-5 Nano.&lt;/p&gt;
&lt;p&gt;GPT5 Nano didn&amp;rsquo;t give good results, while GROK Code Fast One did better. Through OpenRouter, Kat Coder Pro (free) with occasional use of Claude Haiku 3.5 have been my main models.&lt;/p&gt;
&lt;h2 id=&#34;practical-use-case-building-page-objects-and-tests&#34;&gt;Practical Use Case: Building Page Objects and Tests&lt;/h2&gt;
&lt;p&gt;The core of the demo is applying OpenCode to a Test Transformer application on Test Pages. A page where users enter text, which is then manipulated in various ways (e.g., reverse, Pig Latin, ROT13, etc.).&lt;/p&gt;
&lt;p&gt;The page also has cookies to track visits and last used text. There is no &amp;rsquo;transform&amp;rsquo; button and text is transformed automatically as the text changes.&lt;/p&gt;
&lt;p&gt;Using OpenCode&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic Page Analysis:&lt;/strong&gt; By integrating with Chrome DevTools MCP, OpenCode can launch a browser, analyze the DOM, and retrieve locators with high accuracy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt-driven Code Generation:&lt;/strong&gt; You can specify exactly what parts of the page you want covered. I keep prompts focused, asking for page objects that cover only relevant fields and results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iterative Improvement:&lt;/strong&gt; Results can be variable. Sometimes you get exactly what you need, sometimes less, sometimes more. But with targeted prompts and reviewing, you can guide the AI toward better outcomes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;mcp-configuration&#34;&gt;MCP Configuration&lt;/h2&gt;
&lt;p&gt;OpenCode has a configuration folder in the user directory, so I amended it, as per the instructions on the web site, to use Chrome DevTools as an MCP Server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://opencode.ai/docs#configure&#34;&gt;https://opencode.ai/docs#configure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://opencode.ai/docs/mcp-servers/#configure&#34;&gt;https://opencode.ai/docs/mcp-servers/#configure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ChromeDevTools/chrome-devtools-mcp/&#34;&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allows the AI to use the browser and analyze the DOM:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;$schema&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://opencode.ai/config.json&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;theme&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;opencode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;autoupdate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;mcp&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;chrome-devtools&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             	&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;local&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      		&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;npx&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-y&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chrome-devtools-mcp@latest&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      		&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;page-object-and-test-creation-challenges--strategies&#34;&gt;Page Object and Test Creation: Challenges &amp;amp; Strategies&lt;/h2&gt;
&lt;p&gt;The generation process is interactive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Refining Results:&lt;/strong&gt; Initial code may be too generic or incomplete. By referencing exact DOM elements (IDs, etc.), you can guide the AI for more precise methods and cleaner tests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decoupling Structure from Tests:&lt;/strong&gt; I had to guide the AI to improve the design by avoiding dependencies where tests need to know page structure, relying instead on abstractions implemented as page object methods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handling Edge Cases:&lt;/strong&gt; Randomized features (like word shuffling) require smart assertions e.g., comparing sets or arrays rather than specific string outputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;reviewing-and-refactoring-ai-generated-code&#34;&gt;Reviewing and Refactoring AI-Generated Code&lt;/h2&gt;
&lt;p&gt;The AI output should always be reviewed and, when necessary, tweaked. Which means it still helps to know what you are doing, learn how to code, and learn how to automate.&lt;/p&gt;
&lt;p&gt;In the video, I check the validity of date-time assertions and tolerances, tidy up method design, and make small adjustments for clarity and robustness. AI can cover a lot quickly, manual review remains essential.&lt;/p&gt;
&lt;h2 id=&#34;takeaways-when-and-why-to-experiment-with-opencode&#34;&gt;Takeaways: When and Why to Experiment with OpenCode&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed and Coverage:&lt;/strong&gt; OpenCode can save you significant time, especially for repetitive or DOM-heavy automation tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variability:&lt;/strong&gt; Different models (and even the same model, run twice) yield different results. Prompt engineering and manual review are key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost-Effectiveness:&lt;/strong&gt; Thanks to the availability of free models, you can lower the barrier to entry for AI-powered test automation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; Whether you want cloud-based AI or local execution, OpenCode can accommodate diverse workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;OpenCode is a powerful tool for testers and developers looking to speed up automation without a big cost outlay.&lt;/p&gt;
&lt;p&gt;You need to know how to code and automate, so that you can effectively review the generated code and prompt for improvements.&lt;/p&gt;
&lt;p&gt;By combining intelligent prompting with iterative review, you can build robust page objects and coverage tailored to your applications.&lt;/p&gt;
&lt;p&gt;I think it is worth experimenting with OpenCode. Try different models.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>An overview of WebDriver with Java</title>
      <link>https://www.eviltester.com/blog/eviltester/testpages/webdriver-java-overview/</link>
      <pubDate>Thu, 13 Nov 2025 10:19:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/testpages/webdriver-java-overview/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; a simple WebDriver Test is not production ready code, but when we refactor it to use JUnit effectively, add some Page Objects, Abstraction and a little bit of Synchronization and we have all the makings of quality execution code.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This video is an overview of how you can refactor from a simple WebDriver test which is not robust and not reliable, into a production quality UI Automated Execution &lt;code&gt;@Test&lt;/code&gt; class.&lt;/p&gt;
&lt;h2 id=&#34;overview-video&#34;&gt;Overview Video&lt;/h2&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/bQ7y9-Y2U2c&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=bQ7y9-Y2U2c&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Step-by-step walkthrough of the essential building blocks for creating robust, maintainable automated web tests. Starting with the most basic &amp;ldquo;Hello World&amp;rdquo; of WebDriver, you&amp;rsquo;ll learn how to interact with web pages, locate elements using IDs and CSS selectors, extract data, and implement reliable synchronization.&lt;/p&gt;
&lt;p&gt;Moving beyond the basics, you&amp;rsquo;ll build scalable test code using JUnit as the test execution framework, and discover how to organize your tests with setup and teardown methods, manage browser drivers, and avoid common pitfalls that lead to unmaintainable test scripts.&lt;/p&gt;
&lt;p&gt;The videos covers the Page Object Model (POM), a key design pattern in Selenium test automation. See how to abstract away locators, web elements, and navigation into clean, reusable page classes—making your tests easier to write, maintain, and scale as your application grows.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also get hands-on guidance for implementing waits, synchronizing with dynamic content, and writing tests that assert on changing page states without flakiness. Real-world design decisions, such as when to expose web elements versus higher-level actions, are discussed, giving you the confidence to craft production-ready automated tests.&lt;/p&gt;
&lt;p&gt;Key topics covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Selenium WebDriver setup in Java&lt;/li&gt;
&lt;li&gt;Locating and interrogating web elements efficiently&lt;/li&gt;
&lt;li&gt;Writing basic and advanced JUnit tests for browser automation&lt;/li&gt;
&lt;li&gt;Organizing reusable and maintainable code with the Page Object Model&lt;/li&gt;
&lt;li&gt;Effective synchronization using WebDriverWait and ExpectedConditions&lt;/li&gt;
&lt;li&gt;Managing test environments and abstracting configuration&lt;/li&gt;
&lt;li&gt;Common mistakes and how to write production ready test code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll find the code for this on Github:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eviltester/startUsingSeleniumWebDriver&#34;&gt;https://github.com/eviltester/startUsingSeleniumWebDriver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A longer tutorial article with guidance on using WebDriver in CI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com/reference/automating/webdriver/webdriver-java/&#34;&gt;https://testpages.eviltester.com/reference/automating/webdriver/webdriver-java/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The application under test:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://testpages.eviltester.com/pages/basics/basic-web-page/&#34;&gt;https://testpages.eviltester.com/pages/basics/basic-web-page/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;key-concepts&#34;&gt;Key Concepts&lt;/h2&gt;
&lt;p&gt;The video covers the essential practices and techniques for building maintainable, robust Selenium WebDriver tests in Java.&lt;/p&gt;
&lt;h3 id=&#34;test-structure-and-execution-framework&#34;&gt;Test Structure and Execution Framework&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JUnit for Test Lifecycle Management:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use JUnit as an execution framework to manage WebDriver setup and teardown. Placing driver instantiation and browser closure within appropriate lifecycle hooks (&lt;code&gt;@BeforeAll&lt;/code&gt;, &lt;code&gt;@AfterAll&lt;/code&gt;, &lt;code&gt;@BeforeEach&lt;/code&gt;) ensures resource management and avoids issues such as orphaned browser instances if a test fails.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single Responsibility:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The test methods are kept focused solely on specific test state and asserting behavior. Setup and environment logic are abstracted away, improving clarity and repeatability.&lt;/p&gt;
&lt;h3 id=&#34;locators-and-web-elements&#34;&gt;&lt;strong&gt;Locators and Web Elements&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Locating Elements:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WebDriver’s &lt;code&gt;findElement&lt;/code&gt; with appropriate strategies (typically &lt;code&gt;By.id&lt;/code&gt;, &lt;code&gt;By.className&lt;/code&gt;, or CSS selectors) is used to interact with page components.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebElement Abstraction:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Operations on page content—such as retrieving text or manipulating controls—are achieved by first locating and then storing elements in variables, leveraging WebDriver’s &lt;code&gt;WebElement&lt;/code&gt; interface.&lt;/p&gt;
&lt;h3 id=&#34;environment-and-configuration-abstraction&#34;&gt;&lt;strong&gt;Environment and Configuration Abstraction&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test Environment Encapsulation:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test configuration (e.g., the base domain/URL) is factored out into dedicated environment classes or variables. This enables easier swapping between environments (production, localhost, etc.) and increases test maintainability.&lt;/p&gt;
&lt;h3 id=&#34;page-object-pattern&#34;&gt;&lt;strong&gt;Page Object Pattern&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The page object pattern encapsulates page behavior and structure. It removes direct driver calls from test code and moves them into dedicated classes, representing pages or components.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Page Object Responsibilities:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You decide on specific responsibilities when you create the Page. The video outlines a few categories.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Locators (how to find the elements)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigation (e.g., loading the page)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Element accessors (methods returning individual WebElements for UI components)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Functional helpers (high-level actions such as &amp;ldquo;click button&amp;rdquo; or &amp;ldquo;wait for message&amp;rdquo;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Synchronization methods encapsulating common waits or checks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evolution and Maintainability:&lt;/strong&gt;&lt;br&gt;
Page objects are built incrementally through refactoring, adding only what is needed for current test coverage. Overengineering is discouraged. Abstraction is introduced to support actual test requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;synchronization-and-robustness&#34;&gt;&lt;strong&gt;Synchronization and Robustness&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Synchronization with WebDriverWait:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reliable tests require explicit synchronization. Leveraging &lt;code&gt;WebDriverWait&lt;/code&gt; and Selenium’s built-in &lt;code&gt;ExpectedConditions&lt;/code&gt; guards against timing issues, such as waiting for a message to appear after a button click.&lt;/p&gt;
&lt;p&gt;Prefer methods that wait for meaningful state changes rather than only for specific text, e.g., &amp;ldquo;wait until message is shown (non-empty).&amp;rdquo; This approach aids maintainability, reduces flaky tests and avoids clashes with Assertions where duplicate test code would be maintained.&lt;/p&gt;
&lt;h3 id=&#34;assertion-practices&#34;&gt;&lt;strong&gt;Assertion Practices&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Assertions in Tests versus Waits:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assertions should reside in the test methods, separated from waits. Assure the correctness of content after synchronization to ensure tests fail for relevant application issues, not for timing errors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avoiding Redundancy:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abstract common assertions or waiting patterns into the page object or helper methods without duplicating logic.&lt;/p&gt;
&lt;h3 id=&#34;scalability-and-design-decisions&#34;&gt;&lt;strong&gt;Scalability and Design Decisions&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YAGNI Minimalist Approach:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You aren&amp;rsquo;t going to need it. Only model what is immediately necessary. Avoid creating exhaustive page objects upfront. Prioritize test coverage and practical needs over future-proofing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Component Modeling:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Page objects can represent whole pages or reusable components, adapting complexity as the coverage grows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exposing Elements:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether to expose &lt;code&gt;WebElement&lt;/code&gt; instances or hide all interaction behind higher-level methods is a judgment call. Balance flexibility and encapsulation according to project needs.&lt;/p&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;Effective Selenium automation in Java entails adopting JUnit for structuring the test lifecycle, abstracting environment configuration, utilizing the page object pattern for encapsulation, applying robust synchronization with waits, and maintaining a clean separation of setup, interaction, and assertion logic. These principles, create automated execution code that is easier to write, read, maintain, and scale as your application evolves.&lt;/p&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>An overview of the dummy practice web page Basic Web Page</title>
      <link>https://www.eviltester.com/blog/eviltester/testpages/basic-test-pages/</link>
      <pubDate>Tue, 04 Nov 2025 13:19:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/testpages/basic-test-pages/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; an overview of how you might use the most basic site on Test Pages. Use dev tools. Explore the JavaScript. Interrogate and Amend the DOM. Go beyond a button click.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is an overview of how you might use the Basic Web Page on Test Pages.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t go deep then you&amp;rsquo;ll read the text, click the button and tick the pass checkbox. But we need to learn to go deeper when performing web testing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://testpages.eviltester.com/pages/basics/basic-web-page/&#34;&gt;&lt;img src=&#34;https://www.eviltester.com/images/testpages/basic-web-page.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;overview-video&#34;&gt;Overview Video&lt;/h2&gt;
&lt;p&gt;The video provides an overview of what you might explore using the Basic Web Page on Test Pages, software testing practice application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://testpages.eviltester.com/pages/basics/basic-web-page/&#34;&gt;testpages.eviltester.com/pages/basics/basic-web-page/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid getting distracted. Learn how to zero in on specific page elements so your exploratory sessions have a clear purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use browser developer tools, inspect and manipulate the DOM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Discover how to use CSS selectors and XPath for finding and interacting with page. This is not just for automating.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find out why reading the underlying code can reveal more than just clicking buttons, and how it can help you spot functional risks early.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See how browser-based AI tools can help you experiment, understand selectors, and accelerate your learning. Even on a super basic page.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/EiGAG6ZmdtA&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=EiGAG6ZmdtA&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;how-a-simple-web-page-can-help-you-master-web-application-testing&#34;&gt;How a Simple Web Page Can Help You Master Web Application Testing&lt;/h2&gt;
&lt;p&gt;When learn web application testing, it’s tempting to look for complex scenarios and detailed features. But even the most basic web page can be used to learn a lot of essential testing concepts and skills.&lt;/p&gt;
&lt;h3 id=&#34;restrict-your-focus&#34;&gt;Restrict your Focus&lt;/h3&gt;
&lt;p&gt;It’s easy to get distracted by the all the elements: sidebars, navigation, tag clouds, menus, etc.&lt;/p&gt;
&lt;p&gt;But we need to focus.&lt;/p&gt;
&lt;p&gt;The central area contains just three things that matter for this exercise: two paragraphs and a “click me” button.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“It’s important to know that when we are testing applications, there’s often a lot of stuff in the application, but we have to restrict our focus because we’re doing exploratory testing sessions with a particular aim.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;go-beyond-basic-functional-testing&#34;&gt;Go Beyond Basic Functional Testing&lt;/h3&gt;
&lt;p&gt;The most basic functional testing involves checking that the paragraphs display the right text, the button exists, and clicking it produces the intended result &amp;ldquo;you clicked the button.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Automating this is simple. But we can use every page to learn more. And pushing ourselves on such simple pages can reveal limits to our knowledge and trigger us to learn more.&lt;/p&gt;
&lt;p&gt;I revisit the Test Pages multiple times and each time I approach them differently I push my skills, double check my learning and find something new to try.&lt;/p&gt;
&lt;h4 id=&#34;discover-the-dom&#34;&gt;Discover the DOM&lt;/h4&gt;
&lt;p&gt;Learning to use &lt;em&gt;Inspect Element&lt;/em&gt; is crucial. The dev tools reveal the Document Object Model (DOM). The browser&amp;rsquo;s internal representation of what you see.&lt;/p&gt;
&lt;p&gt;By inspecting, you learn that your target elements sit within a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with class &lt;code&gt;&amp;quot;centered&amp;quot;&lt;/code&gt;, and that paragraphs (&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;) and buttons are distinguished by IDs and classes.&lt;/p&gt;
&lt;p&gt;This exploration raises fundamental questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;What do attributes like ID and class mean?&lt;/li&gt;
&lt;li&gt;How can we use these attributes to locate elements?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t try to explain everything on the Test Pages. There are very thorough references on the web to look all this stuff up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web&#34;&gt;https://developer.mozilla.org/en-US/docs/Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;css-selectors-and-xpath&#34;&gt;CSS Selectors and XPath&lt;/h4&gt;
&lt;p&gt;Finding elements efficiently is a key skill for both exploring and automating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CSS Selectors&lt;/strong&gt;: Quickly locate elements by &lt;code&gt;#id&lt;/code&gt; or &lt;code&gt;.class&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XPath&lt;/strong&gt;: Offers more complex navigation through the DOM, including traversing backwards, a feature not possible with CSS selectors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can experiment with these directly in your browser, using built-in tools to copy selectors or XPath expressions to pinpoint any element.&lt;/p&gt;
&lt;h4 id=&#34;ai-assistance&#34;&gt;AI Assistance&lt;/h4&gt;
&lt;p&gt;Chrome now integrate AI-assisted features. By asking the AI for alternative CSS selectors or XPath for a specific paragraph, you receive instant help.&lt;/p&gt;
&lt;p&gt;A great way to increase your locator expertise and knowledge. And you don&amp;rsquo;t have to trust the AI, test it all out in your browser dev tools.&lt;/p&gt;
&lt;p&gt;You may not need to install extra tools to work with something as basic as a locator.&lt;/p&gt;
&lt;p&gt;Eventually you&amp;rsquo;ll be able to create the locators without help.&lt;/p&gt;
&lt;h3 id=&#34;understanding-risks-beyond-the-functional-requirements&#34;&gt;Understanding Risks Beyond the Functional Requirements&lt;/h3&gt;
&lt;p&gt;Technical testing isn&amp;rsquo;t just about obvious functionality. We need to learn to look for, and evaluate many types of risk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Synchronization Issues:&lt;/strong&gt; The &amp;ldquo;click message&amp;rdquo; paragraph always exists in the DOM, so automation scripts must check its &lt;em&gt;content&lt;/em&gt; changes, not just its presence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript Behavior:&lt;/strong&gt; Only the relevant lines of code execute on click; changing the button&amp;rsquo;s ID after page load won&amp;rsquo;t affect the click handler because the event is already attached.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;We have to have the ability to assess the risks of the page we’re looking at, even on a simple page like this, with five lines of code.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;dont-panic&#34;&gt;Don&amp;rsquo;t Panic.&lt;/h3&gt;
&lt;p&gt;Experiment freely; if you break something, a page refresh will reset it back to normal.&lt;/p&gt;
&lt;p&gt;The Test Pages is a safe environment to play. We want to learn without fear.&lt;/p&gt;
&lt;h3 id=&#34;the-path-to-technical-mastery&#34;&gt;The Path to Technical Mastery&lt;/h3&gt;
&lt;p&gt;Even with a simple page like this we can go beyond the basics.&lt;/p&gt;
&lt;p&gt;Use it to learn how technology implements functionality, and then use those insights to identify deeper risks and improve your testing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Work through the test pages, go beyond just the functionality, learn to understand the technology that implements it.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
    <item>
      <title>An overview of the Software Test Pages, a dummy practice web testing application</title>
      <link>https://www.eviltester.com/blog/eviltester/testpages/overview-of-test-pages/</link>
      <pubDate>Tue, 04 Nov 2025 12:19:00 UTC</pubDate>
      <author>Alan Richardson</author>
      <dc:creator>Alan Richardson</dc:creator>
      <guid>https://www.eviltester.com/blog/eviltester/testpages/overview-of-test-pages/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; if you want to practice your technical web testing then start with testpages.eviltester.com&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Do you want a dummy practice site to use to practice and improve your web testing and automating?&lt;/p&gt;
&lt;p&gt;I spent the last few weeks in October updating the Test Pages application to be easier for me to maintain, add more content and generally tidied it up to make the pages more focused on specific concepts and avoid too much functionality on one page.&lt;/p&gt;
&lt;h2 id=&#34;overview-video&#34;&gt;Overview Video&lt;/h2&gt;
&lt;p&gt;The video provides a quick overview of the software testing practice pages hosted at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com&#34;&gt;testpages.eviltester.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This site is designed as a self-teaching site for anyone learning web testing.&lt;/p&gt;
&lt;div class=&#34;video-container&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/jvEbl6GZFMI&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;p class=&#34;center-text&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=jvEbl6GZFMI&#34; target=&#34;_blank&#34;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;h2 id=&#34;what-is-software-testing-pages&#34;&gt;What is Software Testing Pages?&lt;/h2&gt;
&lt;p&gt;The application is built to help users practice fundamental web testing skills regardless of methodology or tool.&lt;/p&gt;
&lt;p&gt;Key areas of suggested practice include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exploratory testing.&lt;/li&gt;
&lt;li&gt;Automating using various tools.&lt;/li&gt;
&lt;li&gt;Learning testing tools, proxies, and browser dev tools.&lt;/li&gt;
&lt;li&gt;Learning web technologies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The site links off to other high-quality practice testing sites, making it a central reference point. I&amp;rsquo;ve curated a list of what I consider to be the best practice sites, and the ones that I&amp;rsquo;ve used. I skipped any with lots of bugs, or that don&amp;rsquo;t seem to be maintained.&lt;/p&gt;
&lt;h2 id=&#34;practice-sections-pages-and-applications-apps&#34;&gt;Practice Sections: Pages and Applications (Apps)&lt;/h2&gt;
&lt;p&gt;The site is organized into categorized sections that target specific functional areas and concepts.&lt;/p&gt;
&lt;h3 id=&#34;pages-basic-testing-practice&#34;&gt;Pages (Basic Testing Practice)&lt;/h3&gt;
&lt;p&gt;The &amp;ldquo;Pages&amp;rdquo; section is ideal for those just beginning their learning journey. These pages cover fundamental concepts and element interaction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic elements: Examples include a basic web page with a button that can be clicked and automated.&lt;/li&gt;
&lt;li&gt;Element location: Users can practice finding elements by tag name list or by ID. This practice can be done using automated execution tools (like WebDriver or Playwright) or directly within the dev tools using CSS selectors.&lt;/li&gt;
&lt;li&gt;Alerts and interactions: The site includes standard JavaScript alerts (pop-up boxes), as well as elements that look like alerts but require different handling. There are also pages for experimenting with keyboard interaction, where key identifiers are shown for tooling verification.&lt;/li&gt;
&lt;li&gt;Forms: Forms can be submitted using JavaScript, or form submission, and validation can be turned on and off. Explore fully.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have pages for most fundamental web technologies.&lt;/p&gt;
&lt;h2 id=&#34;applications-apps-in-depth-testing&#34;&gt;Applications (Apps) (In-Depth Testing)&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;Apps&amp;rdquo; section features small, typically one-page applications designed for more in-depth testing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Classic Exercises: A common example is the triangle application, often used to help explore testing principles, such as checking boundaries and functional requirements.&lt;/li&gt;
&lt;li&gt;Interesting Exploration: Some apps do have bugs. Some have hidden features. They are all designed to be interesting to explore and automate.&lt;/li&gt;
&lt;li&gt;Backend Interaction: Some applications use JavaScript or CSS, while others send data to a server. This includes API-backed forms (like a calculation form). I encourage you to use the network tab to observe requests and explore the underlying Swagger API, which supports POST and GET requests and can be integrated with tools like Postman or Bruno.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;advanced-practice-and-resources&#34;&gt;Advanced Practice and Resources&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;Challenges&amp;rdquo; are designed to be more difficult to automate, although they are generally easy for a human user to interact with. This section helps users test the full scope of their web automation tool capabilities.&lt;/p&gt;
&lt;p&gt;I am building a reference section containing information related to testing. This goes beyond defining elements, explaining instead why elements are tested and outlining the risks associated with elements (such as input elements).&lt;/p&gt;
&lt;p&gt;The reference section also provides links to various videos demonstrating exploratory testing in action.&lt;/p&gt;
&lt;h2 id=&#34;visit-the-site&#34;&gt;Visit The Site&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://testpages.eviltester.com&#34;&gt;testpages.eviltester.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&amp;lt;p&amp;gt;
    &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;https://www.patreon.com/c/eviltester&amp;#34;&amp;gt;Join our Patreon&amp;lt;/a&amp;gt; from as little as $1 a month for early access to videos, ad-free videos, free e-books and courses, and lots of exclusive content.&amp;lt;/strong&amp;gt;
&amp;lt;/p&amp;gt;</description>
    </item>
    
  </channel>
</rss>