<?xml version="1.0"?><feed xmlns:media="http://search.yahoo.com/mrss/" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:idx="urn:atom-extension:indexing" xmlns="http://www.w3.org/2005/Atom" idx:index="no" gr:dir="ltr"><!--
Content-type: Preventing XSRF in IE.

--><generator uri="https://bazqux.com">BazQux Reader</generator><id>tag:google.com,2005:reader/feed/http://007unlicensedtotest.blogspot.com/feeds/posts/default</id><title>blogs</title><subtitle type="html">blogs</subtitle><link rel="self" href="https://bazqux.com/feed/d45a6ead98c5f8f9f99f?no_branding"></link><gr:continuation>4690104287694</gr:continuation><updated>2026-05-24T10:03:43Z</updated><entry gr:crawl-timestamp-msec="1779546973000"><id gr:original-id="http://dragonsforelevenses.com/?p=329">tag:google.com,2005:reader/item/000004f70000000d</id><category term="leadership"></category><category term="agentic"></category><category term="agile"></category><category term="ai"></category><category term="development"></category><category term="organsiation"></category><category term="Software"></category><category term="teams"></category><category term="waterfall"></category><title type="html">Modern professional software development is more akin to sport than anything else</title><published>2026-05-23T14:36:13Z</published><updated>2026-05-23T14:36:13Z</updated><link rel="alternate" href="https://dragonsforelevenses.com/2026/05/23/modern-professional-software-development-is-more-akin-to-sport-than-anything-else/" type="text/html"></link><summary type="html">&lt;p&gt;For too long we’ve accepted one failed metaphor or another to help define developing software professionally. All models are fallible but the one I believe breaks least often is: software development is a contact team sport. One shared clear goal, smaller milestones to progress to that goal, filled with opportunities for success and failure to learn from and adapt and when on the pitch, it doesn’t matter what your ‘position’ is, you have one responsibility: make your team win.&lt;/p&gt;



&lt;p&gt;John Cutler recently asked “What is a team?” in his post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://cutlefish.substack.com/p/tbm-423-why-defining-teams-is-so&quot;&gt;TBM 423: Why Defining Teams Is So Hard&lt;/a&gt;. What I took from his piece aligns a lot with my experience: organisations are messy. &lt;/p&gt;



&lt;p&gt;We have one very strong source of inspiration for what real teams are, from sport. There are a number of different ‘teams’ in sport. There are examples of individual sports where the ‘team’ exists but is less apparent in direct competition, such as tennis or golf. Formula 1 is an individual sport but which cannot reach the extreme heights of innovation and excellence unless there’s an acceptance that success is impossible without the team around them. Then there’s the sports where the team is in competition together, in real time e.g. football and rugby. &lt;/p&gt;



&lt;p&gt;It is my belief that ‘teams’ which have a shared goal, made up of more than 2 people, operate closer to football and rugby, than F1, golf or tennis. If a team doesn’t see themselves in this way now, making this subtle change in perspective will be transformative.&lt;/p&gt;



&lt;p&gt;As a Manchester City fan, the announcement that Pep Guardiola is leaving is a hard one to process but it does instigate a moment to reflect. Pep’s Barcelona team is generally accepted to be the best football team created in the modern era. His strong beliefs, derived from his inspiration Johan Cruyff’s Total Football, applied to a squad of exceptional players, with one standout legend in Lionel Messi. This team dominated football matches from start to finish. I still don’t believe I’ve seen a better single performance from a football team than their 3-0 victory over Manchester United in the Champions League final. &lt;/p&gt;



&lt;p&gt;It wasn’t until he became Manchester City manager that I started to delve deeper into his methods. Over the 10 years of his tenure as manager, I’ve watched countless press conferences, documentaries and interviews, attended more games home and away than my bank balance would like to admit and watched even more on TV. One thing about Guardiola stood out more for me than his tactics or beliefs.&lt;/p&gt;



&lt;h2&gt;The Pep Guardiola Effect&lt;/h2&gt;



&lt;p&gt;It’s easy to see why Pep’s teams do so well. Without going into too much detail, Pep’s teams have a number of very specific quality attributes: the team moves up and down the pitch with the ball; when the ball is lost the team have to get it back immediately; the individual skill level of every player is incredible to enable them to maintain the ball under intense pressure; there’s always a free player to pass to. It’s simple when written down, but only Pep has really been able to implement it consistently, season after season, at 3 major clubs. I asked myself why and I think I found it: responsibility.&lt;/p&gt;



&lt;p&gt;The Pep Guardiola effect is evident most in the interviews and press conferences he does when City have lost or even more so, when they’ve won but not played well. He doesn’t hold his players accountable, he takes responsibility and makes the players responsible.&lt;/p&gt;



&lt;p&gt;Accountability is often displayed in questions focussed on the past: why did this happen, why didn’t you do this?&lt;/p&gt;



&lt;p&gt;Responsibility is best displayed in questions focussed on the future: what can I do differently, how can we be better?&lt;/p&gt;



&lt;p&gt;Pep helps them be responsible for themselves, to be their best but more importantly, be responsible to their team, the fans and the club. Fear can drive you in short bursts, but responsibility is the internal fire that powers us. Pep is able to build incredible levels of responsibility into the players in his teams. That responsibility blurs the once static understanding of positions: goalkeepers just stop the ball, defenders stop attacks, midfielders collect the ball, wingers get the ball to the strikers, strikers score. This is now and forever more no longer true. In a Pep team, the goalkeeper has to play football as well as midfielder, strikers have to be able to retrieve the ball in an attacking position as well as any defender in their own penalty area. This responsibility, a responsibility to work for the team with a single shared goal, to win every game. This is what creates the virtuous feedback loop for excellence. That feedback loop or continuous learning is a relentless pursuit of the perfection of implementation of the beliefs. Some of the most successful players at Manchester City joined the club and were pretty terrible in their first season. But they stayed. They believed in themselves. They improved. Until Erling Haaland it’s arguable that Pep’s City had never signed a complete superstar. Every other player who turned out to be world class, became world class at City. But how can Pep build that level of responsibility into people?&lt;/p&gt;



&lt;h2&gt;The Pep Guardiola Approach&lt;/h2&gt;



&lt;p&gt;Pep thinks in systems. The pitch is a constraint and there are many others. He doesn’t accept all of those constraints as immovable, but he accepts them in the moment. That acceptance gives Pep a canvas to push those constraints to their absolute limits. There is one constraint he embraces more than any other: that his team is made of human beings. Humans have feelings, they have lives, they have limitations. We are all flawed. Pep is flawed. Pep knows this and he does one thing I don’t think I’ve seen anyone else do close to as well as him, other than Jurgen Klopp: he cares about those players as humans. Not as an extended family, there are clear boundaries of responsibility in place. But he cares about all of them as individuals. He signs players who he believes have a desire to reach the very top of their potential. He gets them there not through fear but by giving a damn about the success of each of them. This can’t be faked. Humans have excellent instincts to detect fakeness. Maybe not initially, but when it really matters. It is impossible for Pep to turn huge potential into world class, season after season, unless he is authentic. And you can see it in his behaviour. &lt;/p&gt;



&lt;p&gt;We’ve all been told how psychological safety is important for excellence. Excellence is an emergent property of the ability to adapt following failure. Pep is able to build such a high level of trust in him from his team, that despite intense pressure, individuals feel the responsibility to take the circumstances, not the moments, the circumstances and lift themselves and each other to improve, over and over and over again.&lt;/p&gt;



&lt;p&gt;People have written about this. Countless white papers of research, conference talks and many a book. One in particular Radical Candour. &lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;“Care personally for your colleagues while also challenging them directly.’”&lt;/p&gt;
&lt;cite&gt;Matt Rutherford&lt;/cite&gt;&lt;/blockquote&gt;



&lt;p&gt;The feeling of being cared for can only come from someone else’s action. Saying you care for someone only survives if you behave like it. Not perfectly, that’s not possible, but proportionally more often than not. It’s in the moments of highest stress when that care has to come to the fore. No one messes up on purpose. Football is a complex game, with a huge surface area for mistakes. Software development is no different. But excellence can only come from learning from those mistakes and to learn from those mistakes, the people who could scorn you, who could hold you accountable, have opportunities to demonstrate their level of care by accepting their responsibility in the failure or offering words of encouragement and reassurance. &lt;/p&gt;



&lt;p&gt;And this is why that sustained level of care is necessary. Pep has said himself on a number of occasions that he overstepped challenging directly, during or after a game. You can watch some of the changing room exchanges online. As an outsider they’re uncomfortable to watch. But in that group, the players know it’s not personal, it’s just frustration. And because that frustration doesn’t boil over into accountability, even in this most intense of environments, players can feel safe that tomorrow, when the frustration is gone, responsibility kicks in again.&lt;/p&gt;



&lt;p&gt;Almost everyone I’ve heard talk about this book falls into the ‘fake care’ problem. They fail to understand that the success of challenging directly is directly proportional to the amount of care the person receiving the feedback feels they have from the person providing it. These people will only be involved in creating and achieving genuine excellence, through luck.&lt;/p&gt;



&lt;p&gt;Excellence in the world of AI&lt;/p&gt;



&lt;p&gt;As building software becomes even more commoditised, everyone gets the lift up. Pep changed football, now every club, from junior to senior, try to emulate what Pep achieved, not because they solved that problem themselves, but because they’re standing on the shoulders of a giant. If everyone tries to play the same way you have two options for success: do it better than everyone else or be better than everyone else. &lt;/p&gt;



&lt;p&gt;The organisations and teams of any reasonable scale will succeed in the era of AI by playing Pep’s football. Blur roles, build individual excellence, one shared problem to solve but solve it together. But that’s not enough, you need to be better. Being better is a tomorrow problem. Tomorrow can only be better if people take responsibility for it. &lt;br&gt;&lt;br&gt;This isn’t about reading a book and looking for a recipe or process to follow. You’ve already failed if you do. Now as humans more than ever we have to stand out. That means looking inside ourselves and finding the humanity. That’s going to be the differentiator. You don’t have to completely overhaul an org overnight, you don’t need to do an all-hands. You start tomorrow by changing you. Take the next situation you’re perceived to be a leader for and demonstrate care, demonstrate responsibility. If it’s an incident review, look forward and find a path together. If it’s slipping schedule, look forward and find a path together. If it’s a feature that’s not living up to expectations, look forward and find a path together. Not in a slide deck or slack message but around a desk or in an online call, with the problem in front of you. Start together, end together. Drag each other over the finish line. &lt;/p&gt;



&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;clear: both&quot;&gt;&lt;/p&gt;&lt;p data-bqr-info=&quot;attachment&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://dragonsforelevenses.com/wp-content/uploads/2026/05/pep-guardiola-waving-goodbye.jpg&quot; alt=&quot;pep-guardiola-waving-goodbye&quot;&gt;&lt;/p&gt;</summary><author><name>dragonsforelevenses</name></author><source gr:stream-id="feed/https://dragonsforelevenses.com/feed/"><id>tag:google.com,2005:reader/feed/https://dragonsforelevenses.com/feed/</id><title type="html">Dragons for Elevenses</title><link rel="alternate" href="https://dragonsforelevenses.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779537115000"><id gr:original-id="https://medium.com/p/cc4f7deaf74a">tag:google.com,2005:reader/item/0000091b00000071</id><category term="programming"></category><category term="software-testing"></category><category term="typescript"></category><category term="coding"></category><category term="test-automation"></category><title type="html">Data Driven API Testing in Playwright TypeScript: Part 1</title><published>2026-05-23T11:51:55Z</published><updated>2026-05-23T11:51:55Z</updated><link rel="alternate" href="https://levelup.gitconnected.com/data-driven-api-testing-in-playwright-typescript-part-1-cc4f7deaf74a?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://levelup.gitconnected.com/data-driven-api-testing-in-playwright-typescript-part-1-cc4f7deaf74a?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/1920/1*Jhf3Ixz1Yo9FZiPxz-exmA.jpeg&quot; width=&quot;1920&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Learn how to implement data-driven API testing in Playwright with TypeScript using static test data and reusable tests.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://levelup.gitconnected.com/data-driven-api-testing-in-playwright-typescript-part-1-cc4f7deaf74a?source=rss-d56167afca7d------2&quot;&gt;Continue reading on Level Up Coding »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/@iamfaisalkhatri/feed"><id>tag:google.com,2005:reader/feed/https://medium.com/@iamfaisalkhatri/feed</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779537115000"><id gr:original-id="https://medium.com/p/cc4f7deaf74a">tag:google.com,2005:reader/item/00000a8300000070</id><category term="programming"></category><category term="software-testing"></category><category term="typescript"></category><category term="coding"></category><category term="test-automation"></category><title type="html">Data Driven API Testing in Playwright TypeScript: Part 1</title><published>2026-05-23T11:51:55Z</published><updated>2026-05-23T11:51:55Z</updated><link rel="alternate" href="https://levelup.gitconnected.com/data-driven-api-testing-in-playwright-typescript-part-1-cc4f7deaf74a?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://levelup.gitconnected.com/data-driven-api-testing-in-playwright-typescript-part-1-cc4f7deaf74a?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/1920/1*Jhf3Ixz1Yo9FZiPxz-exmA.jpeg&quot; width=&quot;1920&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Learn how to implement data-driven API testing in Playwright with TypeScript using static test data and reusable tests.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://levelup.gitconnected.com/data-driven-api-testing-in-playwright-typescript-part-1-cc4f7deaf74a?source=rss-d56167afca7d------2&quot;&gt;Continue reading on Level Up Coding »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/feed/@iamfaisalkhatri"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@iamfaisalkhatri</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779479440000"><id gr:original-id="https://medium.com/p/07e79898d55a">tag:google.com,2005:reader/item/0000091b00000070</id><category term="writing"></category><category term="work"></category><category term="short-story"></category><category term="humor"></category><category term="agile"></category><title type="html">The Agile Circus</title><published>2026-05-22T19:50:40Z</published><updated>2026-05-22T19:50:40Z</updated><link rel="alternate" href="https://medium.com/illumination/the-agile-circus-07e79898d55a?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-agile-circus-07e79898d55a?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/2600/0*gLRLKGAe4l1r9-b1&quot; width=&quot;6016&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A humorous story exposing fake Agile culture, endless meetings, toxic leadership, and workplace chaos in a modern corporate team.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-agile-circus-07e79898d55a?source=rss-d56167afca7d------2&quot;&gt;Continue reading on ILLUMINATION »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/@iamfaisalkhatri/feed"><id>tag:google.com,2005:reader/feed/https://medium.com/@iamfaisalkhatri/feed</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779479440000"><id gr:original-id="https://medium.com/p/07e79898d55a">tag:google.com,2005:reader/item/00000a830000006f</id><category term="writing"></category><category term="work"></category><category term="short-story"></category><category term="humor"></category><category term="agile"></category><title type="html">The Agile Circus</title><published>2026-05-22T19:50:40Z</published><updated>2026-05-22T19:50:40Z</updated><link rel="alternate" href="https://medium.com/illumination/the-agile-circus-07e79898d55a?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-agile-circus-07e79898d55a?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/2600/0*gLRLKGAe4l1r9-b1&quot; width=&quot;6016&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A humorous story exposing fake Agile culture, endless meetings, toxic leadership, and workplace chaos in a modern corporate team.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-agile-circus-07e79898d55a?source=rss-d56167afca7d------2&quot;&gt;Continue reading on ILLUMINATION »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/feed/@iamfaisalkhatri"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@iamfaisalkhatri</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779424714000"><id gr:original-id="https://scrolltest.com/selenium-vs-playwright-2026-benchmark-data/">tag:google.com,2005:reader/item/00000444000001d4</id><category term="Selenium"></category><category term="Test Automation"></category><category term="Testing"></category><category term="agile test automation"></category><category term="API Testing with Playwright"></category><category term="Automation Testing Framework Using Selenium"></category><category term="benchmark"></category><category term="migration"></category><title type="html">Selenium vs Playwright 2026: The Benchmark Data Every Migration Team Needs</title><published>2026-05-22T04:38:34Z</published><updated>2026-05-22T04:38:34Z</updated><link rel="alternate" href="https://scrolltest.com/selenium-vs-playwright-2026-benchmark-data/" type="text/html"></link><summary type="html">&lt;p&gt;Playwright now leads Selenium by 23x in npm downloads. See real benchmark data, migration traps, and an 8-week roadmap for teams considering the switch in 2026.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/selenium-vs-playwright-2026-benchmark-data/&quot;&gt;Selenium vs Playwright 2026: The Benchmark Data Every Migration Team Needs&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Promode</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779424455000"><id gr:original-id="https://scrolltest.com/n8n-qa-automation-no-code-playwright-pipelines/">tag:google.com,2005:reader/item/00000444000001d3</id><category term="DevOps"></category><category term="Test Automation"></category><category term="Testing"></category><category term="API Testing with Playwright"></category><category term="CI/CD"></category><category term="n8n"></category><category term="no-code automation"></category><category term="QA pipeline"></category><title type="html">n8n for QA Automation: Build No-Code CI Pipelines That Run Playwright Tests</title><published>2026-05-22T04:34:15Z</published><updated>2026-05-22T04:34:15Z</updated><link rel="alternate" href="https://scrolltest.com/n8n-qa-automation-no-code-playwright-pipelines/" type="text/html"></link><summary type="html">&lt;p&gt;Learn how QA teams can build no-code CI pipelines with n8n and Playwright. Step-by-step tutorial covering triggers, JUnit parsing, Slack alerts, and Jira bug creation without writing YAML.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/n8n-qa-automation-no-code-playwright-pipelines/&quot;&gt;n8n for QA Automation: Build No-Code CI Pipelines That Run Playwright Tests&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Promode</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779422400000"><id gr:original-id="https://glebbahmutov.com/blog/dom-state-clarity-with-cy-depends/">tag:google.com,2005:reader/item/0000097e00000274</id><category term="process"></category><category term="cypress"></category><title type="html">DOM State Clarity With cy.depends Command</title><published>2026-05-22T04:00:00Z</published><updated>2026-05-22T04:00:00Z</updated><link rel="alternate" href="https://glebbahmutov.com/blog/dom-state-clarity-with-cy-depends/" type="text/html"></link><summary type="html">&lt;p&gt;Imagine a simple web application scenario: you click on a button. App tries to load some data. The data might load, or the backend might return an error. You write a Cypress test:&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;cy.&lt;span&gt;visit&lt;/span&gt;(&lt;span&gt;&amp;apos;cypress/fetch-fails-sometimes.html&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;button&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetch data&amp;apos;&lt;/span&gt;).&lt;span&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;#data&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetched data: &amp;quot;List of items&amp;quot;&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;The test is green, but there are a couple of downsides.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;test is slow&lt;/strong&gt; Loading the data might take a while. In our case it takes almost 8 seconds, so your test must wait.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/fetch.png&quot; alt=&quot;The test is slow&quot;&gt;&lt;/p&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;&lt;strong&gt;mismatch in speeds&lt;/strong&gt; Network call might fail and the test times out waiting for the &lt;code&gt;#data&lt;/code&gt; element. The network error itself is fast: it returns 500 status code after only half a second. But since the successful data load is slow, we have to keep waiting and waiting for &lt;code&gt;#data&lt;/code&gt; element.&lt;/li&gt;&lt;/ol&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;it&lt;/span&gt;(&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;handles occasional backend error&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;// longer command timeout to allow for slow data load&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;  { &lt;span&gt;defaultCommandTimeout&lt;/span&gt;: &lt;span&gt;15_000&lt;/span&gt; },&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;() =&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;visit&lt;/span&gt;(&lt;span&gt;&amp;apos;cypress/fetch-fails-sometimes.html&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;button&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetch data&amp;apos;&lt;/span&gt;).&lt;span&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;#data&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetched data: &amp;quot;List of items&amp;quot;&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/error-timing.png&quot; alt=&quot;The failed test waited 30x longer than necessary&quot;&gt;&lt;/p&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;&lt;strong&gt;errors are not observed&lt;/strong&gt; The test does not report the &amp;quot;error&amp;quot; element shown. Instead the test times out looking for the &amp;quot;#data&amp;quot; element. It would be nice to write a test like this:&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;click on the button&lt;/li&gt;&lt;li&gt;wait for the &amp;quot;#data&amp;quot; element to appear and check its text&lt;/li&gt;&lt;li&gt;while waiting, if the &amp;quot;#error&amp;quot; element appears, fail the test with a clear message&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of course, we could rewrite the test to observe the network call - but not every action has a clear observable &amp;quot;single point&amp;quot;. Instead many tests have to consider several possible outcomes at once.&lt;/p&gt;&lt;h2&gt;&lt;span id=&quot;article-XptPcoEBhyFOYPHndY8ZaO_mtCI-dom-states&quot;&gt;DOM states&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In our application, the app is simple. From the starting state (before we click the button), the app goes into &amp;quot;loading data&amp;quot; state, followed by the &amp;quot;successful data load&amp;quot; OR &amp;quot;failed data load&amp;quot; states. We can ignore the &amp;quot;loading data&amp;quot; state, since our app does not really show anything observable on the page (and we ignore the network call for now). At the end of the loading state, the app might show an element with ID &amp;quot;data&amp;quot; or an element with ID &amp;quot;error&amp;quot;. Nothing else (unless things go really wrong)&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/error-element.png&quot; alt=&quot;The #error element on the page&quot;&gt;&lt;/p&gt;&lt;p&gt;In this blog post, I will show my new query command &lt;code&gt;cy.depends&lt;/code&gt; from the &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/bahmutov/cypress-if&quot;&gt;cypress-if&lt;/a&gt; plugin that lets you consider multiple possible DOM states at once. This command can wait for &lt;em&gt;all&lt;/em&gt; given selectors and then perform actions depending on the first matched selector.&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/state-diagram.png&quot; alt=&quot;cy.depends command can query multiple element selectors at once&quot;&gt;&lt;/p&gt;&lt;p&gt;Let&amp;apos;s write a test and wait simultaneously for success and error states. For now, let&amp;apos;s just print a message for each outcome.&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;button&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetch data&amp;apos;&lt;/span&gt;).&lt;span&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// simply report success or failure&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;depends&lt;/span&gt;({&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#data&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;Data loaded&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#error&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;Failed to load data&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;})&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;When the network load succeeds, we see 2 items logged into the Command Log: the query command waits for &lt;em&gt;all&lt;/em&gt; selectors using &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Selector_list&quot;&gt;all matching CSS selector&lt;/a&gt;. Once &lt;em&gt;some&lt;/em&gt; elements are found, &lt;code&gt;cy.depends&lt;/code&gt; matches the elements &lt;em&gt;again&lt;/em&gt; to the find the &lt;em&gt;first&lt;/em&gt; individual selector and performs the actions specified in the arguments object. For example, if the value is a string, it simply logs it.&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/depends-success.png&quot; alt=&quot;cy.depends for successful data load&quot;&gt;&lt;/p&gt;&lt;p&gt;Let&amp;apos;s say the network fails. Notice the &lt;code&gt;cy.depends&lt;/code&gt; matched the &lt;code&gt;#error&lt;/code&gt; element and the test finished immediately after the network load. No need to wait for &lt;code&gt;#data&lt;/code&gt; element for 15 seconds when the app is clearly in the &amp;quot;error loading&amp;quot; state.&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/depends-error.png&quot; alt=&quot;cy.depends for failed data load&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;span id=&quot;article-XptPcoEBhyFOYPHndY8ZaO_mtCI-handle-each-state&quot;&gt;Handle each state&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;We can print log messages for each state. Or we can fail the test for some states. When the test finds the &amp;quot;#error&amp;quot; element, we want to fail the test immediately, which we can by giving an Error instance.&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;button&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetch data&amp;apos;&lt;/span&gt;).&lt;span&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// report success, fail on error&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;depends&lt;/span&gt;({&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#data&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;Data loaded&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#error&amp;apos;&lt;/span&gt;: &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;&amp;apos;Failed to load data&amp;apos;&lt;/span&gt;),&lt;/span&gt;&lt;br&gt;&lt;span&gt;})&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/throws-error.png&quot; alt=&quot;cy.depends can throw the given Error instance&quot;&gt;&lt;/p&gt;&lt;p&gt;Again, the test is fast and clear. If we see an element matching &lt;code&gt;#error&lt;/code&gt; CSS selector, we want to throw the Error object. We can go beyond simply throwing an error. We could perform custom assertions on the found elements. The &lt;code&gt;cy.depends&lt;/code&gt; command yields the matched selector and found elements to the callback function&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;span&gt;11&lt;/span&gt;&lt;br&gt;&lt;span&gt;12&lt;/span&gt;&lt;br&gt;&lt;span&gt;13&lt;/span&gt;&lt;br&gt;&lt;span&gt;14&lt;/span&gt;&lt;br&gt;&lt;span&gt;15&lt;/span&gt;&lt;br&gt;&lt;span&gt;16&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;cy.&lt;span&gt;contains&lt;/span&gt;(&lt;span&gt;&amp;apos;button&amp;apos;&lt;/span&gt;, &lt;span&gt;&amp;apos;Fetch data&amp;apos;&lt;/span&gt;).&lt;span&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// do something depending on the matched selector&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;depends&lt;/span&gt;({&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#data&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;data loaded&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#error&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;load error&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;}).&lt;span&gt;then&lt;/span&gt;(&lt;span&gt;(&lt;span&gt;{ selector, elements }&lt;/span&gt;) =&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (selector === &lt;span&gt;&amp;apos;#data&amp;apos;&lt;/span&gt;) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;expect&lt;/span&gt;(elements, &lt;span&gt;&amp;apos;data element&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;      .&lt;span&gt;to&lt;/span&gt;.&lt;span&gt;have&lt;/span&gt;.&lt;span&gt;length&lt;/span&gt;(&lt;span&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;      .&lt;span&gt;and&lt;/span&gt;.&lt;span&gt;to&lt;/span&gt;.&lt;span&gt;have&lt;/span&gt;.&lt;span&gt;text&lt;/span&gt;(&lt;span&gt;&amp;apos;Fetched data: &amp;quot;List of items&amp;quot;&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  } &lt;span&gt;else&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; (selector === &lt;span&gt;&amp;apos;#error&amp;apos;&lt;/span&gt;) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;expect&lt;/span&gt;(elements, &lt;span&gt;&amp;apos;error element&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;      .&lt;span&gt;to&lt;/span&gt;.&lt;span&gt;have&lt;/span&gt;.&lt;span&gt;length&lt;/span&gt;(&lt;span&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;      .&lt;span&gt;and&lt;/span&gt;.&lt;span&gt;to&lt;/span&gt;.&lt;span&gt;have&lt;/span&gt;.&lt;span&gt;text&lt;/span&gt;(&lt;span&gt;&amp;apos;Fetch failed: Network response was not ok&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;})&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;By the way, if none of the &lt;code&gt;cy.depends&lt;/code&gt; selectors match, the query command times out and the test fails.&lt;/p&gt;&lt;h2&gt;&lt;span id=&quot;article-XptPcoEBhyFOYPHndY8ZaO_mtCI-conditional-actions&quot;&gt;Conditional actions&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Querying multiple states helps solve conditional testing problems without nesting multiple &lt;code&gt;IF/ELSE&lt;/code&gt; paths. Think of &lt;code&gt;cy.depends&lt;/code&gt; as a &lt;code&gt;switch&lt;/code&gt; statement; yes, it could be equivalent to multiple &lt;code&gt;if/else&lt;/code&gt; statements, but having one &lt;code&gt;switch&lt;/code&gt; usually beats multiple branches.&lt;/p&gt;&lt;p&gt;For example, let&amp;apos;s say we have a page with a dialog that might be open, and we always want it closed. If we don&amp;apos;t have a good programmatic way of controlling the dialog (I know, I know, but we are in the real world), then:&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;span&gt;11&lt;/span&gt;&lt;br&gt;&lt;span&gt;12&lt;/span&gt;&lt;br&gt;&lt;span&gt;13&lt;/span&gt;&lt;br&gt;&lt;span&gt;14&lt;/span&gt;&lt;br&gt;&lt;span&gt;15&lt;/span&gt;&lt;br&gt;&lt;span&gt;16&lt;/span&gt;&lt;br&gt;&lt;span&gt;17&lt;/span&gt;&lt;br&gt;&lt;span&gt;18&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;it&lt;/span&gt;(&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;closes dialog if open&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;() =&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;visit&lt;/span&gt;(&lt;span&gt;&amp;apos;cypress/close-dialog.html&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;depends&lt;/span&gt;({&lt;/span&gt;&lt;br&gt;&lt;span&gt;      &lt;span&gt;&amp;apos;dialog[open]&amp;apos;&lt;/span&gt;: &lt;span&gt;(&lt;span&gt;$dialog&lt;/span&gt;) =&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;        cy.&lt;span&gt;wrap&lt;/span&gt;($dialog).&lt;span&gt;find&lt;/span&gt;(&lt;span&gt;&amp;apos;button#close&amp;apos;&lt;/span&gt;).&lt;span&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;      },&lt;/span&gt;&lt;br&gt;&lt;span&gt;      &lt;span&gt;&amp;apos;dialog:hidden&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;dialog is already closed&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;    })&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;// check if the dialog is open&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;depends&lt;/span&gt;({&lt;/span&gt;&lt;br&gt;&lt;span&gt;      &lt;span&gt;&amp;apos;dialog[open]&amp;apos;&lt;/span&gt;: &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;&amp;apos;dialog should be closed&amp;apos;&lt;/span&gt;),&lt;/span&gt;&lt;br&gt;&lt;span&gt;      &lt;span&gt;&amp;apos;dialog:not([open])&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;closed dialog&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;    })&lt;/span&gt;&lt;br&gt;&lt;span&gt;  },&lt;/span&gt;&lt;br&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/cy-depends/dialog-is-closed.png&quot; alt=&quot;Too complicated way of closing a Dialog that might be opened&quot;&gt;&lt;/p&gt;&lt;p&gt;Of course, you can have more than two states, just list the CSS selectors ordered from the most discriminating to the least discriminating to properly determine the correct state.&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;// conditional state depending on the number of items in the list: 3, 2, or 1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;depends&lt;/span&gt;({&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#fruits li:eq(2)&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;Found 3 items&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#fruits li:eq(1)&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;Found 2 items&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;&amp;apos;#fruits li:eq(0)&amp;apos;&lt;/span&gt;: &lt;span&gt;&amp;apos;Found 1 item&amp;apos;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;})&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;Embrace and extinguish the ambiguity by handling every possible page state in your end-to-end tests.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;🎁 Find the &lt;code&gt;cy.depends&lt;/code&gt; query command in my &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/bahmutov/cypress-if&quot;&gt;cypress-if&lt;/a&gt; plugin.&lt;/p&gt;&lt;/blockquote&gt;</summary><author><name>Gleb Bahmutov</name></author><source gr:stream-id="feed/https://glebbahmutov.com/blog/atom.xml"><id>tag:google.com,2005:reader/feed/https://glebbahmutov.com/blog/atom.xml</id><title type="html">Better world by better software</title><link rel="alternate" href="https://glebbahmutov.com/blog/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779421259000"><id gr:original-id="https://scrolltest.com/docker-compose-test-automation-playwright-selenium-api-one-file/">tag:google.com,2005:reader/item/00000444000001d2</id><category term="DevOps"></category><category term="Docker"></category><category term="Testing"></category><category term="agile test automation"></category><category term="api testing"></category><category term="API Testing with Playwright"></category><category term="DevOps vs Software Testing"></category><category term="docker-compose zalenium"></category><category term="zalenium selenium grid"></category><title type="html">Docker Compose for Test Automation: One File to Run Playwright, Selenium Grid, and API Tests in 2026</title><published>2026-05-22T03:40:59Z</published><updated>2026-05-22T03:40:59Z</updated><link rel="alternate" href="https://scrolltest.com/docker-compose-test-automation-playwright-selenium-api-one-file/" type="text/html"></link><summary type="html">&lt;p&gt;Run Playwright, Selenium Grid, and API tests from one docker-compose.yml. Production-ready Docker Compose test automation setup for 2026 with health checks and CI/CD.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/docker-compose-test-automation-playwright-selenium-api-one-file/&quot;&gt;Docker Compose for Test Automation: One File to Run Playwright, Selenium Grid, and API Tests in 2026&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Promode</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779421207000"><id gr:original-id="https://scrolltest.com/manual-tester-to-ai-engineer-90-day-roadmap-india-2026/">tag:google.com,2005:reader/item/00000444000001d1</id><category term="Career Guide"></category><category term="Testing"></category><category term="AI testing"></category><category term="api testing tools python"></category><category term="career growth"></category><category term="India QA"></category><category term="LangChain"></category><title type="html">From Manual Tester to AI Engineer: The 90-Day Roadmap for Indian QA Professionals in 2026</title><published>2026-05-22T03:40:07Z</published><updated>2026-05-22T03:40:07Z</updated><link rel="alternate" href="https://scrolltest.com/manual-tester-to-ai-engineer-90-day-roadmap-india-2026/" type="text/html"></link><summary type="html">&lt;p&gt;The exact 90-day roadmap for Indian QA professionals to transition from manual testing to AI engineering. Includes real salary data from PayScale, the tools to learn, and a portfolio project that gets you hired.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/manual-tester-to-ai-engineer-90-day-roadmap-india-2026/&quot;&gt;From Manual Tester to AI Engineer: The 90-Day Roadmap for Indian QA Professionals in 2026&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Promode</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779400800000"><id gr:original-id="https://scrolltest.com/?p=7349">tag:google.com,2005:reader/item/00000444000001d0</id><category term="Career Guide"></category><category term="Testing"></category><title type="html">The QA Career Pivot Guide 2026: From Testing Features to Owning Quality Intelligence</title><published>2026-05-21T22:00:00Z</published><updated>2026-05-21T22:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/qa-career-pivot-quality-intelligence-2026/" type="text/html"></link><summary type="html">&lt;p&gt;QA is evolving from testing features to owning quality intelligence. The career pivot guide for 2026: new skills, new role titles, and how to make the transition.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/qa-career-pivot-quality-intelligence-2026/&quot;&gt;The QA Career Pivot Guide 2026: From Testing Features to Owning Quality Intelligence&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779376240000"><id gr:original-id="https://lisacrispin.com/?p=4301">tag:google.com,2005:reader/item/000004400000004f</id><category term="AI"></category><category term="Uncategorized"></category><category term="AI capabilities"></category><category term="DORA"></category><category term="improving quality"></category><category term="measurement"></category><category term="metrics"></category><category term="small experiments"></category><title type="html">Measuring for AI success and quality improvement</title><published>2026-05-21T15:10:40Z</published><updated>2026-05-21T15:10:40Z</updated><link rel="alternate" href="https://lisacrispin.com/2026/05/21/measuring-for-ai-success-and-quality-improvement/" type="text/html"></link><summary type="html">&lt;p&gt;I’ve worked primarily in a tester and quality engineering role for a few decades now. “Metrics” have always been the magic beans of improving quality. People ask me “What metrics should we use?”, as if they will reach their quality goals by measuring the right things. They want something easy, like code coverage and bug counts.&lt;/p&gt;
&lt;h4&gt;Small experiments&lt;/h4&gt;
&lt;p&gt;In my experience, it works best the other way. My teams worked to achieve one improvement goal at a time. Having agreed on the next goal, we tried experiments to move towards it step-by-step.  Then we’d figure out some way to measure whether each experiment was working. For example, one team I was on wanted to shorten our cycle time, from when we started working on a user story to when we got it into production.&lt;/p&gt;
&lt;p&gt;We decided to try &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/@mattwynne/introducing-example-mapping-42ccd15f8adf&quot;&gt;example mapping&lt;/a&gt; to get better shared understanding of each story in the planning stage. This practice should help us cut down on re-work when acceptance testing found issues. What metrics would track the success of our experiment? Besides cycle time, we could measure the percentage of stories rejected in acceptance testing. When it was reduced by half in two iterations, we kept up the example mapping.&lt;/p&gt;
&lt;h4&gt;Measuring progress in your AI journey&lt;/h4&gt;
&lt;p&gt;Today, we have AI tools to help us achieve our quality goals. The principles of building quality in throughout the whole development life cycle remain the same. AI assistance gives us new software tools that help us work smarter. Research shows that AI amplifies the strengths of high-performing organizations, and the problems of dysfunctional ones.&lt;/p&gt;
&lt;p&gt;In my view, approaching AI adoption step-by-step, iterating through small improvement experiments, is a good way to enjoy the benefits and avoid the pitfalls. Measuring appropriately to track each experiment is key.&lt;/p&gt;
&lt;p&gt;Enter the DORA AI Capabilities Model. I encourage you to go download the &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://dora.dev/ai/capabilities-model/report/&quot;&gt;DORA AI Capabilities Model Report&lt;/a&gt;. Open it in your PDF viewer of choice. Now, do a “find” on the word “measure”. Found on 23 pages! Wow! Go back to the start of the document. Check out the seven key capabilities on page 4.&lt;/p&gt;
&lt;figure id=&quot;article-B70uyijEn-jhV3LAUEeK4U1PM5Q-attachment_4303&quot; aria-describedby=&quot;caption-attachment-4303&quot; style=&quot;width: 506px&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://lisacrispin.com/wp-content/uploads/2026/05/Screenshot-2026-05-19-at-2.27.30-PM.jpg&quot;&gt;&lt;img width=&quot;506&quot; height=&quot;410&quot; fetchpriority=&quot;high&quot; decoding=&quot;async&quot; alt=&quot;seven ai capabilities from the DORA AI Capabilities Model&quot; data-orig-srcset=&quot;https://lisacrispin.com/wp-content/uploads/2026/05/Screenshot-2026-05-19-at-2.27.30-PM-1024x830.jpg 1024w, https://lisacrispin.com/wp-content/uploads/2026/05/Screenshot-2026-05-19-at-2.27.30-PM-300x243.jpg 300w, https://lisacrispin.com/wp-content/uploads/2026/05/Screenshot-2026-05-19-at-2.27.30-PM-768x623.jpg 768w, https://lisacrispin.com/wp-content/uploads/2026/05/Screenshot-2026-05-19-at-2.27.30-PM.jpg 1233w&quot; src=&quot;https://lisacrispin.com/wp-content/uploads/2026/05/Screenshot-2026-05-19-at-2.27.30-PM.jpg&quot;&gt;&lt;/a&gt;&lt;figcaption id=&quot;article-B70uyijEn-jhV3LAUEeK4U1PM5Q-caption-attachment-4303&quot;&gt;The Seven Key Capabilities&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Now read page 5, where you will learn that the report gives you details on how to get started on each of the seven capabilities. Keep reading. As you explore the detailed section for each capability, and why that capability matters for AI, you’ll learn how to improve that capability day-by-day. And, hooray, the report explains specific ways to &lt;em&gt;measure your progress&lt;/em&gt;. You’ll also find the common obstacles to successfully adopting capability.&lt;/p&gt;
&lt;p&gt;There’s a lot to digest here. You’ve got so much information here for your team to discuss. But where do you start? We’re only human, we can’t grow seven capabilities at once.&lt;/p&gt;
&lt;p&gt;No worries, the report provides detailed sections on techniques to help your team prioritize which capability to work on first. This takes an investment of time, for sure. Then your team will be ready to start iterating on those small experiments to improve the highest-priority capability. The best part is you will now know some good ways to measure your progress towards improving that capability.&lt;/p&gt;
&lt;h4&gt;Making the investment&lt;/h4&gt;
&lt;p&gt;I know this sounds overwhelming. Most people do look pretty overwhelmed by the challenges that AI brings along with its benefits. We humans tend to not make decisions based on scientific research. Yet the potential rewards of successful AI adoption, and the potential disasters of unsuccessful AI adoption, should motivate this investment. So now, go download DORA’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://dora.dev/ai/roi/report/&quot;&gt;ROI of AI-Assisted Software Development report&lt;/a&gt;. It shows the initial investment needed to reap the eventual exponential growth that AI assistance enables.&lt;/p&gt;
&lt;p&gt;Be patient, take baby steps, do one or two small experiments at a time. Make them short enough so that you know in a week or two if the experiment is working – based on those appropriate metrics you chose. At some point, your team will get past “J-curve of AI value realization” and start saving time. Rather, making time for humans to do what humans do best, while the robots do our grunt work. As the ROI of AI-Assisted Software Development report concludes,&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Invest in engineering excellence today to ensure AI acts as an amplifier of value rather than a catalyst for downstream chaos.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You’ve got the recipe books here, thanks to DORA. Invest the time now, and enjoy tracking your quality – and your enjoyment – improving faster and faster over time.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://lisacrispin.com/2026/05/21/measuring-for-ai-success-and-quality-improvement/&quot;&gt;Measuring for AI success and quality improvement&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://lisacrispin.com&quot;&gt;Holistic Testing with Lisa Crispin&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Lisa Crispin</name></author><source gr:stream-id="feed/https://lisacrispin.com/feed/"><id>tag:google.com,2005:reader/feed/https://lisacrispin.com/feed/</id><title type="html">Agile Testing with Lisa Crispin</title><link rel="alternate" href="https://lisacrispin.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779373800000"><id gr:original-id="https://thenewstack.io/?p=22824194">tag:google.com,2005:reader/item/00000b0e000000b2</id><category term="AI Engineering"></category><category term="CI/CD"></category><category term="Software Testing"></category><category term="sponsor-signadot"></category><category term="sponsored-post-contributed"></category><title type="html">CI wasn’t built for coding agents. Here’s what comes next.</title><published>2026-05-21T14:30:00Z</published><updated>2026-05-21T14:30:00Z</updated><link rel="alternate" href="https://thenewstack.io/ci-for-coding-agents/" type="text/html"></link><summary type="html">CI pipelines are too slow for AI coding agents. Learn how &amp;quot;plans&amp;quot; bring fast integration testing directly into the developer inner loop.</summary><author><name>Monica White</name></author><source gr:stream-id="feed/https://thenewstack.io/software-testing/feed/"><id>tag:google.com,2005:reader/feed/https://thenewstack.io/software-testing/feed/</id><title type="html">Software Testing Archives - The New Stack</title><link rel="alternate" href="https://thenewstack.io/software-testing/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779367614520"><id gr:original-id="tag:blogger.com,1999:blog-3868566217808655382.post-7527065130424874917">tag:google.com,2005:reader/item/000002c500000468</id><category term="Playwright"></category><title type="html">Practicing Playwright: Visual Testing With Playwright</title><published>2026-05-21T12:46:54Z</published><updated>2026-05-21T12:46:54Z</updated><link rel="alternate" href="https://www.tjmaher.com/2026/05/practicing-playwright-visual-testing.html" type="text/html"></link><summary type="html">&lt;div&gt;If you want to do some basic visual checking to see if there has been any deviation from your baseline of images, you can use Playwright. It&amp;apos;s built in! Playwright can take a snapshot of a web element, a visible viewport, or a full page, and save it in your Git repository as a baseline, failing the test if the image, page, or viewport does not match up. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;Caution:&lt;/u&gt;&lt;/b&gt; From what I have been reading, this can quickly cause your code repository to balloon in size, since Chrome, Firefox, and WebKit would each store its own golden screenshot in your repo. Also, images on Mac, Windows, and Linux all appear different pixel-by-pixel. If using a CI platform, it might be best to run visual tests only on a standard Playwright Docker image, to generate and compare snapshots. According to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testquality.com/playwright-visual-regression-guide/&quot;&gt;TestQuality&lt;/a&gt;, &amp;quot;Once a suite passes 50–100 visual tests, teams need a layer that tracks run history, surfaces flaky-test patterns across cycles, and routes confirmed defects into the team&amp;apos;s tracker — none of which lives inside the test runner itself&amp;quot;... I wonder if you can store images in an Amazon S3 bucket and hook that up as a virtual drive? ... no matter. That will be a blog post for another time... &lt;/div&gt;&lt;br&gt;Right now, we will be walking through &lt;b&gt;Butch Mayhew&lt;/b&gt;&amp;apos;s code he wrote for his LinkedIn Learning course, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/learning/learning-playwright&quot;&gt;Learning Playwright&lt;/a&gt;, found on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/learning/learning-playwright&quot;&gt;his companion GitHub site&lt;/a&gt;. &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;While the test is in a certain state you can a screenshot of the page or certain elements of the page and save them as a snapshot. The snapshots an be used as a baseline images to compare your current site against. This baseline can be periodically updated as the site evolves. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;How does this happen? With Playwright&amp;apos;s &lt;b&gt;.toHaveScreenshot( ) &lt;/b&gt;to take a screenshot and the &lt;b&gt;mask &lt;/b&gt;method that you want to leave out of the comparisons between the expected and actual screenshots. &lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;toHaveScreenshot(name)&lt;/b&gt;: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-pageassertions#page-assertions-to-have-screenshot-1&quot;&gt;Playwright.dev / Page Assertions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span&gt;&lt;a name=&quot;article-wsOvLY0-L0kDCOUG5hykYCRc7e4-more&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Our Test Site: PracticeSoftwareTesting.com&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Butch has a series of tests for the test site &lt;b&gt;Practice Software Testing&lt;/b&gt; ( &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://practicesoftwaretesting.com&quot;&gt;practicesoftwaretesting.com&lt;/a&gt; ). &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If you go to the site, you can see that there is an ever moving logo, &amp;quot;Toolshop Demo&amp;quot; which has the title &amp;quot;Practice Software Testing - Toolshop&amp;quot; . Let&amp;apos;s write a test capturing an image of the page, leaving out the moving logo. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Butch also suggested waiting for everything to be fully loaded with &amp;quot;&lt;b&gt;networkidle&lt;/b&gt;&amp;quot;. But, according to the Playwright.dev &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/next/api/class-page#page-wait-for-load-state&quot;&gt;waitForLoadState documentation&lt;/a&gt;, it says &amp;quot;Don&amp;apos;t use this method for testing, rely on web assertions to assess readiness instead&amp;quot;. Hrm. Let&amp;apos;s go with that he has for now. &lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Writing the Visual Test &lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;b&gt;&lt;u&gt;home.spec.ts&lt;/u&gt;&lt;/b&gt;&lt;pre&gt;&lt;code&gt;  test(&amp;quot;visual test&amp;quot;, async ({ page }) =&amp;gt; {
    await page.waitForLoadState(&amp;quot;networkidle&amp;quot;);
    await expect(page).toHaveScreenshot(&amp;quot;home-page-no-auth.png&amp;quot;, {
      mask: [page.getByTitle(&amp;quot;Practice Software Testing - Toolshop&amp;quot;)],
    });
  });
&lt;/code&gt;&lt;/pre&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/LinkedInLearning/learning-playwright-5911873/blob/f2bbe9ea3f079ca2cb9fb27b2c9f8bbbf06a1a99/tests/homepage/home.spec.ts#L8&quot;&gt;&lt;i&gt;
tests / homepage / homepage.spec.ts&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The first time you run this test, it fails, since there are not yet any snapshots saved. There is no &lt;b&gt;golden file&lt;/b&gt;. The second time you run it, it will pass. If you wanted to bypass this step, and just update the snapshots for this page, you can run. This regenerates any snapshots for the assertions:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;npx playwright test tests/home.spec.ts --update-snapshots&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Did a snapshot not match up with the one saved? &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You can investigate it in the built-in Playwright reports, showing differences outlined in red, the actual snapshot, the expected snapshots, and see them side-by-side. It also have a feature where you can move slider back and forth horizontally across the image investigating actual and expected snapshots. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Notice that the mask shows that image in an array. Need to mask a bunch of items on the page? You can add them all to the array. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You can also grab screenshots not just of whatever is in the viewport, or the full page beyond the fold, but also compare individual images, or elements such as popup windows. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Visual Comparisons&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;From &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-snapshots&quot;&gt;Playwright.dev Docs / Test Snapshots&lt;/a&gt;: &amp;quot;Playwright Test includes the ability to produce and visually compare screenshots using await expect(page).toHaveScreenshot(). On first execution, Playwright test will generate reference screenshots. Subsequent runs will compare against the reference&amp;quot;.&lt;h2 style=&quot;text-align: left&quot;&gt;The ToHaveScreenshot Method&lt;/h2&gt;&lt;div&gt;This is all part of Playwright.dev&amp;apos;s &lt;b&gt;PageAssertions&lt;/b&gt; class, where we are expecting the page for the actual viewable screenshot of the app to match the saved expected viewable screenshot.  ( &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-pageassertions#methods&quot;&gt;See all Options&lt;/a&gt; ). Options you can use:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;fullPage&lt;/b&gt;: You can decide to capture the entire scrollable page, setting it as &amp;quot;true&amp;quot;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;mask&lt;/b&gt;: You can tell Playwright to ignore certain areas, such as headers or footers if you are just interested in the main area of the site, finding the locators of those areas and mask them. Normally, it will be a pink box in the report to show what is masks, but you can change the &lt;b&gt;maskColor&lt;/b&gt; in &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/color_value&quot;&gt;CSS color format&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;b&gt;threshold:&lt;/b&gt; How strict should colors match? Should it be strict (0) or lax (1) or somewhere in between? The default is 0.2. &lt;/li&gt;&lt;li&gt;&lt;b&gt;omitBackground&lt;/b&gt;: When you want to hide the default white background and capture it as transparent. &lt;/li&gt;&lt;li&gt;&lt;b&gt;maxDiffPixels&lt;/b&gt; &amp;amp; &lt;b&gt;maxDiffPixelRatio&lt;/b&gt;: Shows the acceptable amount of pixels that could be different and a ratio of different pixels between 0 and 1. We can configure both using TestConfig.expect. These are turned off by default. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Matching Pixels With Pixelmatch&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Playwright uses the &lt;b&gt;pixelmatch&lt;/b&gt; JavaScript library ( &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/mapbox/pixelmatch&quot;&gt;https://github.com/mapbox/pixelmatch&lt;/a&gt; ) which is used to compare actual and expected images. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Configure Visual Checking In Playwright Config&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Want to fine tune the above variables? You can update the global configuration in your &lt;b&gt;playwright.config.ts&lt;/b&gt; file:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;import { defineConfig } from &amp;apos;@playwright/test&amp;apos;;

export default defineConfig({
  expect: {
    toHaveScreenshot: {
      // Allow up to 2% of total pixels to change 
      // (handles layout shifts/dynamic content)
      maxDiffPixelRatio: 0.02, 
      
      // Increase pixel color tolerance 
      // (0.2 blends strict pixel match with visual difference)
      threshold: 0.2,          
      
      // Automatically mask dynamic elements like blinking text cursors
      caret: &amp;apos;hide&amp;apos;,           
      
      // Ensure CSS animations are frozen on the first frame
      animations: &amp;apos;disabled&amp;apos;,  
    },
  },
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;How to Compare Product Cards?&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Let&amp;apos;s say on the PracticeSoftwareTesting.com site, you wanted to create a visual comparison of the first product card. The code could look something like this:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;

  test(&amp;apos;product card matches snapshot&amp;apos;, async ({ page }) =&amp;gt; {
    await page.goto(&amp;apos;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://practicesoftwaretesting.com&quot;&gt;https://practicesoftwaretesting.com&lt;/a&gt;&amp;apos;);

    // Locate a specific element -- here, the first product card
    const productCard = page.locator(&amp;apos;[data-test=&amp;quot;product&amp;quot;]&amp;apos;).first();

    // Wait for the image inside the card to fully load before snapping
    await productCard.locator(&amp;apos;img&amp;apos;).waitFor({ state: &amp;apos;visible&amp;apos; });

    // Compare element screenshot against stored baseline
    await expect(productCard).toHaveScreenshot(&amp;apos;product-card.png&amp;apos;);
  });

});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;How To Mask Changing Elements Such As Prices?&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Prices for a Shopping Cart will never remain stagnant. They are always changing. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Let&amp;apos;s say you just want to do visual checking on the basic layout. Every time the prices change, you don&amp;apos;t want the visual test to fail. What you can do is just mask out all the prices, which are with the ids &amp;quot;product-price&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;// tests/full-page-screenshot.spec.ts
import { test, expect } from &amp;apos;@playwright/test&amp;apos;;

test(&amp;apos;homepage layout matches snapshot, prices masked&amp;apos;, async ({ page }) =&amp;gt; {
  await page.goto(&amp;apos;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://practicesoftwaretesting.com&quot;&gt;https://practicesoftwaretesting.com&lt;/a&gt;&amp;apos;);

  await expect(page).toHaveScreenshot(&amp;apos;homepage.png&amp;apos;, {
    // Mask elements whose content changes between runs
    mask: [
      page.locator(&amp;apos;[data-test=&amp;quot;product-price&amp;quot;]&amp;apos;),
    ],
    // Pixel-level tolerance -- useful when anti-aliasing differs
    maxDiffPixelRatio: 0.02,
  });
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;... And if you wanted even more fine tuning, you could choose to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://applitools.com/docs/eyes/playwright&quot;&gt;Integrate Applitools with Playwright&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Running Visual Testing in CI Platforms&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Let&amp;apos;s say you are running visual testing in a CI environment: Make sure you generate the snapshots against what is in CI, and not your local environment or there will be pixel differences. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If you are using Playwright&amp;apos;s pre-built Docker Image (&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/docker&quot;&gt;see docs&lt;/a&gt; ) make sure to update the images in the container you are using. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;According top &lt;b&gt;TestQuality.com&lt;/b&gt;: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testquality.com/playwright-visual-regression-guide/&quot;&gt;Playwright Visual Regression Testing: A Production Guide to Baselines, Flake, and CI&lt;/a&gt;, &amp;quot;Native Playwright visual regression is free to start and expensive to scale. The cost shows up in CI, not on day one&amp;quot;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The problem&lt;/b&gt; is that &amp;quot;Windows, macOS, and Linux render fonts, anti-aliasing, and pixel spacing differently. A baseline captured on a developer&amp;apos;s Mac will fail when compared against a screenshot taken on the Linux CI runner, even when the application code has not changed&amp;quot;.&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The solution&lt;/b&gt;? &amp;quot;[A] Dockerfile based on the official Playwright image, plus docker-compose mounting screenshot volumes so developers run the same Linux rendering engine locally that the CI runner uses. A single command brings up the same environment everywhere, which eliminates &amp;apos;works on my machine&amp;apos; visual discrepancies entirely&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;How to manage them&lt;/b&gt;? &amp;quot;Playwright visual regression CI integration requires treating visual checks as a separate, isolated pipeline stage. Tag visual tests with @visual, exclude them from standard runs using --grep-invert, and execute them in a dedicated Docker step. This keeps functional feedback fast and quarantines visual flake to a controlled environment&amp;quot;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Any other problems&lt;/b&gt;? &amp;quot;Storage is the harder problem. Native baselines live in the Git repository, with one image per browser engine — a ten-test suite covering Chromium, Firefox, and WebKit produces thirty committed images. The repo grows fast, but the bigger pain is approval. GitHub, GitLab, and most version control UIs cannot diff images inline. When a baseline updates, the reviewer sees a binary file change with no visible context. Resolving the conflict requires pulling the branch locally, opening the images side by side, copying the new baseline into the feature branch, and pushing manually. House calls this &amp;apos;GitHub diff blindness,&amp;apos; and it is the single biggest reason teams move off native after a few months&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Happy Testing! &lt;br&gt;&lt;br&gt;
-T.J. Maher&lt;br&gt;
Software Engineer in Test&lt;br&gt;
&lt;br&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://bsky.app/profile/tjmaher1.bsky.social&quot;&gt;BlueSky&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://bit.ly/tj_youtube&quot;&gt;YouTube&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/tjmaher1&quot;&gt;LinkedIn&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://www.tjmaher.com/p/media.html&quot;&gt;Articles&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</summary><author><name>T.J. Maher</name></author><source gr:stream-id="feed/http://www.tjmaher.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/http://www.tjmaher.com/feeds/posts/default</id><title type="html">Adventures in Automation</title><link rel="alternate" href="https://www.tjmaher.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779350706623"><id gr:original-id="10.1002/stvr.70022">tag:google.com,2005:reader/item/00000fe100000009</id><category term="RESEARCH ARTICLE"></category><title type="html">An Approach of Structure‐Enhanced Code‐Centric Graph Learning for Just‐in‐Time Software Vulnerability Detection</title><published>2026-05-21T08:05:06Z</published><updated>2026-05-21T08:05:06Z</updated><link rel="alternate" href="https://onlinelibrary.wiley.com/doi/10.1002/stvr.70022?af=R" type="text/html"></link><summary type="html">&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://onlinelibrary.wiley.com/cms/asset/b6fe0e42-49df-4956-9cb2-e3bd42732211/stvr70022-toc-0001-m.png&quot; alt=&quot;An Approach of Structure-Enhanced Code-Centric Graph Learning for Just-in-Time Software Vulnerability Detection&quot;&gt;
&lt;p&gt;Our proposed SCGL model is a dual-view graph learning framework that combines relation-aware local and global structural modelling of code transformation graphs to improve just-in-time (JIT) vulnerability detection. Benchmark experiments demonstrate our SCGL model&amp;apos;s effectiveness over state-of-the-art baselines in addressing the JIT software vulnerability detection problem.&lt;/p&gt;
&lt;br&gt;
&lt;h2&gt;ABSTRACT&lt;/h2&gt;
&lt;p&gt;In recent years, just-in-time vulnerability detection (JIT-VD) has become an essential strategy for improving software security, as JIT-VD can enable the immediate identification of vulnerable or flawed code-commits at the moment they are introduced. Unlike traditional vulnerability detection approaches, which scan entire repositories as well as often producing delayed or excessive reports, JIT-VD delivers timely alerts that allow developers to address security issues while the rationale behind their changes is still clear. This approach reduces remediation costs, prevents the propagation of vulnerabilities into production and aligns well with agile development practices. However, JIT-VD remains challenging because it must capture complex dependencies between recent modifications and the existing codebase to correctly differentiate between safe and risky code-commits. Recent studies have employed code transformation graphs (CTGs) to model the semantic relationships between consecutive commits, using graph neural networks (GNNs) to learn vulnerability patterns. Although CTG-based techniques have achieved promising results, most existing models primarily preserve local structural information, thus neglecting the global structural context that reflects how changes affect the broader system. This oversight limits their ability to identify vulnerabilities caused by indirect or cross-module interactions. To overcome these limitations, we propose SCGL, a structure-enhanced code-centric graph learning framework that integrates relation-aware local modelling via RGCN with global structural representation learning using GIN. This dual-view design allows our proposed SCGL model to capture both fine-grained local relations as well as high-level global dependencies within CTGs. By better leveraging these enriched representations, our SCGL model can significantly improve JIT-VD predictions. Comprehensive experiments on benchmark datasets confirm that our SCGL model consistently surpasses state-of-the-art methods, thus demonstrating the value of incorporating global context alongside local features in vulnerability detection.&lt;/p&gt;</summary><author><name>Phu Pham, Son Nguyen‐Hai</name></author><source gr:stream-id="feed/https://onlinelibrary.wiley.com/action/showFeed?type=etoc&amp;feed=rss&amp;jc=10991689"><id>tag:google.com,2005:reader/feed/https://onlinelibrary.wiley.com/action/showFeed?type=etoc&amp;feed=rss&amp;jc=10991689</id><title type="html">Wiley: Software Testing, Verification and Reliability: Table of Contents</title><link rel="alternate" href="https://onlinelibrary.wiley.com/journal/10991689?af=R" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779350706623"><id gr:original-id="10.1002/stvr.70014">tag:google.com,2005:reader/item/00000fe100000008</id><category term="ISSUE INFORMATION"></category><title type="html">Issue Information</title><published>2026-05-21T08:05:06Z</published><updated>2026-05-21T08:05:06Z</updated><link rel="alternate" href="https://onlinelibrary.wiley.com/doi/10.1002/stvr.70014?af=R" type="text/html"></link><summary type="html">&lt;p&gt;No abstract is available for this article.&lt;/p&gt;</summary><author><name></name></author><source gr:stream-id="feed/https://onlinelibrary.wiley.com/action/showFeed?type=etoc&amp;feed=rss&amp;jc=10991689"><id>tag:google.com,2005:reader/feed/https://onlinelibrary.wiley.com/action/showFeed?type=etoc&amp;feed=rss&amp;jc=10991689</id><title type="html">Wiley: Software Testing, Verification and Reliability: Table of Contents</title><link rel="alternate" href="https://onlinelibrary.wiley.com/journal/10991689?af=R" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779342169000"><id gr:original-id="https://medium.com/p/e18d7ca39eaa">tag:google.com,2005:reader/item/0000091b0000006f</id><category term="nonfiction"></category><category term="comedy"></category><category term="short-story"></category><category term="writing"></category><category term="humor"></category><title type="html">The Coffee Stir Stick</title><published>2026-05-21T05:42:49Z</published><updated>2026-05-21T05:42:49Z</updated><link rel="alternate" href="https://medium.com/illumination/the-coffee-stir-stick-e18d7ca39eaa?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-coffee-stir-stick-e18d7ca39eaa?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/2048/0*Wy_o_Yonct7CEt6U&quot; width=&quot;2048&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A funny office story about a new employee, coffee stir sticks, workplace culture, awkward moments, and unforgettable laughter.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-coffee-stir-stick-e18d7ca39eaa?source=rss-d56167afca7d------2&quot;&gt;Continue reading on ILLUMINATION »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/@iamfaisalkhatri/feed"><id>tag:google.com,2005:reader/feed/https://medium.com/@iamfaisalkhatri/feed</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779342169000"><id gr:original-id="https://medium.com/p/e18d7ca39eaa">tag:google.com,2005:reader/item/00000a830000006e</id><category term="nonfiction"></category><category term="comedy"></category><category term="short-story"></category><category term="writing"></category><category term="humor"></category><title type="html">The Coffee Stir Stick</title><published>2026-05-21T05:42:49Z</published><updated>2026-05-21T05:42:49Z</updated><link rel="alternate" href="https://medium.com/illumination/the-coffee-stir-stick-e18d7ca39eaa?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-coffee-stir-stick-e18d7ca39eaa?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/2048/0*Wy_o_Yonct7CEt6U&quot; width=&quot;2048&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A funny office story about a new employee, coffee stir sticks, workplace culture, awkward moments, and unforgettable laughter.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/illumination/the-coffee-stir-stick-e18d7ca39eaa?source=rss-d56167afca7d------2&quot;&gt;Continue reading on ILLUMINATION »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/feed/@iamfaisalkhatri"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@iamfaisalkhatri</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779339226000"><id gr:original-id="https://scrolltest.com/langchain-testers-rag-documentation-agents-2026/">tag:google.com,2005:reader/item/00000444000001cf</id><category term="AI Testing"></category><category term="Testing"></category><category term="AI testing"></category><category term="api testing tools python"></category><category term="LangChain"></category><category term="salesforce tooling api test coverage"></category><category term="Test Documentation"></category><title type="html">LangChain for Testers: How QA Teams Can Build RAG-Based Test Documentation Agents in 2026</title><published>2026-05-21T04:53:46Z</published><updated>2026-05-21T04:53:46Z</updated><link rel="alternate" href="https://scrolltest.com/langchain-testers-rag-documentation-agents-2026/" type="text/html"></link><summary type="html">&lt;p&gt;Learn how QA teams can build RAG-based test documentation agents with LangChain in 2026. Step-by-step guide with code, vector DB choices, and retrieval strategies.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/langchain-testers-rag-documentation-agents-2026/&quot;&gt;LangChain for Testers: How QA Teams Can Build RAG-Based Test Documentation Agents in 2026&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Promode</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1779338262000"><id gr:original-id="https://scrolltest.com/visual-regression-testing-playwright-production-guide/">tag:google.com,2005:reader/item/00000444000001ce</id><category term="Playwright tutorial Java"></category><category term="Testing"></category><category term="agile test automation"></category><category term="API Testing with Playwright"></category><category term="CI/CD"></category><category term="docker"></category><category term="visual regression"></category><title type="html">Visual Regression Testing with Playwright: A Production-Ready Setup Guide for 2026</title><published>2026-05-21T04:37:42Z</published><updated>2026-05-21T04:37:42Z</updated><link rel="alternate" href="https://scrolltest.com/visual-regression-testing-playwright-production-guide/" type="text/html"></link><summary type="html">&lt;p&gt;Learn how to set up a production-ready visual regression pipeline with Playwright in 2026. Docker, sharding, masks, and CI/CD integration included.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/visual-regression-testing-playwright-production-guide/&quot;&gt;Visual Regression Testing with Playwright: A Production-Ready Setup Guide for 2026&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Promode</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry></feed>