What you could do if you had a free, tireless browser operator?! Introducing Playwright.
Browsers are our primary platform for running applications and retrieving information. We have to use browsers to test applications, verify health and current performance of applications, look up data and download (as) files, submit information, and do much of our daily work.
Suppose we had a new colleague — who is extremely good at operating a browser and who does not mind repetitive task; this colleague does not ask for pay or sustenance, we only need to provide clear instructions on the tasks this colleague needs to perform through the browser. This colleague can also bring their friends with the exact same characteristics and capabilities and together they can get a lot of browser work done.
This article introduces Playwright — an open source software library that provides with a deus in machina — a robot in our browser do perform power operations. And this opens up many more opportunities than you may realize at first glance. At least more than I originally thought. From automated testing (obviously) to tactical integration and RPA, and from deeplink bookmarks, screen scraping, web app health monitoring (smoketests) and customized web applications.
This article “What is the Microsoft Playwright Automation Tool Guide” on TestGuild provides a great overview of the background and key objectives and features of Playwright. For more detail, please refer to this overview. I will not attempt to duplicate this pretty awesome description — just pick some cherries.
At a more technical level, the picture before my mind’s eye of my Node application using the Playwright library looks as follows:
Primary Use Case: Web UI Test Automation
The primary use case for which Playwright was created is test automation for web applications. Test automation is a crucial component of software development. In our shift left we want testing to take place as early and often as possible, fully integrated with the CI/CD pipelines. And while we are at it: automated smoke testing (after any release of infrastructure, platform, data or application) is highly desirable as is periodic health checking on the availability, functional correctness and performance of important features. Automation of testing of web applications has always been a bit of a pain. Creating scripts is a lot of work and defining robust scripts that do not break with every small change in the user interface is no easy feat. Using such scripts across different browsers and devices is even harder.
Playwright first and foremost tries to address these challenges. Make it as simple and intuitive as possible to create a test script for a web application — that is not brittle, that works across browsers and devices, that is easily integrated into CI/CD tooling and that can handle complex scenarios such as authentication, file upload and download, mock network interaction, publish native mouse and keyboard events, take screenshots of web pages and record a movie of the scenario, Playwright works with a single browser instance (which is a sizable object in terms of memory usage and a substantial startup time) that can then run many (100s) of parallel scenarios in a fast start and light weight execute fashion. Each parallel scenario runs in its own isolated browser context — with its own device settings, memory context, viewport, authentication identity etc.
Many popular test frameworks provide some form of interaction with Playwright. Examples are Mocha, Chai, Jest/Jasmine, AVA, CodeceptJS (see https://playwright.dev/docs/test-runners/) . Note that for testing complex SPA web applications it might be convenient for stand alone testing to mock all calls to back end APIs; several solutions for this are available, one of which is mockiavelli.
An interesting additional type of testing — beyond functional and behavior oriented testing — is visual regression testing. Various tools are available that can be used to spot relevant differences in a user interface — indicative of visual regression. With Playwright’s capacity to take screenshots at specific steps in a end to end functional flow combined with one of these tools — Resemble.js, pixelmatch, Rembrandt.js — we can easily implement an automated check for UI distortion.
The Playwright site includes examples of integration of Playwright with several CI/CI tools, including GitHub action, Travis CI, Azure DevOps Pipelines, Jenkins, GitLab CI, CircelCI, AppVeyor — see https://playwright.dev/docs/ci for details.
Other Use Cases — let the fun begin!
Playwright was developed with test automation top of mind. The resulting library allows for automated browser operations in general. This can be leveraged for much more than just test scenarios. Some use cases that came to my mind:
- Deeplink Bookmarks — navigate to a specific point in a web application that is not directly accessible (with a full context prepared, ready for user action); we use Playwright to run a headful browser, let it make all preparatory steps so the human user can start immediately with meaningful actions. See below how I made my daily time entry task a bit more efficient.
- Tactical integration: automation of data retrieval (“Screen Scraping”) and data entry — periodically entering data into a website or retrieving information from a web site or application can take a lot of time and is potentially error prone (as well as not fun at all); using Playwright, we can automate these steps without having to implement a full blown code intensive integration component; for example: writing a Node application that reads a CSV file and enters records into a web form is quite straightforward using Playwright
- Health Checks (monitoring of User Interfaces): we can monitor the current status of our web applications by closely watching the activities of our current users; when something breaks, we can spot the error and come into action. However, we can also set up our own “synthetic” user who — through Playwright — is constantly active on our web application, running through the most relevant end to end scenarios and reporting on errors and deviations in response times.
- Automated Reporting — instead of checking various reports, charts an dashboards by navigating to all of them, a Node application can use Playwright to make these visits including all required filtering and adjustment and take screenshots, compiled into a single PDF or PowerPoint document to quickly provide an overview to the human user
- UI turned API — Sometimes we would like to have an API where none is available. Our vendor may offer only a UI on top of the COTS or SaaS application and we would really like to build an automated integration with our other applications. It is relatively to implement a REST API in Node and if that same Node application uses Playwright to interact with the Web Application, we can expose an API on top of it. See below the example of putting an API on top of IMDb.
- Demos and [step by step] Instructions — Using Playwright running in headful mode, we can create demo of using a web application. We can can show, slowly and step by step, how to carry out specific procedures. At any point, the user can stop the demo, inspect the application, carry out additional actions, then continue with the demo. We can even show floating labels inside the web application during the demo by manipulating the DOM.
- RPA — Robotic Process Automation: automated workflow across multiple systems, possibly a collaboration between human & robot. Much is said about RPA — in very fancy scenarios and in very simple workflows. With Playwright we can easily create Node applications that can combine multiple web applications as well as REST APIs — to gather information, combine that information and enter or send information to destinations. With the Node application running locally on a Windows computer and in combination with tools such as AutoHotKey we can create RPA flows that combine browser based applications and native Windows applications.
Simple (very simple) Code Sample
To give you a tiny flavor of what such a combination of Node and embedded browser looks like, is here the simplest code sample imaginable. It creates a browser instance in headless mode, a new page in that instance and then navigates that page to a specific URL. It takes a snapshot of the page when the navigation is complete — writes it to the local file system as example.png — and closes the browser instance.
Before this Node application can be ran successfully, you first need to install Playwright — using npm i — D playwright. This installs Playwright and browser binaries for Chromium, Firefox and WebKit.
Deeplink Bookmark for Quick Starting Time Entry
My company likes me to frequently enter my activities into our time sheet application. I not like doing that, as it is a rather involved process.
It takes me close to two (definitely non fun) minutes before I can start entering my hours.
Using Node and Playwright, I have create a deep link bookmark that can do most of the heavy lifting:
I only have click on a desktop shortcut. This runs a bat file that in turn runs the Node application I have created using Playwright. The Node application then performs all the steps I previously had to perform myself every day, including the Microsoft login procedure; all I have to do is confirm the authentication in the MFA app on my phone.
Opening the timesheet application is not very much faster than before — even the Playwright robot has to go through the same motions. However, it is so much more convenient that I am almost enjoying entering my hours.
The next step I might take is to add short cut buttons into the timesheet application, for example to copy yesterday’s activities to today.
I have also used Playwright to write a script that creates a CSV file with all timesheet details over a specific period — for additional analysis (how much over time did I have?)
UI Turned API — Exposing IMDb as an API
With a little bit Node and using Playwright, we can put an API on top of almost any web application. Node can easily expose a REST API, handle HTTP requests and when processing a request force a browser session to go through the predefined steps in interacting with a web application — to query information and gather it from the DOM to create a response message or to enter information from the request message into a form and submit said form.
An example would be IMDb — the popular website for movie and series details. IMDb does not provide an official API. Yet sometimes — for examples for workshops and demos — it would be nice to have just such an API. The Movie details page on the IMDb website almost reads like an API response:
The fields on the web page easily map to fields in a structured JSON message.
Using Playwright, I have created a simple Node application that handles an HTTP request that contains the title of a movie; the application instructs the embedded browser to navigate to the IMDb website, enter the title of a movie, execute the search and then retrieves the pieces of information from the web page elements. A JSON response body is composed using these elements and is returned in the HTTP response to the API request.
The source for this simple example is on GitHub: https://github.com/lucasjellema/playwright-scenarios/tree/main/imdb
Personalized Web Application — Customizing DuckDuck Go
You may be familiar with the search engine DuckDuck Go. You use it to search the internet. And it respects your privacy. It has a straightforward home page.
Nothing wrong with this home page. However, as a simple demonstration of what customization of a web application through Playwright might look like, I have done a few things to this page:
- add an HTML element to make it feel as my own
- add various links with special functionality
- manipulate the search string (by adding the site of the AMIS Technology Blog as search context)
- perform a Vanity Search (search on my own name and only entries from the last 30 days)
- execute a search on the current search string in seven different search engines — open each search engine in its own tab
Enter the search string “playwright test” and press Multi Search:
I have created a simple .bat file that runs Node and my search.js application that in turns run Playwright in headful mode. A Windows shortcut on my desktop refers to the bat file; clicking the shortcut is enough to run my personalized edition of DuckDuckGo.
The code for this simple example is in GitHub: https://github.com/lucasjellema/playwright-scenarios/tree/main/search
Playwright is a pretty great tool — for many purposes, including of course its original objective of UI Test Automation. Playwright has seen rapid innovation and adoption over the past year. Last week, release 1,.7 was published, the latest of close to 30 releases in 2020. Many other frameworks and tools now provide integration with or support for Playwright. It seems a worthy successor to Puppeteer and probably Selenium, Cypress and other browser testing tools.
I have had some fun already with applying Playwright to other use cases than the primary one, and I am quite sure I will make more use of that. Deeplink bookmarks to quickly inspect the console of specific cloud resource or start / stop such as resource for example — until I have time to create a proper API based solution; perhaps I will even schedule the bookmark using AutoHotKey. And I am sure I will do some screenscraping and RPA like workflowing with Playwright.
Note that Playwright based applications that run in headless mode can easily run as serverless functions (that is: if they complete within the timeout period of such functions). Microsoft offers a Docker Container Image with Playwright resources that can be used as foundation for custom container images with our own specific Playwright scenarios.
Expect some more articles from me on Playwright. It feels like I have found myself a new toy to play with.
Playwright Home Page — https://playwright.dev/
My early Playwright trials and explorations — https://github.com/lucasjellema/playwright-scenarios
Originally published at https://technology.amis.nl on December 21, 2020.