<?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>DEV Community: webship.co</title>
    <description>The latest articles on DEV Community by webship.co (@webshipco).</description>
    <link>https://dev.to/webshipco</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%2F1403085%2F21e231be-c3c5-4b3a-aa4a-a4cf72f95633.jpg</url>
      <title>DEV Community: webship.co</title>
      <link>https://dev.to/webshipco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/webshipco"/>
    <language>en</language>
    <item>
      <title>Testing Radio Buttons with Webship-js</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Tue, 23 Dec 2025 11:47:34 +0000</pubDate>
      <link>https://dev.to/webshipco/testing-radio-buttons-with-webship-js-31ho</link>
      <guid>https://dev.to/webshipco/testing-radio-buttons-with-webship-js-31ho</guid>
      <description>&lt;p&gt;Radio buttons are commonly used in websites when only one option must be selected at a time, such as account registration settings, user permissions, or visibility rules.&lt;/p&gt;

&lt;p&gt;Because these choices directly affect how a system behaves, it’s essential to make sure that the selected option is saved correctly and remains unchanged after saving and reloading the page.&lt;/p&gt;

&lt;p&gt;In this article, we demonstrate how to automatically verify radio button behavior in a Drupal CMS website using Webship-JS, ensuring the selection works exactly as expected.&lt;/p&gt;

&lt;p&gt;We will use three steps specific to the radio button:&lt;br&gt;
&lt;strong&gt;When I select radio button "value"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selects the radio button specified by label text, value, or selector.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;When (I |we ) select radio button "([^"]*)?"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example #1:&lt;/strong&gt; &lt;code&gt;When I select radio button "Male"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example #2:&lt;/strong&gt; &lt;code&gt;When I select radio button "female"&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Example #3:&lt;/strong&gt; &lt;code&gt;When I select radio button "#gender-male"&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Example #4:&lt;/strong&gt; &lt;code&gt;When we select radio button "option1"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Testing Context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We will walk through a real, practical example of a Drupal CMS system.&lt;br&gt;
A radio button option is selected, saved, and automatically verified to ensure the correct setting is retained.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Feature: Radio Button Validation for Account Registration Settings in Drupal CMS
 Performed as an administrator.

 Scenario: Validate radio button selection
  Given I am on the homepage
   When I click "Log in"
    And I fill in "#edit-name" with "info@webship.co" by attr
    And I fill in "#edit-pass" with "d" by attr
    And I press "#edit-submit" by attr
    And I go to "/admin/config/people/accounts"
    And I scroll down 500
    And I select radio button "Visitors, but administrator approval is required"
    And I press "Save configuration"
    And I scroll down 500
   Then the radio button "Visitors, but administrator approval is required" should be selected
    And the radio button "Administrators only" should not be selected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;See the full article:&lt;/strong&gt; &lt;a href="https://webship.co/blog/testing-radio-buttons-webship-js" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine selecting the “Youth” age range.&lt;br&gt;
Later, you come back and suddenly find yourself classified as “Old Age”.&lt;br&gt;
For a moment, it feels like your hair turned white all at once.&lt;/p&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%2Fwc6sdbuzcwv2egjb9k1p.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%2Fwc6sdbuzcwv2egjb9k1p.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That kind of surprise is exactly what shouldn’t happen in a system.&lt;br&gt;
Radio buttons are supposed to reflect one clear choice, and any unexpected change reveals a real problem.&lt;/p&gt;

&lt;p&gt;Learn more about Step Definitions in Webship-js&lt;br&gt;
Visit the documentation site:- &lt;a href="https://webship.co/docs" rel="noopener noreferrer"&gt;https://webship.co/docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>selenium</category>
      <category>testing</category>
      <category>javascript</category>
      <category>qa</category>
    </item>
    <item>
      <title>Converted all Behat WebAPIExtension step definitions to Node.js, packaged in Webship-JS</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Tue, 02 Dec 2025 11:27:58 +0000</pubDate>
      <link>https://dev.to/webshipco/converted-all-behat-webapiextension-step-definitions-to-nodejs-packaged-in-webship-js-5fh0</link>
      <guid>https://dev.to/webshipco/converted-all-behat-webapiextension-step-definitions-to-nodejs-packaged-in-webship-js-5fh0</guid>
      <description>&lt;p&gt;Behat’s &lt;a href="https://github.com/Behat/WebApiExtension" rel="noopener noreferrer"&gt;WebAPIExtension&lt;/a&gt; was a simple and effective way to test JSON-based APIs using Gherkin steps. On July 14, 2025, the repository was archived by its owner and became read-only, meaning it’s no longer maintained, but not abandoned in purpose.&lt;/p&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%2F2mqtx2r007m8ec10y8oh.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%2F2mqtx2r007m8ec10y8oh.png" alt=" " width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Webship.co, we saw great value in the extension’s structured API-testing approach. So instead of letting it fade away, we rebuilt all of its step definitions in Node.js and integrated them directly into Webship-JS.&lt;br&gt;
Now, teams can use the same clear BDD style, but with modern JavaScript tooling and active support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why WebAPIExtension was worth reviving&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; It made API testing readable and easy to understand.&lt;/li&gt;
&lt;li&gt;    It supported setting headers, sending JSON bodies, checking status codes, and validating responses.&lt;/li&gt;
&lt;li&gt;    It helped teams describe API behavior in a simple Given/When/Then format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We kept all these strengths, and enhanced them.&lt;/p&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%2Fsnvbnqvf6z8671lhuxk4.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%2Fsnvbnqvf6z8671lhuxk4.png" alt=" " width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s new in Webship-js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our rebuilt API steps now support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting headers and request bodies&lt;/li&gt;
&lt;li&gt;Sending all HTTP methods (GET, POST, PUT, DELETE…)&lt;/li&gt;
&lt;li&gt;Validating status codes&lt;/li&gt;
&lt;li&gt;Matching JSON responses, including nested fields&lt;/li&gt;
&lt;li&gt;Checking response headers&lt;/li&gt;
&lt;li&gt;Using matcher patterns (regex, array length, JWT, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;Example: *&lt;/em&gt;&lt;br&gt;
Sends a request (POST, PUT, etc.) to the given endpoint, using the values listed in the table as the JSON request body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When I send a POST request to "/users" with values:
            | name  | John Doe         |
            | email | john@example.com |
            | age   | 30               |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full documentation of the steps is available here:&lt;br&gt;
&lt;a href="https://webship.co/docs/webship-js/1.0.x/api-step-definitions" rel="noopener noreferrer"&gt;https://webship.co/docs/webship-js/1.0.x/api-step-definitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Although the original WebAPIExtension is now archived, its value continues.&lt;br&gt;
With our Node.js rebuild, Webship-JS brings it back — cleaner, faster, and actively maintained.&lt;br&gt;
The same familiar BDD API experience, but modern and ready for real projects today.&lt;/p&gt;

</description>
      <category>api</category>
      <category>node</category>
      <category>testing</category>
      <category>javascript</category>
    </item>
    <item>
      <title>When I send a METHOD request to "endpoint"</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Tue, 28 Oct 2025 11:54:14 +0000</pubDate>
      <link>https://dev.to/webshipco/when-i-send-a-method-request-to-endpoint-nme</link>
      <guid>https://dev.to/webshipco/when-i-send-a-method-request-to-endpoint-nme</guid>
      <description>&lt;p&gt;API testing is a crucial step to ensure that web systems and applications function smoothly.&lt;br&gt;
It involves sending different types of requests to specific API endpoints, such as GET, POST, PUT, or DELETE, to verify the server’s response and data accuracy.&lt;/p&gt;

&lt;p&gt;The core of every API test is the step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I send a METHOD request to 'endpoint'&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step definition is used to send an HTTP request (GET, POST, PUT, DELETE, etc.) to a given API endpoint. It’s the action step that actually makes the call using the data, headers, and base URL you’ve set in previous steps.&lt;/p&gt;

&lt;p&gt;Tells the test to make an HTTP request using the chosen method (GET, POST, PUT, DELETE…) to the specified path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example #1:&lt;/strong&gt; &lt;code&gt;When I send a GET request to "/users"&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Example #2:&lt;/strong&gt; &lt;code&gt;When I send a POST request to "/posts"&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Example #3:&lt;/strong&gt; &lt;code&gt;When I send a PUT request to "/users/1"&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Example #4:&lt;/strong&gt; &lt;code&gt;When I send a DELETE request to "/posts/1"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Real Testing Context&lt;/p&gt;

&lt;p&gt;We’ll use the GET method to test the /node/blog endpoint in Drupal CMS, ensuring it responds successfully with a status code of 200.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Feature: API Functional Testing for Drupal CMS Blog Endpoint
  This feature demonstrates how to test the API endpoint for blog content.
  It focuses on sending a GET request to the blog node and checking the response status.

  Background:
    Given the API base URL is "http://localhost/test/drupalCMS/web/api/v1"

  Scenario: Check the blog node API response
    Given I am on "/api/v1"
     When I send a GET request to "/node/blog"
    Given I am on "/api/v1/node/blog"
     Then the API response code should be 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;See the full article:&lt;/strong&gt; &lt;a href="https://webship.co/blog/when-i-send-method-request-endpoint" rel="noopener noreferrer"&gt;https://webship.co/blog/when-i-send-method-request-endpoint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automated testing not only saves time but also prevents human errors, helping catch issues before they ever reach the end user.&lt;br&gt;
And while it’s a serious process, testing can sometimes feel like a playful challenge with code: you send a request, wait for the response, and either smile when it works… or laugh when it fails.&lt;/p&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%2Fyskwe3ffyka3xtqy0l9y.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%2Fyskwe3ffyka3xtqy0l9y.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>api</category>
      <category>selenium</category>
      <category>testing</category>
    </item>
    <item>
      <title>Webship-js: Click and See 'operation' in "text" row</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Wed, 24 Sep 2025 12:08:49 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-click-and-see-operation-in-text-row-2l15</link>
      <guid>https://dev.to/webshipco/webship-js-click-and-see-operation-in-text-row-2l15</guid>
      <description>&lt;p&gt;In the world of website and system management, tables are always at the core: user names, records, operations, all stored there. And sometimes, simply checking that options like Edit or Delete appear in the right row makes a huge difference. It ensures the system works as expected and gives you the flexibility to modify or remove data with ease.&lt;/p&gt;

&lt;p&gt;The problem? Testing these details manually can be boring and time-consuming. That’s where Webship-js comes in: a tool built to make the process simpler and faster. With just two steps, Click and See, you can confirm the options appear exactly where they should, with no headaches and no unnecessary complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The basic steps used are:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I click "operation" in "text" row&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step finds a table, locates a row containing the identifier text, and then clicks on the target text within that row.&lt;/p&gt;

&lt;p&gt;Clicks on specific text within a table row that contains a specified identifier text.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Example: *&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When I click "Edit" in the "John Smith" row
When I click "Delete" in the "Product A" row  
When we click "View Details" in the "Order #12345" row
And I click "Download" in the "Report 2024" row
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Then I should see "operation" in "text" row *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This step finds a table, locates a row containing the identifier text, and then verifies that the target text is visible within that row.&lt;/p&gt;

&lt;p&gt;Asserts that specific text is visible within a table row that contains a specified identifier text.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Then I should see "Active" in the "John Smith" row
Then I should see "In Stock" in the "Product A" row  
Then we should see "Processing" in the "Order #12345" row
And I should see "Admin" in the "john.smith@example.com" row
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;See the full article:&lt;/strong&gt; &lt;a href="https://webship.co/blog/webship-js-click-and-see-operation-text-row" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-click-and-see-operation-text-row&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Manual testing is like washing dishes by hand: tedious, slow, and never-ending. &lt;br&gt;
Automated testing, on the other hand, is like using a dishwasher: fast, automatic, and a real time-saver. &lt;br&gt;
So the next time you think about browsing through rows one by one... just remember: machines love repetitive work, humans don’t!&lt;/p&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%2F6agwii9ac3w7kzx4zywt.jpg" 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%2F6agwii9ac3w7kzx4zywt.jpg" alt=" " width="720" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>testing</category>
      <category>qa</category>
    </item>
    <item>
      <title>Webship-js: When I attach the file "file name" to "element"</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Wed, 27 Aug 2025 11:27:55 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-when-i-attach-the-file-file-name-to-element-p63</link>
      <guid>https://dev.to/webshipco/webship-js-when-i-attach-the-file-file-name-to-element-p63</guid>
      <description>&lt;p&gt;Webship-js: When I attach the file "file name" to "element"&lt;/p&gt;

&lt;p&gt;Automated testing isn’t complete without touching the finer details of the digital experience, and file uploads are one of the most crucial. This step reveals whether a site smoothly handles user interactions or stumbles at the first simple challenge. It’s the moment of truth that puts the system under the microscope.&lt;/p&gt;

&lt;p&gt;When I attach the file "file name" to "element"&lt;/p&gt;

&lt;p&gt;This step defines the test for attaching files to the file input element, enabling their upload for use in a subsequent action.&lt;/p&gt;

&lt;p&gt;A folder containing a set of test files (e.g., images, documents, etc.) should be placed under the tests/assets directory.&lt;br&gt;
These files must be uploaded in advance with the appropriate file name. During the feature steps, the files are referenced and loaded into the file input element. In the subsequent step, the intended action is performed on the uploaded file.&lt;/p&gt;

&lt;p&gt;For the proper configuration of the tests/assets folder path, see the Global Settings page.&lt;/p&gt;

&lt;p&gt;Create a step that enables attaching a file to a field identified by its id|class|name|label.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When I attach the file "profileIcon.jpg" to "#profileIconUpload"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the full article:&lt;a href="https://webship.co/blog/webship-js-when-i-attach-file-file-name-element" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-when-i-attach-file-file-name-element&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding this step means leaving no blind spots in the user journey. We upload the file in testing to make sure the user won’t end up uploading their stress later! 😅 Therefore, peace of mind feels much lighter when we know everything works as it should.&lt;/p&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%2F6eexz5fgo9eg9dpfi34a.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%2F6eexz5fgo9eg9dpfi34a.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>selenium</category>
      <category>qa</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Webship-js: When I scroll ( left, right, to start, to the end )</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Thu, 24 Jul 2025 11:32:26 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-when-i-scroll-left-right-to-start-to-the-end--3l14</link>
      <guid>https://dev.to/webshipco/webship-js-when-i-scroll-left-right-to-start-to-the-end--3l14</guid>
      <description>&lt;p&gt;From interactive portfolios and product galleries to immersive storytelling sites and modern landing pages, many websites today embrace horizontal scrolling to break away from traditional layouts and deliver a unique user experience.&lt;br&gt;
This sideways navigation offers a cinematic feel, guiding users through content like frames in a storyboard. But with this creativity comes complexity.&lt;br&gt;
That’s why automated testing becomes crucial — to ensure every scroll right, scroll left, scroll to start, and scroll to end behaves smoothly across all devices and browsers.&lt;br&gt;
Functional, fluid, and flawless — that's what horizontal scrolling should be, and automated tests help make that promise real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I scroll&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use this step to simulate horizontal scroll actions in your automated test scenarios.&lt;br&gt;
It's especially useful for testing horizontally designed websites, such as interactive portfolios, sliders, or product showcases — where elements are revealed as the user scrolls sideways.&lt;/p&gt;

&lt;p&gt;These are the scroll directions you can control during testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I scroll left&lt;/li&gt;
&lt;li&gt;When I scroll right&lt;/li&gt;
&lt;li&gt;When I scroll to start&lt;/li&gt;
&lt;li&gt;When I scroll to the end&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows you to ensure that all content is accessible, visible, and functioning correctly — regardless of where it sits on the horizontal axis.&lt;/p&gt;

&lt;p&gt;See the full article: &lt;a href="https://webship.co/blog/webship-js-when-i-scroll-left-right-start-end" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-when-i-scroll-left-right-start-end&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Horizontal scrolling brings creativity — but also complexity.&lt;br&gt;
One missed scroll, one hidden button, or one broken layout can ruin the experience.&lt;br&gt;
That’s why we test.&lt;br&gt;
With automation, we validate every step: scroll left, scroll right, jump to start, reach the end — no surprises, no slip-ups.&lt;/p&gt;

&lt;p&gt;After all, great design deserves great testing —&lt;br&gt;
because smooth scrolling isn’t just satisfying... It’s silent proof that everything works. ✅🎯&lt;/p&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%2F2yrkuz4v1gtrqnf21jsk.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%2F2yrkuz4v1gtrqnf21jsk.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Webship-js: When I scroll</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Mon, 16 Jun 2025 12:08:25 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-when-i-scroll-3d7p</link>
      <guid>https://dev.to/webshipco/webship-js-when-i-scroll-3d7p</guid>
      <description>&lt;p&gt;In today’s modern websites, scrolling is no longer just a basic interaction; it has become a vital part of the user experience, especially on pages that load content progressively or contain long, information-rich sections.&lt;br&gt;
Carefully testing scroll behaviour helps ensure that content appears smoothly and users don’t feel lost or interrupted while navigating.&lt;br&gt;
It’s a small detail… but a big key to a seamless experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I scroll&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use this step when you want to simulate a scroll action on the page during your automated testing scenario.&lt;br&gt;
It can be helpful to test lazy-loaded elements, infinite scroll areas, or to simply bring specific elements into view.&lt;/p&gt;

&lt;p&gt;These are the scroll steps you can use to control the page movement during testing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I scroll down&lt;/li&gt;
&lt;li&gt;When I scroll up&lt;/li&gt;
&lt;li&gt;When I scroll to top&lt;/li&gt;
&lt;li&gt;When I scroll to the bottom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the full article:&lt;a href="https://webship.co/blog/webship-js-when-i-scroll" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-when-i-scroll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scrolling, though a quiet part of the user experience, carries great weight in shaping comfort and impression, and testing it carefully isn’t just a technical task but a way of caring for the little details that make a big difference, because a good digital experience isn’t read all at once, it’s built line by line and scroll by scroll.&lt;/p&gt;

&lt;p&gt;And let’s be honest , no one enjoys chasing content that hides as they scroll… like a cheeky game of hide-and-seek! 🙈👀&lt;/p&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%2Fldq24amz4o1nzidsr3zi.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%2Fldq24amz4o1nzidsr3zi.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see more step definitions: &lt;a href="https://webship.co/docs" rel="noopener noreferrer"&gt;https://webship.co/docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qa</category>
      <category>automation</category>
      <category>testing</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Webship-js: Then the "item" link should contain "url"</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Mon, 26 May 2025 12:17:03 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-then-the-item-link-should-contain-url-2m22</link>
      <guid>https://dev.to/webshipco/webship-js-then-the-item-link-should-contain-url-2m22</guid>
      <description>&lt;p&gt;In website testing, every detail matters. One small broken link can damage trust and user experience. That’s why checking if important links, like social media icons, lead to the right place is a vital step. This kind of step ensures that users are never left wondering or lost.&lt;/p&gt;

&lt;p&gt;One of the key steps in automated functional acceptance testing is verifying that each link leads where it should. In this article, we’ll focus on the step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then the "item" link should contain "url"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This definition step ensures that the the href attribute of a link element includes a URL or part of a URL, with the element located using its link text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Then the "Login" link should contain "/log-in"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;See the full article:&lt;a href="https://webship.co/blog/webship-js-then-item-link-should-contain-url" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-then-item-link-should-contain-url&lt;/a&gt;&lt;br&gt;
You can see more step definitions: &lt;a href="https://webship.co/docs" rel="noopener noreferrer"&gt;https://webship.co/docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automaton</category>
      <category>qa</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Webship-js: When I reload the page</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Wed, 23 Apr 2025 09:23:19 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-when-i-reload-the-page-448h</link>
      <guid>https://dev.to/webshipco/webship-js-when-i-reload-the-page-448h</guid>
      <description>&lt;p&gt;When designing automated tests for websites, we often focus on clicks, data entry, or verifying elements...&lt;br&gt;
However, there’s one crucial step that many overlook — reloading the page.&lt;/p&gt;

&lt;p&gt;This action simulates a very common real-world user behavior, such as clicking the “refresh” button or reopening the page. That’s where the step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I reload the page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;comes in — used to test the website’s stability after a refresh. Does the site retain its state? Do key elements disappear or break?&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore the importance of this step, when to use it, and demonstrate it on a safe and open-source website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Is Reload Testing Important?&lt;/strong&gt;&lt;br&gt;
Reloading a web page may seem trivial, but it can uncover hidden issues — like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cookie banners that reappear after being dismissed&lt;/li&gt;
&lt;li&gt;Forms that reset unexpectedly&lt;/li&gt;
&lt;li&gt;Dynamic content that fails to reload correctly&lt;/li&gt;
&lt;li&gt;User settings or preferences that don’t persist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testing these behaviors helps ensure a smooth and consistent user experience.&lt;/p&gt;

&lt;p&gt;The Test Scenario: Cookie Banner Behavior&lt;br&gt;
We chose the site &lt;a href="https://starfish-greathearts.org" rel="noopener noreferrer"&gt;https://starfish-greathearts.org&lt;/a&gt;&lt;br&gt;
for this test.&lt;br&gt;
It displays a cookie banner when you first land on the homepage.&lt;/p&gt;

&lt;p&gt;You can see more step definitions: &lt;a href="https://webship.co/docs" rel="noopener noreferrer"&gt;https://webship.co/docs&lt;/a&gt;&lt;br&gt;
See the full article:&lt;a href="https://webship.co/blog/webship-js-when-i-reload-page" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-when-i-reload-page&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>selenium</category>
      <category>automation</category>
      <category>qa</category>
    </item>
    <item>
      <title>How Can AI Fix Bugs Automatically?</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Thu, 27 Mar 2025 10:05:29 +0000</pubDate>
      <link>https://dev.to/webshipco/how-can-ai-fix-bugs-automatically-2b9f</link>
      <guid>https://dev.to/webshipco/how-can-ai-fix-bugs-automatically-2b9f</guid>
      <description>&lt;p&gt;Introduction:&lt;br&gt;
If you’ve ever worked in software development or testing, you know how frustrating it can be to find and fix bugs. In the past, developers had to spend hours manually searching for issues, analyzing code, and coming up with solutions. But with the rise of AI, things are changing fast! Now, AI can detect and fix bugs automatically, without the need for constant human intervention.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;How Does AI Detect Bugs?&lt;br&gt;
AI uses techniques like machine learning and big data analysis to predict and catch bugs before they even happen. Modern tools can:&lt;/p&gt;

&lt;p&gt;Identify common coding mistakes.&lt;br&gt;
Compare code with a massive database of past bugs.&lt;br&gt;
Run automated tests to spot potential issues in the system.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more insights on AI-powered bug detection, check out this article: &lt;a href="https://blog.railtown.ai/blog-posts/how-ai-can-detect-software-bugs-and-root-cause-analysis" rel="noopener noreferrer"&gt;https://blog.railtown.ai/blog-posts/how-ai-can-detect-software-bugs-and-root-cause-analysis&lt;/a&gt; 🔗&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How Can AI Fix Bugs on Its Own?
Once AI finds a problem, it can either suggest solutions or even fix them automatically using smart techniques like: ✅ Auto-correcting code: AI scans the code, suggests fixes, or even applies them directly. ✅ Re-running tests and adjusting scenarios: If a bug is found, AI can tweak test cases and run them again to make sure everything works. ✅ Analyzing error logs: AI looks through millions of past bugs to find the best solution for the current issue.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;See the full article:&lt;a href="https://webship.co/blog/how-can-ai-fix-bugs-automatically" rel="noopener noreferrer"&gt;https://webship.co/blog/how-can-ai-fix-bugs-automatically&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automate testing of your website’s consent management for the Privacy Policy and cookies</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Tue, 25 Feb 2025 12:03:19 +0000</pubDate>
      <link>https://dev.to/webshipco/automate-testing-of-your-websites-consent-management-for-the-privacy-policy-and-cookies-36hh</link>
      <guid>https://dev.to/webshipco/automate-testing-of-your-websites-consent-management-for-the-privacy-policy-and-cookies-36hh</guid>
      <description>&lt;p&gt;In the digital age, protecting user privacy is no longer optional—it’s a necessity mandated by global regulations like GDPR and CCPA. As the demand for transparency grows, consent management tools for cookies and privacy policies have become an essential part of any website. But how can you ensure these tools function efficiently without constant manual review? This is where automated testing comes in, ensuring seamless compliance and a secure, hassle-free user experience.&lt;/p&gt;

&lt;p&gt;We will demonstrate automated functional acceptance testing for consent management of the Privacy Policy and cookies using Webship-JS on the website unesco.org&lt;/p&gt;

&lt;p&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, we will conduct another automated functional acceptance test for consent management on the website bbc.com&lt;/p&gt;

&lt;p&gt;, ensuring compliance and seamless functionality.&lt;/p&gt;

&lt;p&gt;With Webship-JS, you can test any consent management format available on a website, regardless of its design or implementation. This ensures complete flexibility and adaptability to different structures and compliance frameworks.&lt;/p&gt;

&lt;p&gt;Gherkin scripts for testing the Privacy Policy and Cookies at &lt;a href="https://bbc.com" rel="noopener noreferrer"&gt;https://bbc.com&lt;/a&gt;&lt;/p&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%2Fdu8enzogpp9fb6pf4x4m.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%2Fdu8enzogpp9fb6pf4x4m.png" alt="Image description" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the full article:&lt;a href="https://webship.co/blog/automate-testing-your-websites-consent-management-privacy-policy-and-cookies" rel="noopener noreferrer"&gt;https://webship.co/blog/automate-testing-your-websites-consent-management-privacy-policy-and-cookies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see more step definitions: &lt;a href="https://webship.co/docs" rel="noopener noreferrer"&gt;https://webship.co/docs&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Webship-js: When I wait</title>
      <dc:creator>webship.co</dc:creator>
      <pubDate>Tue, 21 Jan 2025 12:24:27 +0000</pubDate>
      <link>https://dev.to/webshipco/webship-js-when-i-wait-3flm</link>
      <guid>https://dev.to/webshipco/webship-js-when-i-wait-3flm</guid>
      <description>&lt;p&gt;The "when I wait" step in Webship-JS is crucial for ensuring that your automated tests simulate realistic user behavior. It allows you to introduce pauses or delays in the test execution, ensuring that elements load fully or actions complete before the next steps are executed. This step is particularly important when dealing with dynamic content or AJAX requests, as it guarantees that the page is ready for the next interaction, preventing errors due to incomplete loading or unresponsive elements. By using this step, you enhance the reliability and accuracy of your tests.&lt;/p&gt;

&lt;p&gt;This step definition specifies that the user will pause or wait for a defined duration—either a set number of seconds/minutes, a maximum number of seconds/minutes, or until the page fully loads—before proceeding to the next step.&lt;/p&gt;

&lt;p&gt;This step is typically used where a delay or time-based action is expected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I wait until the page loaded&lt;/li&gt;
&lt;li&gt;When I wait {number} seconds&lt;/li&gt;
&lt;li&gt;When I wait max {number} seconds&lt;/li&gt;
&lt;li&gt;When I wait {number} minutes&lt;/li&gt;
&lt;li&gt;When I wait max {number} minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When I wait until the page loaded&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step definition acts as a command to wait until the page's body fully loads before performing any actions on the page&lt;/p&gt;

&lt;p&gt;The page body loading time is set to 10 seconds. If the body isn't loaded within this time frame, an error will be triggered for this step definition. &lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When I wait until the page is loaded
When we wait until the page loaded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the full article:&lt;a href="https://webship.co/blog/webship-js-when-i-wait" rel="noopener noreferrer"&gt;https://webship.co/blog/webship-js-when-i-wait&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see more step definitions: &lt;a href="https://webship.co/docs" rel="noopener noreferrer"&gt;https://webship.co/docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>ai</category>
      <category>testing</category>
      <category>qa</category>
    </item>
  </channel>
</rss>
