To deepen my knowledge in whatever test automation toolset I am learning on-the-job, especially when starting a new position, I always have a few side projects going, dabbling in it during the weekends and off-hours, practicing what I am learning. It's how I hit the ground running when I start a new position.
More can be found on my GitHub site. To see general blog entries on building automated test frameworks, go to the Table of Contents.
Below are automation frameworks written in TypeScript, Ruby, JavaScript, Java, and Python, using Detox, Capybara, Watir, Appium, Rest Assured, and Selenium WebDriver.
Claude AI and Cursor AI have also been placed in head-to-head matchups seeing how they set up test frameworks using Playwright + Cypress.
Featured Projects
DetoxDemo: Testing a React Native mobile app with Detox + TypeScript
January 2026
This demo project became a TestGuild.com talk for the Automation Guild 2026 online conference (See Slides). Based on my work building from scratch a React Native mobile automation framework using Wix's Detox + TypeScript + GitHub Action workflows + Allure Reports at SELF ID. Tested against my first "vibe coded" React Native application, based on Dave Haefner's test site, The-Internet.
- Part One: DetoxDemo, a vibe-coded React Native app
- Part Two: First Time Vibe Coding? What Could Go Wrong?
- Part Three: Features of Detox Demo: CI/ CD, Logging and Reporting
- Part Four: Using GitHub Action Workflows to kick off tests in CI/ CD
- Part Five: The Facebook Ecosystem: React, React Native, Metro, and Yarn
- LinkedIn: First Time Using GitHub CoPilot to Create a ReactNative LoginPage app. What Could Go Wrong?
- Slideshare.Net: http://tinyurl.com/detox-demo-slides
- Source Code: https://github.com/tjmaher/detox-demo
Free Test Automation University course based on my training sessions I put together while at Threat Stack, constructing a Capybara + Ruby + GitLab + AWS test automation framework. Course includes visual testing examples using Capybara + Ruby + Headless Chrome + Applitools.
- Part One: Setup and Installation of Ruby + Bundler, Capybara, and RSpec
- Part Two: Arrange, Act, Assert! Testing Links and Navigation, Setting Expectations, and Searching Within
- Part Three: Finders and Matchers
- Part Four: Testing a Login Page, refactoring it into a method
- Part Five: Dropdowns, Radio Buttons, and Checkboxes
- Part Six: Handling Alerts and Modals
- Part Seven: Advanced Topics such as Screenshots, Headless Chrome, Capybara's headless Apparition driver, and adding Applitools.
- Source Code: https://github.com/tjmaher/tau-capybara
Other Projects
Becoming AI QA
March 2026
Could I pivot to being an AI QA? Learn Python, Testing LLMs and Machine Learning? Here, I start investigating, pair-programming with Claude.ai on some Python projects.
- Would becoming an AI QA Engineer make myself more marketable? What should I study?
- Why Python? How AI and Python became linked
- Jupyter Notebooks + Python
- Python Project: Blogger Spam Bulk Deleter:
- Pair-programming with Claude building a Python app that interacts with the Blogger API bulk deleting spam comments from my blog.
- Blog: Code Walkthrough: Pair-Coded with Claude but Human Explained!
- GitHub: https://github.com/tjmaher/blogger-spam-bulk-deleter
Claude Sonnet: Claude-Cypress-Login
March 2026
I'm obsessed with trying to get Claude Sonnet to explain its logic and reasoning every step of the way when it attempts to build an automated test framework. I use Claude, but do not fully trust it. This time, to prepare for a job interview, I spent a day instructing it to build an automated framework using Cypress + TypeScript using only natural language, just to see if it could be done. After, I force it to write a blog post about why it used the tools and technology it did. And provide web links. Links! I always force it to cite its sources.
- Blog: Claude Sonnet 4 Talks About Designing a Cypress Framework for a Login Screen
- Source Code: https://github.com/tjmaher/claude-cypress-login
Claude Sonnet Over-Engineered My Playwright Login!
March 2026
Does an automation framework for a Playwright Login page need to dive into Martin Fowler's concepts of Dependency Injection, Singleton, TestDouble patterns along with the standard Page Object patterns? Standards set by ISTQB and OWASP? Documentation from the Refactoring Guru, The Gang of Four? Claude Sonnet 4 thinks so!
Playwright Generate Plans: Playwright + TypeScript:
February 2026
Testing out how Playwright-Test-Planner and Playwright-Test-Generator, two plugins for GitHub Copilot, can create a test plan in Markdown, then write an automated test framework in Playwright + TypeScript against it, adding in page objects and reporting just by prompting.
Cursor Creates: Playwright + C-Sharp:
February 2026
It's a head-to-head matchup! Cursor AI versus VS Code + GitHub Copilot battling to create automated test frameworks using MS Playwright + C#. Who creates the best tests for The-Internet / Login? The best GitHub Actions Workflow? The best README docs? And can it be created only using prompts?
Login C Sharp:
February 2026
- Source Code: https://github.com/tjmaher/login-c-sharp
The Cheezy Internet: Creating a Ruby + Watir + Cucumber automation framework with Jeff Morgan's Page-Object gem:
Are you sure the buses are still listed?
Data-driven API tests with Ruby + NET::HTTP + ThoughtWorks Gauge
Basic Capybara-Gauge
December 2018
Build a Basic Appium Framework
May 2017 - June 2017
Configuring Build.Gradle Environments:
June 2016
Automate Amazon
Dec 2015 - Jan 2016
How to develop a rudimentary framework to create automated tests for Amazon. Selenium WebDriver + Java + TestNG, based on work doing at Fitbit Boston.
Testing The-Internet
June - July 2015
Selenium WebDriver + Java demonstrating refactoring out common utilities such as logging and error handling, getting page titles, getting URLs, and sending keys, similar to what we were using at Fitbit Boston. Web locators stored in Page Objects.
November 2021
How I practiced using MassMutual's test Ruby + Watir + Cucumber automation toolsets.
- Part One: Source Book: Cucumbers and Cheese: A Tester's Workshop
- Part Two: Installing Ruby + Watir + Chromedriver + VS Code on Windows 10
- Part Three: Writing Ruby + Watir tests for The-Internet
- Part Four: Composing tests using Cucumber and Gherkin
Are you sure the buses are still listed?
Data-driven API tests with Ruby + NET::HTTP + ThoughtWorks Gauge
September 2019
- Part One: Setting up the test plan and table data in a spec file
- Part Two: Interacting with the MBTA API using NET::HTTP
- Source Code: https://github.com/tjmaher/gauge-ruby-api
Basic Capybara-Gauge
December 2018
Based on my work at Threat Stack building a test automation framework for their security application. Threat Stack required it be written in Ruby + Gauge + Gitlab, a toolset I was of yet unfamiliar with. Capybara + Ruby + Headless Chrome + Rubocop.
Discovering Docker
Spring & Summer 2018
- Part One: Analyzing The-Internet
- Part Two: Setup Ruby Environment
- Part Three: Setup Capybara to Test Opening Chrome
- Part Four: Add Option For Chrome Headless
- Part Five: Add Test Steps and Spec Implementations
- Part Six: Setup Chrome and ChromeDriver Logging
- Part Seven: Rubocop Code Review
- Source Code: https://github.com/tjmaher/capybara-gauge
Discovering Docker
Spring & Summer 2018
First exposure to Amazon AWS, I started studying it in order to build a virtual machine for a test automation framework I was building for Threat Stack.
Tinkering with Twitter
October 2017
- Starting a Selenium Grid using AWS + SeleniumHQ Docker images + Docker Compose
- Setting up Ubuntu Linux with Docker
- Basic Chef + Test Kitchen: Setting up Ubuntu with Vagrant + Virtual Box + the Test-Kitchen Ruby Gem on a MacBook
Tinkering with Twitter
October 2017
Demo project created for an interview at Twitter. Uses Twitter4J Java library. Thank you, Angie Jones for referring me!
- Part One: Twitter and the Twitter Search API
- Part Two: Getting the Twitter credentials: Consumer Keys and Access Tokens
- Part Three: Setting up an API Testing Environment with Twitter4J
- Part Four: Post a Tweet Using Twitter4J To Interact With the Twitter API
- GitHub: Review the source code for the project.
Build a Basic Appium Framework
May 2017 - June 2017
While working as a manual tester on a contact at Ahold, the parent company of Stop & Shop supermarkets, I designed a proof-of-concept that I demoed for them, trying to convince them to hire me as an automation developer creating a brand new mobile automation framework. They asked how I was thinking of constructing it, so I showed them these blog posts.
Learning Appium Desktop
April 2017
- Part One: Review How to Inspect Mobile Apps with Appium Desktop
- Part Two: Design a Basic Test, Examining Mobile Elements with Appium Desktop
- Part Three: Install and Launch an App Using Desired Capabilities
- Part Four: Set up the Page Objects, Page Factories and Tests
- Part Five: Download the tests and run them on your own MacBook!
- Part Six: How to create and launch an Android emulator from Android Studio
- Part Seven: What happens behind the scenes as Appium installs and launches an Android app? Examining and footnoting a log file.
- GitHub: Review the source code for the project.
Learning Appium Desktop
April 2017
While working as a manual tester on a contact at Ahold, the parent company of Stop & Shop supermarkets, I decided I wanted to create a proof-of-concept of a mobile automation framework. They wanted to see what toolsets I could use. These are my research notes.
Learning Serenity BDD
March 2017
- Part One: What is Appium Server and How Do You Start It With Appium Desktop
- Part Two: How to Connect To Your Android Device Using the Android SDK, the Android Command Line Tools, and the Android Debug Bridge
- Part Three: Setting up remote devices through WiFi
- Part Four: Setting up Android Emulators with Android Virtual Device Manager (avd), choosing the Android operating system version
- Part Five: Find the Desired Capabilities: appPackage and appActivity. Bug in AAPT if giving just appName
- Part Six: Inspecting an Android app using Appium Desktop
Learning Serenity BDD
March 2017
Starting a new QA Contract at Ahold, the parent company of Stop & Shop supermarkets, before showing it to the stakeholders, I investigated on this blog how I wanted to write automated tests for their mobile apps.
Building a Geb + Groovy + Spock project with Yeoman:
November 2016
- Serenity BDD: An Automation Framework That Uses Specification by Example (SBE)
- What is the Difference Between TDD and BDD?
- Studying BDD using The Cucumber Book and BDD in Action
- Scaffolding a new project using Maven Archetypes
- Reviewing The Serenity Screenplay Tutorial
Are You Sure the Bus Line is Listed? Gathering data using REST APIs and REST Assured:
February 2017
February 2017
Building a Geb + Groovy + Spock project with Yeoman:
November 2016
New job at Good Start Genetics? New automation toolsets to learn, using Geb + Groovy + Spock.
SDET Prepwork:
Playing with Protractor:
September 2016
- About Yeoman, scaffolding, and other tooling applications
- A Step-by-Step Process: Installing and Configuring Yeoman using Chris Hluchan's Geb Generator
- Running the Built-In Tests From the Command Line, and Examining How They Are Set Up
- Initial Source Code Generated by the Geb Generator
SDET Prepwork:
I have shifted from being an automation engineer to being a Software Developer in Test. In order to keep up, I have written a few blogs entries about what I need to learn:
Playing with Protractor:
September 2016
Demo project for a job interview writing a test framework with Protractor + JavaScript + Jasmine, the toolsets at their company.
RESTful API Testing with Postman and Newman:
July 2016
Fitbit Boston was investigating new ways to write API tests, using Postman, a toolset I was unfamiliar with at the time. Article covers "What is an API?" and gives sample APIs on the web. Also shows
- Testing an AngularJS application with Protractor, Jasmine, and JavaScript
- Walkthrough of installing PhoneCat Tutorial App: How to learn AngularJS
- The complexities of testing JavaScript frameworks, according to Vojtěch Jína, creator of the Karma Test Runner
RESTful API Testing with Postman and Newman:
July 2016
Fitbit Boston was investigating new ways to write API tests, using Postman, a toolset I was unfamiliar with at the time. Article covers "What is an API?" and gives sample APIs on the web. Also shows
- Walkthrough Setting up a Postman Test
- How to download and configure Newman, how Postman runs tests from the command line
Configuring Build.Gradle Environments:
June 2016
A fun Memorial Day project: Experiment with the new way Fitbit Boston was writing tests, using Gradle + JUnit + Hamcrest instead of Maven + TestNG + JUnit.
The Builder Pattern:
April 2016 - May 2016
- IntelliJ: Setting up WebDriver framework in Gradle
- Eclipse: Setting up WebDriver framework in Gradle
- A Bit About Groovy
The Builder Pattern:
April 2016 - May 2016
A Senior Developer at Fitbit walked me through a new way to store data, so of course I had to practice using it during my off-hours.
RESTful Testing with Stripe and Apache HttpComponents:
Feb 2016 - March 2016
Selenium WebDriver + Java + Apache HTTP Components. Experimental proof-of-concept that I demoed to stakeholders to prove to Fitbit Boston that we could add tests to our infrastructure for the Stripe API payment processor. They asked for documentation on what I was planning, so I showed them these blog posts I had just written.
- Introduction
- Part One: Intro to REST APIs
- Part Two: Interacting with Stripe using http and cURL
- Part Three: API Keys, Property files, and Initial Setup
- Part Four: UriBuilder, HttpGet and other Apache HttpComponents
- Part Five: From JSON to Object: HttpEntity and GSON
- Source Code: GitHub, T.J. Maher
Feb 2016 - March 2016
- Introduction
- Part One: Intro to REST APIs
- Part Two: Interacting with Stripe using http and cURL
- Part Three: API Keys, Property files, and Initial Setup
- Part Four: UriBuilder, HttpGet and other Apache HttpComponents
- Part Five: From JSON to Object: HttpEntity and GSON
- Source Code: GitHub, T.J. Maher
Automate Amazon
Dec 2015 - Jan 2016
How to develop a rudimentary framework to create automated tests for Amazon. Selenium WebDriver + Java + TestNG, based on work doing at Fitbit Boston.
- Introduction
- Setup a Development Environment
- Sketch Out a Use Case
- Common Utility Methods
- Writing a Sign In Test
- Product Enums, Product Objects, and Pojos
- Initialize Cart and Login
- Writing the Shopping Cart Test
Testing The-Internet
June - July 2015
Selenium WebDriver + Java demonstrating refactoring out common utilities such as logging and error handling, getting page titles, getting URLs, and sending keys, similar to what we were using at Fitbit Boston. Web locators stored in Page Objects.
Writing automated tests versus Dave Haeffner's Login page on his test site, The-Internet.
- Step One: Sketch out the simple manipulation of a Login page
- Step Two: Draft Common Utilities
- Step Three: Storing Constants: static finals vs enums
- Step Four: Storing Locators for Web Elements
- Step Five: The Page Object Model
- Step Six: Writing the Automated Test