<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Wissem</title>
    <description>The latest articles on Forem by Wissem (@wissemd).</description>
    <link>https://forem.com/wissemd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3779925%2F4036b6d6-23c7-4536-aee3-d6cc35027cd5.jpg</url>
      <title>Forem: Wissem</title>
      <link>https://forem.com/wissemd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wissemd"/>
    <language>en</language>
    <item>
      <title>I built a QA companion that lives in your browser — click any element, get ready-to-paste automation code</title>
      <dc:creator>Wissem</dc:creator>
      <pubDate>Wed, 18 Feb 2026 17:18:11 +0000</pubDate>
      <link>https://forem.com/wissemd/i-built-a-qa-companion-that-lives-in-your-browser-click-any-element-get-ready-to-paste-1iob</link>
      <guid>https://forem.com/wissemd/i-built-a-qa-companion-that-lives-in-your-browser-click-any-element-get-ready-to-paste-1iob</guid>
      <description>&lt;p&gt;I've been doing QA automation for 7 years. And for 7 years, part of my day looked exactly like this:&lt;/p&gt;

&lt;p&gt;Open DevTools. Inspect an element. Figure out which attribute is stable enough to use as a selector. Wrap it in the right syntax for whatever framework the project uses. Paste it into the test file. Repeat 50 times.&lt;/p&gt;

&lt;p&gt;It's not hard work. But it's slow, repetitive, and completely manual. And every time a developer refactors the DOM, half your selectors break and you start over.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built something.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;QA Power-Click is a free Chrome extension that lives in your browser as a sidebar. You hover over any element on any website, click it, pick an action, and get a ready-to-paste code snippet.&lt;/p&gt;

&lt;p&gt;No DevTools. No copy-pasting. No manual selector writing.&lt;/p&gt;

&lt;p&gt;It supports 5 frameworks out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright (JavaScript/TypeScript)&lt;/li&gt;
&lt;li&gt;Cypress&lt;/li&gt;
&lt;li&gt;Selenium Python&lt;/li&gt;
&lt;li&gt;Selenium Java&lt;/li&gt;
&lt;li&gt;Robot Framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You pick your framework from a dropdown and the code updates instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hard part: stable selectors
&lt;/h2&gt;

&lt;p&gt;Anyone can grab a CSS selector. The hard part is grabbing one that won't break next sprint.&lt;/p&gt;

&lt;p&gt;QA Power-Click uses a scoring engine that ranks every possible selector for a given element and picks the most stable one automatically. The priority order looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data-testid / data-qa / data-cy — 100 points, stops here if found&lt;/li&gt;
&lt;li&gt;aria-label / aria-labelledby — 80 to 85 points&lt;/li&gt;
&lt;li&gt;name attribute — 80 points&lt;/li&gt;
&lt;li&gt;stable ID — 88 points&lt;/li&gt;
&lt;li&gt;text content — 75 points&lt;/li&gt;
&lt;li&gt;CSS class — 10 points, absolute last resort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also detects and avoids over 100 dynamic ID patterns. Things like ember123, React's :r1a: UIDs, UUIDs, Angular's ng-content-456, and Webpack hashed classes. If an ID looks generated, the engine skips it and finds something better. If nothing is unique on its own, it stacks multiple attributes together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"user_email"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The framework switching problem
&lt;/h2&gt;

&lt;p&gt;Writing a Playwright snippet is different from writing a Cypress one. Different syntax, different imports, different assertion methods. Switching frameworks on a project used to mean rewriting everything.&lt;/p&gt;

&lt;p&gt;QA Power-Click generates the full snippet, not just the selector. The correct syntax, 42+ actions and assertions, and proper imports — all per framework.&lt;/p&gt;

&lt;p&gt;For example, clicking a button generates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Playwright:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="submit-btn"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cypress:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="submit-btn"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Selenium Python:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSS_SELECTOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[data-testid=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;submit-btn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same element. One click. Correct code for every framework.&lt;/p&gt;




&lt;h2&gt;
  
  
  The form filler
&lt;/h2&gt;

&lt;p&gt;Manual QA means filling out the same test forms over and over. Name, email, phone, address — every regression cycle.&lt;/p&gt;

&lt;p&gt;I added a Magic Form Filler that detects 16 field types by analyzing the field's name, placeholder, label, and aria attributes. It fills them with realistic fake data in one click.&lt;/p&gt;

&lt;p&gt;The tricky part was React and Vue apps. They track input values internally and ignore direct DOM value injection. The fix was using nativeInputValueSetter to bypass the framework's value tracking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nativeInputValueSetter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOwnPropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;nativeInputValueSetter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bubbles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This triggers the framework's state update correctly. Works on React, Vue, and Angular.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other things it handles
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Shadow DOM:&lt;/strong&gt; piercing selectors using Playwright's locator chaining syntax for web components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iframes:&lt;/strong&gt; cross-origin iframe detection with fallback methods, including frame-switching code baked into the generated snippet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Match Navigator:&lt;/strong&gt; if your selector matches multiple elements on the page, you can navigate between them with arrow keys, same as Chrome DevTools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canvas rendering:&lt;/strong&gt; the selector display uses a canvas element so DevTools search doesn't find and highlight your own selectors while you're testing them. Small detail but it matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;A user already asked for Playwright .NET support so that's coming next. After that I want to build a Page Object Generator — select multiple elements across a page, export a complete page object file ready to drop into your project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's completely free. No account, no limits, no premium tier.&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/qa-power-click/plahmnboldnflklpaleifnhjniglnkhd" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/qa-power-click/plahmnboldnflklpaleifnhjniglnkhd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it I'd love to hear what you think. Especially what frameworks or features are missing for your workflow.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
