<?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: Emmanuel Salazar </title>
    <description>The latest articles on Forem by Emmanuel Salazar  (@emmanuelsalazar92).</description>
    <link>https://forem.com/emmanuelsalazar92</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%2F3376776%2F98267d63-b07c-4432-9397-0cdc812dc2eb.jpg</url>
      <title>Forem: Emmanuel Salazar </title>
      <link>https://forem.com/emmanuelsalazar92</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/emmanuelsalazar92"/>
    <language>en</language>
    <item>
      <title>Tutorial: Selenium WebDriver + Reqnroll</title>
      <dc:creator>Emmanuel Salazar </dc:creator>
      <pubDate>Sat, 11 Oct 2025 22:52:06 +0000</pubDate>
      <link>https://forem.com/emmanuelsalazar92/tutorial-selenium-webdriver-reqnroll-186i</link>
      <guid>https://forem.com/emmanuelsalazar92/tutorial-selenium-webdriver-reqnroll-186i</guid>
      <description>&lt;h3&gt;
  
  
  Complete Step-by-Step Tutorial
&lt;/h3&gt;

&lt;p&gt;This tutorial provides a &lt;strong&gt;complete, step-by-step guide&lt;/strong&gt; to creating an&lt;br&gt;
automated testing framework using &lt;strong&gt;Selenium&lt;/strong&gt;, &lt;strong&gt;Gherkin (BDD)&lt;/strong&gt;, and&lt;br&gt;
&lt;strong&gt;Reqnroll&lt;/strong&gt; in &lt;strong&gt;Visual Studio 2022&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll learn how to set up your environment, configure dependencies, and&lt;br&gt;
write your first executable feature file with &lt;strong&gt;readable test&lt;br&gt;
scenarios&lt;/strong&gt; that bridge the gap between business and technical teams.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 Step 1 --- Verify Reqnroll Installation
&lt;/h2&gt;

&lt;p&gt;Before creating your first automation project, make sure that the&lt;br&gt;
&lt;strong&gt;"Reqnroll for Visual Studio 2022"&lt;/strong&gt; extension is installed. &lt;br&gt;
This extension provides the structure and templates required to build a&lt;br&gt;
&lt;strong&gt;Behavior-Driven Development (BDD)&lt;/strong&gt; framework using Gherkin and&lt;br&gt;
Selenium.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Visual Studio 2022.&lt;/strong&gt; &lt;br&gt;
From the start window, choose &lt;strong&gt;"Continue without code."&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24x5qukefs31wfppdhsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24x5qukefs31wfppdhsx.png" alt="Visual Studio Main&amp;lt;br&amp;gt;
Page" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open the Extensions Manager.&lt;/strong&gt; &lt;br&gt;
Navigate to &lt;strong&gt;Extensions → Manage Extensions&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc2pth4r4y9ei4q9hzesd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc2pth4r4y9ei4q9hzesd.png" alt="Options in the top menu&amp;lt;br&amp;gt;
bar" width="436" height="161"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search for "Reqnroll for Visual Studio 2022."&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3rf4ahhuf9nas4ssimkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3rf4ahhuf9nas4ssimkj.png" alt="Extension&amp;lt;br&amp;gt;
description" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check installation status.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   If it shows **Uninstall**, the extension is already installed. 
-   If not, click **Install**, wait for it to complete, and
    **restart Visual Studio**.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Tip:&lt;/em&gt; Reqnroll is the open-source successor to SpecFlow --- fully&lt;br&gt;
compatible with .NET 8 and Visual Studio 2022.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧩 Step 2 --- Create a Reqnroll Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open the "Create a New Project" window.&lt;/strong&gt; &lt;br&gt;
From the start screen, click &lt;strong&gt;Create a new project&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search for "Reqnroll Project."&lt;/strong&gt; &lt;br&gt;
Select it from the list and click &lt;strong&gt;Next&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejbzlobnkzotfqxm2uy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejbzlobnkzotfqxm2uy1.png" alt="Create a new Project with Reqnroll&amp;lt;br&amp;gt;
Project" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure project details.&lt;/strong&gt; &lt;br&gt;
Enter a &lt;strong&gt;Project name&lt;/strong&gt;, choose a &lt;strong&gt;Location&lt;/strong&gt;, and set the    &lt;strong&gt;Solution name&lt;/strong&gt;. &lt;br&gt;
Click &lt;strong&gt;Create&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5g0gm1l4b76ejjxdj5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5g0gm1l4b76ejjxdj5e.png" alt="Project&amp;lt;br&amp;gt;
name" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select your testing framework.&lt;/strong&gt; &lt;br&gt;
Choose &lt;strong&gt;MSTest&lt;/strong&gt; as the Test Framework, then click &lt;strong&gt;Create&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62z02i471p9o3rku8td9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62z02i471p9o3rku8td9.png" alt="Framework and Test&amp;lt;br&amp;gt;
Framework" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify the template.&lt;/strong&gt; &lt;br&gt;
By default, a sample project called &lt;strong&gt;Calculator&lt;/strong&gt; is generated to     demonstrate structure. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwxoobwq0lgf9sggxp1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwxoobwq0lgf9sggxp1b.png" alt="Calculator" width="408" height="507"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🧩 Step 3 --- Add Selenium Dependencies
&lt;/h2&gt;

&lt;p&gt;To interact with browsers, you need to install Selenium via &lt;strong&gt;NuGet&lt;br&gt;
Packages&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;strong&gt;Tools → NuGet Package Manager → Manage NuGet Packages for     Solution...&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fveh98xlzq0s8lgasnbtt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fveh98xlzq0s8lgasnbtt.png" alt="NuGet&amp;lt;br&amp;gt;
Packages" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the &lt;strong&gt;Browse&lt;/strong&gt; tab, search and install:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   `Selenium.WebDriver`
-   `Selenium.WebDriver.ChromeDriver`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Tip:&lt;/em&gt; Ensure the &lt;strong&gt;ChromeDriver&lt;/strong&gt; version matches your installed&lt;br&gt;
version of Google Chrome.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧩 Step 4 --- Create a Feature File and Step Definitions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open the Solution Explorer&lt;/strong&gt; and locate the &lt;strong&gt;Features&lt;/strong&gt; folder. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67etm5nbxa1dz8u4bdyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67etm5nbxa1dz8u4bdyi.png" alt="Features&amp;lt;br&amp;gt;
Folder" width="472" height="351"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add a new Feature File.&lt;/strong&gt; &lt;br&gt;
Right-click &lt;strong&gt;Features → Add → New Item&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the template.&lt;/strong&gt; &lt;br&gt;
Select &lt;strong&gt;Reqnroll → Feature File for Reqnroll&lt;/strong&gt;, then click     &lt;strong&gt;Add&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfmm52v1faryj92jmivz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfmm52v1faryj92jmivz.png" alt="Reqnroll&amp;lt;br&amp;gt;
Items" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name the file (e.g., &lt;code&gt;Search.feature&lt;/code&gt;)&lt;/strong&gt; and click &lt;strong&gt;Add&lt;/strong&gt;. &lt;br&gt;
You'll now have an empty &lt;code&gt;.feature&lt;/code&gt; file with Gherkin structure. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ora5ihzcxj5qhz1c15a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ora5ihzcxj5qhz1c15a.png" alt="Search&amp;lt;br&amp;gt;
BDD" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write your first BDD scenario:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Search
  Perform a search on DuckDuckGo to validate that results are displayed correctly.

  @smoke @search
  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Search for a keyword in DuckDuckGo
    &lt;span class="nf"&gt;Given &lt;/span&gt;the user navigates to the DuckDuckGo homepage
    &lt;span class="nf"&gt;When &lt;/span&gt;the user searches for &lt;span class="s"&gt;"Reqnroll BDD"&lt;/span&gt;
    &lt;span class="nf"&gt;Then &lt;/span&gt;the search results should contain the word &lt;span class="s"&gt;"Reqnroll"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build the project.&lt;/strong&gt; &lt;br&gt;
The Gherkin text will turn &lt;strong&gt;purple&lt;/strong&gt;, indicating that steps are&lt;br&gt;
recognized but not yet implemented. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zacsc9n4cq7038qf0qt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zacsc9n4cq7038qf0qt.png" alt="Purple&amp;lt;br&amp;gt;
Gherkin" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate the step definitions.&lt;/strong&gt; &lt;br&gt;
Right-click any Gherkin line → &lt;strong&gt;Define Steps...&lt;/strong&gt; → &lt;strong&gt;Create&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppw4clocbhbf90lw9n8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppw4clocbhbf90lw9n8n.png" alt="Step Definitions&amp;lt;br&amp;gt;
Creation" width="800" height="450"&gt;&lt;/a&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnaywom9g06xryk6by5p0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnaywom9g06xryk6by5p0.png" alt="Steps Definitions&amp;lt;br&amp;gt;
File" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🧩 Step 5 --- Using Selenium WebDriver with Chrome
&lt;/h2&gt;

&lt;p&gt;The following steps demonstrate a &lt;strong&gt;minimal viable automation test&lt;/strong&gt;&lt;br&gt;
using Reqnroll. &lt;br&gt;
The objective is to show the Given/When/Then flow applied to a simple&lt;br&gt;
web search.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Note:&lt;/em&gt; &lt;br&gt;
Best practices like &lt;strong&gt;hooks (Before/After)&lt;/strong&gt; and &lt;strong&gt;Page Object Model&lt;br&gt;
(POM)&lt;/strong&gt; will be covered in later tutorials. &lt;br&gt;
For now, we'll just make it work end to end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  1️⃣ Create the WebDriver
&lt;/h3&gt;

&lt;p&gt;First, we must create our WebDriver in the same class and specify which browser to use.&lt;br&gt;
In this case, we’ll use Google Chrome:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;IWebDriver&lt;/span&gt; &lt;span class="n"&gt;webDriver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ChromeDriver&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🧠 You don't need to manually download &lt;code&gt;chromedriver.exe&lt;/code&gt;. &lt;br&gt;
Selenium Manager handles driver setup automatically.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2️⃣ Given Step --- Navigate to the Homepage
&lt;/h3&gt;

&lt;p&gt;The Given step defines the starting context of the test.&lt;br&gt;
Here, we specify which page the browser should open using Navigate().GoToUrl():&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"the user navigates to the DuckDuckGo homepage"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;GivenTheUserNavigatesToTheDuckDuckGoHomepage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;webDriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Navigate&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;GoToUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://duckduckgo.com/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3️⃣ When Step --- Perform the Search
&lt;/h3&gt;

&lt;p&gt;In the When step, we define the action that will be performed.&lt;br&gt;
In this example, the user searches for a keyword in the search box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;When&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"the user searches for {string}"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;WhenTheUserSearchesFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webDriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindElement&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="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendKeys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Submit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;We locate the input by &lt;strong&gt;name="q"&lt;/strong&gt;, send the text, and submit the&lt;br&gt;
form.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  4️⃣ Then Step --- Validate the Result
&lt;/h3&gt;

&lt;p&gt;The Then step is used to validate the expected outcome.&lt;br&gt;
We look for a search result link that matches our keyword and use an Assert to verify it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"the search results should contain the word {string}"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ThenTheSearchResultsShouldContainTheWord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;reqnroll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webDriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindElement&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="nf"&gt;LinkText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqnroll&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqnroll&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ If the searched word appears among results, the test passes. &lt;br&gt;
❌ Otherwise, the assertion fails.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  5️⃣ Run the Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Open &lt;strong&gt;View → Test Explorer&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt; Run the test from there. &lt;/li&gt;
&lt;li&gt; The browser will stay open after execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ That's normal --- we haven't added an &lt;strong&gt;After hook&lt;/strong&gt; to close the&lt;br&gt;
browser yet. &lt;br&gt;
We'll improve that in the next tutorial.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3z04qo5ogevtrd7f4e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3z04qo5ogevtrd7f4e2.png" alt="Test Explorer Result" width="792" height="858"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusion
&lt;/h2&gt;

&lt;p&gt;You've just created your first &lt;strong&gt;BDD test using Reqnroll and&lt;br&gt;
Selenium&lt;/strong&gt;! &lt;br&gt;
From here, you can extend it with: - &lt;code&gt;BeforeScenario&lt;/code&gt; / &lt;code&gt;AfterScenario&lt;/code&gt;&lt;br&gt;
hooks &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Page Object Model (POM)&lt;/strong&gt; pattern &lt;/li&gt;
&lt;li&gt;Custom assertions and reusable steps &lt;/li&gt;
&lt;li&gt;CI/CD integration with GitHub Actions or Azure Pipelines&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>tutorial</category>
      <category>reqnroll</category>
      <category>selenium</category>
    </item>
    <item>
      <title>The Invisible Cost of Flaky Tests</title>
      <dc:creator>Emmanuel Salazar </dc:creator>
      <pubDate>Thu, 31 Jul 2025 21:28:34 +0000</pubDate>
      <link>https://forem.com/emmanuelsalazar92/the-invisible-cost-of-flaky-tests-3fhe</link>
      <guid>https://forem.com/emmanuelsalazar92/the-invisible-cost-of-flaky-tests-3fhe</guid>
      <description>&lt;p&gt;Everything has a cost. And today, I want to talk about the costs we rarely mention in test automation—financial cost and trust.&lt;/p&gt;

&lt;p&gt;The financial side is often heard but not really felt. We spend hours in meetings that yield no clear results, affecting team efficiency and wasting time and money.&lt;br&gt;
The second cost, trust, is the currency we trade when we ask for more responsibilities or resources—and our leaders have to decide whether to trust us or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔁 The Problem: Tests that Fail… Sometimes&lt;/strong&gt;&lt;br&gt;
In test automation, we use the term flaky to describe tests that are unstable—tests that pass sometimes, and fail other times, without any changes in the code.&lt;/p&gt;

&lt;p&gt;You run the test 10 times on your machine and it passes. But when it's part of the full suite, it randomly fails. You rerun the suite to isolate the issue… and now it works again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💸 Where Invisible Costs Start Adding Up&lt;/strong&gt;&lt;br&gt;
This is where the hidden costs begin to surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time spent investigating “why it failed.”&lt;/li&gt;
&lt;li&gt;Manual reruns to reproduce the issue.&lt;/li&gt;
&lt;li&gt;Interrupting developers to ask about expected behaviors.&lt;/li&gt;
&lt;li&gt;QA losing focus while chasing phantom failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All this while the clock keeps ticking.&lt;br&gt;
Not only are you burning hours—you’re losing the team’s confidence in automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ When the Test Suite Stops Being Useful&lt;/strong&gt;&lt;br&gt;
This directly impacts the team. When we say “we have automation,” people assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most of the system is covered.&lt;/li&gt;
&lt;li&gt;Every new release will be validated by running the suite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if only 20% of tests are consistently reliable, the value drops fast.&lt;br&gt;
Automation becomes more of a liability than a safety net.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 What Can We Do About It?&lt;/strong&gt;&lt;br&gt;
We know maintaining the suite is part of the job. Each team might take a different path, but some common strategies include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controlled use of retry logic in specific test scenarios.&lt;/li&gt;
&lt;li&gt;Temporarily disabling flaky tests and tracking them in a technical backlog.&lt;/li&gt;
&lt;li&gt;Rewriting unstable tests from a new perspective.&lt;/li&gt;
&lt;li&gt;In extreme cases, migrating to a more stable infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever the path, we can’t afford to delay decisions. Automation is a shared responsibility, not something one person carries alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗣️ Communicating is Leading&lt;/strong&gt;&lt;br&gt;
If something fails, say it clearly.&lt;br&gt;
Explain what happened, why it failed, what the impact is, and how long fixing it might take.&lt;/p&gt;

&lt;p&gt;Because when confidence is gone, the issue isn’t just “a flaky test”—it’s the credibility of your quality process that’s at stake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Final Thought: Automation is Also a Product&lt;/strong&gt;&lt;br&gt;
Test automation is not “just another tool.” It’s the product that validates the product your customer actually cares about.&lt;/p&gt;

&lt;p&gt;That’s why our communication must be clear, transparent, and focused on continuous improvement.&lt;/p&gt;

&lt;p&gt;Each day, our goal is not just to automate more, but to deliver more value with less noise and greater confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💬 What about you?&lt;/strong&gt;&lt;br&gt;
Have flaky tests ever drained time or trust in your team?&lt;br&gt;
What strategies have helped you bring stability back to your pipeline?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>QA | Leading Also Means Deciding Without Slowing Down the Team</title>
      <dc:creator>Emmanuel Salazar </dc:creator>
      <pubDate>Wed, 23 Jul 2025 17:21:49 +0000</pubDate>
      <link>https://forem.com/emmanuelsalazar92/qa-leading-also-means-deciding-without-slowing-down-the-team-bp5</link>
      <guid>https://forem.com/emmanuelsalazar92/qa-leading-also-means-deciding-without-slowing-down-the-team-bp5</guid>
      <description>&lt;p&gt;This is something personal, but also a common theme in agile environments: meetings to plan more meetings.&lt;/p&gt;

&lt;p&gt;How many times have you had to make a decision without consulting the whole team — even while working under a democratic leadership style?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When collaboration becomes a roadblock&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I understand that every leader organizes their team differently.&lt;br&gt;
In my case, I used to believe that the best way to lead was to involve everyone: the Product Owner, Scrum Master, developers, and of course, all the QA engineers.&lt;/p&gt;

&lt;p&gt;Especially during critical processes like production releases, it felt right to invite everyone to participate, share input, and help us reach the common goal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three meetings for one decision&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the excuse that “we’re all part of the team,” we ended up having meetings for everything:&lt;br&gt;
One to discuss how we’d search for test cases&lt;br&gt;
Another to choose which scenarios to execute&lt;br&gt;
And a third to validate that the team was happy with the selection and assignment of the test cases&lt;/p&gt;

&lt;p&gt;All this… while the sprint clock kept ticking.&lt;/p&gt;

&lt;p&gt;But reality looked different: some people didn’t show up, others didn’t engage, and most had competing priorities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leading is not about imposing — but it is about acting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I value collaborative work. I truly believe that ideas improve when everyone contributes.&lt;br&gt;
But I’ve also learned that leading isn’t just about listening — it’s about acting with good judgment when the team needs to move forward.&lt;/p&gt;

&lt;p&gt;And that kind of decision-making doesn’t come from ego or control.&lt;br&gt;
It comes from understanding that leadership also means protecting the team’s time, unblocking progress, and stepping in when the process isn’t enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expert judgment matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A QA lead must be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the context and make decisions without fear&lt;/li&gt;
&lt;li&gt;Know when to bring the whole team in — and when not to&lt;/li&gt;
&lt;li&gt;Fill in the blanks in the process&lt;/li&gt;
&lt;li&gt;Avoid the endless cycle of unproductive meetings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because quality is also about efficiency, balance, and product impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A shift in approach made a big difference&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just like in research, there’s more than one way to reach the desired outcome.&lt;/p&gt;

&lt;p&gt;I used to involve everyone at every step to get alignment.&lt;br&gt;
Now, I follow this approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I make a context-aware, technical decision&lt;/li&gt;
&lt;li&gt;I implement the best possible solution&lt;/li&gt;
&lt;li&gt;I present the results afterward for feedback and validation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That shift helped reduce time, avoid friction, and increased our impact as a team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I still care deeply about including the team’s voice.&lt;br&gt;
What changed is that I now understand — as a leader — that efficiency, productivity, team well-being, and customer happiness are critical metrics too.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It’s not about excluding anyone.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;It’s about finding smarter ways to include — without slowing everyone down.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>QA | When It’s Okay to Break the Rules</title>
      <dc:creator>Emmanuel Salazar </dc:creator>
      <pubDate>Tue, 22 Jul 2025 00:33:38 +0000</pubDate>
      <link>https://forem.com/emmanuelsalazar92/qa-when-its-okay-to-break-the-rules-ae9</link>
      <guid>https://forem.com/emmanuelsalazar92/qa-when-its-okay-to-break-the-rules-ae9</guid>
      <description>&lt;p&gt;As quality professionals, we operate within organizational structures and processes designed to help us do our job better. These rules often act as safety nets — improving consistency, reducing risks, and supporting successful product delivery.&lt;/p&gt;

&lt;p&gt;But what happens when those rules don’t account for the exceptions that make real-world work efficient?&lt;br&gt;
This article isn’t a call to challenge authority for the sake of it — instead, it’s an invitation to reflect on when breaking the rules is not only acceptable, but necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Process Wasn’t Made for Every Situation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;QA processes often rely on checklists, predefined flows, and rigid criteria. But reality rarely follows the script. Sometimes, strictly adhering to the process delays delivery or even compromises product value.&lt;/p&gt;

&lt;p&gt;We see this shift in other disciplines too. Developers are now encouraged to write self-explanatory code rather than over-document every line. Why? Because documentation isn’t the goal — understanding is. The same principle should apply to QA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Danger of Inflexible Processes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When part of the process can’t be completed — due to lack of time, context, or information — teams often freeze. No one wants to move forward without “checking the box,” and that stalls progress.&lt;/p&gt;

&lt;p&gt;Have you ever been in the middle of a regression run and forced to justify each and every test case you chose to include (or exclude)? That level of bureaucracy slows everyone down and adds no value if applied blindly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expert Judgment: The Unwritten Rule&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Breaking a rule isn’t recklessness. It’s judgment. It’s experience. It’s the ability to assess context, risk, and goals — and then act accordingly.&lt;/p&gt;

&lt;p&gt;That’s what we call expert judgment: the intuition, common sense, and situational awareness that come with time and practice. It’s not about skipping steps at random, but about knowing which rules matter most in each scenario and being able to defend your choices with confidence.&lt;/p&gt;

&lt;p&gt;Would you treat a release with one small bugfix ticket the same as a major deployment with 20 changes?&lt;br&gt;
Of course not. So why assume a single rigid process fits all cases?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breaking Rules… Responsibly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The key is not to institutionalize chaos, but to acknowledge that exceptions exist and that our processes must evolve to support them. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluating the impact of not following a step.&lt;/li&gt;
&lt;li&gt;Communicating the deviation with your team or tech lead.&lt;/li&gt;
&lt;li&gt;Documenting the decision (even informally).&lt;/li&gt;
&lt;li&gt;Learning from the case to improve the process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts: Rules Should Be Alive, Not Sacred&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Processes are meant to serve the team — not constrain it. If they don’t allow room for exceptions, they become bottlenecks. As QA professionals and leaders, we have a duty to challenge what doesn’t work and push for continuous improvement.&lt;/p&gt;

&lt;p&gt;Breaking the rules is okay — if you understand why, can explain your reasoning, and it aligns with delivering value.&lt;/p&gt;

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