Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@qawolf/logger

qawolf89BSD-3.00.9.3TypeScript support: included

qawolf logger (node only)

readme

QA Wolf

Create browser tests 10x faster

QA Wolf is a free and open source library to create Playwright/Jest browser tests and run them in CI

npm version

🚀 Get Started | 📖 API | 👋 Chat | 🗺️ Roadmap


  • Skip writing boilerplate. Your browser actions are converted to Playwright and Jest code.
  • Built for stability. Avoid flaky tests with automatic waiting and smart element selectors.
  • Test complex scenarios. Test your application like a user. Use third party sites, multiple windows, and hot keys.
  • Test across browsers. Test your application on Chromium, Firefox, and WebKit.
  • Easy CI setup. Run your tests in CI in parallel with one command, on push or on a schedule.
  • Easy debugging. Each test run in CI includes a video, GIF, and detailed logs.

We're working to build a world where browser testing is effortless. We hope you'll join us!

Table of Contents


🖥️ Install QA Wolf

Documentation

Install QA Wolf as a dev dependency with npm:

cd /my/awesome/project
npm install --save-dev qawolf

QA Wolf is tested against the maintenance LTS versions of Node, v10 and v12.


✅ Create a browser test

Documentation

Create a Playwright and Jest test:

npx qawolf create url [name]

Edit your test code as it is created by opening .qawolf/tests/myTestName.test.js.

Run your test:

npx qawolf test [name]

☁️ Set up CI

Documentation

Set up CI to run and record your tests in parallel. Use the video recording and detailed logs to debug failures.

Azure

npx qawolf azure

Bitbucket

npx qawolf bitbucket

CircleCI

npx qawolf circleci

GitHub

npx qawolf github

🦊 GitLab

npx qawolf gitlab

🤵 Jenkins

npx qawolf jenkins

Chat with us if you want to run QA Wolf somewhere else.


🙋 Get Help

👋 Chat | 📬 E-mail

We want QA Wolf to work for you, so please reach out to get help!


📝 License

QA Wolf is licensed under BSD-3-Clause.


🙏 Acknowledgements

The DOM Recording artifact is using @Yuyz0112's awesome rrweb library!

changelog

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

Generated by auto-changelog.

v0.9.3-alpha.0 - 2020-02-24

Merged

  • 🌲 Use attribute on ancestor as selector #430
  • ⌨️ type(..., { replace: true}) when entire text value is selected #428
  • Record mousedown & click events, rank group to pick best selector #454
  • 📹Capture after activating first page #434
  • buildCssSelector: target the clickable descendant #450
  • 🏖 Move tests from the internet to sandbox #436
  • ♻️Add browser argument and export script method #433
  • ⌨️ Do not clear in type by default 🏖️ Add comprehensive tests for type against sandbox #426
  • 📆 Add date and time pickers to sandbox #422
  • 🏖️ Add sandbox with material-ui and other common frameworks for tests #421
  • ✅Add e2e test against sandbox #420

Fixed

  • 🐛Allow passing --config to qawolf test #435
  • ♻️Use name as is, do not force camelCase #439
  • 🌎Specifying browsers fails on Windows #410 #414

v0.9.2 - 2020-02-13

Merged

  • fix: bring page to front when launching a browser #409

Fixed

  • add changelog (we will improve it over time) #369

v0.9.1 - 2020-02-13

Merged

  • fix: clear content editable #407
  • add gif to README #400

v0.9.0 - 2020-02-10

Merged

v0.9.0-beta.6 - 2020-02-10

Merged

  • do not wait for navigation before creating test #391

v0.9.0-beta.5 - 2020-02-10

v0.9.0-beta.4 - 2020-02-10

Merged

  • Update type expression in realtime #390

v0.9.0-beta.3 - 2020-02-09

Commits

  • update commander cd648c7
  • First pass at Use the REPL doc ae9ad5c
  • Update Add Assertions to use Playwright API directly b14fc25

v0.9.0-beta.2 - 2020-02-08

Merged

  • Fix multi-page test generation #387

v0.9.0-beta.1 - 2020-02-08

Merged

  • Use peerDependencies for common dependencies #384

v0.9.0-beta.0 - 2020-02-08

Merged

  • 👷Create code in realtime #380

v0.9.0-alpha.7 - 2020-02-04

Merged

  • 💻Use REPL while creating a test #377
  • repl() to open repl #373

v0.9.0-alpha.6 - 2020-02-03

Merged

  • Puppeteer -> Playwright #352

Fixed

  • add npx qawolf bitbucket #356

v0.9.0-alpha.5 - 2020-02-02

Commits

v0.9.0-alpha.4 - 2020-02-02

Fixed

  • switch to upstream ffmpeg-static #365

v0.9.0-alpha.3 - 2020-02-02

Commits

  • bring chromium pages to front dc83e93
  • store artifacts under the name of the browser being tested 9083715

v0.9.0-alpha.2 - 2020-02-01

Commits

  • sleep in between retry execution error a2a5129

v0.9.0-alpha.1 - 2020-02-01

Commits

  • waitFor: support promises fc3320a

v0.9.0-alpha.0 - 2020-02-01

Commits

  • upgrade playwright to 0.10.0 4b54da6
  • use screen for display env variable f33396d
  • consolidate QAWolfBrowserContext create logic 91ee360

v0.8.3 - 2020-01-31

Merged

  • Fix simulate click for elements without click() method 🤷 #364
  • add data-cy to default QAW_ATTRIBUTE #363

v0.8.2 - 2020-01-24

Merged

  • Record local docker #351
  • fix getClickableAncestor to work for multiple attributes #343

v0.8.1 - 2020-01-20

Merged

  • Fix windows tests #339
  • download compressed ffmpeg #338
  • Simulate click by default #334
  • Remove node xvfb dependency #337
  • feat(cli): Add path option #335
  • QAW_ATTRIBUTE: support multiple attributes #328
  • 😴Sleep before close #327
  • Add "npx qawolf jenkins" #326
  • use slimmer @qawolf/ffmpeg-static #325
  • runJest: override config #324

Fixed

  • use slimmer @qawolf/ffmpeg-static #316

v0.8.0 - 2020-01-11

Merged

  • Update ci templates for 0.8.0 #321

v0.8.0-alpha.2 - 2020-01-10

Merged

  • Fix various issues #319

v0.8.0-alpha.1 - 2020-01-10

Merged

  • Improve backwards compatibility with 0.7.0 #318
  • Fix cache by always installing ffmpeg-static #314
  • Fix 'Invalid command "create"' error in README.md #312
  • 🖼️Run tests on windows #310
  • Fix qawolf test exit code #309
  • test node v10 and node v12 #308

v0.8.0-alpha.0 - 2020-01-06

Merged

  • 💬Add comments to generated script code #305
  • feat(cli): Notify users if an update is available #303
  • 🖥Parallel displays in CI + 😌Remove docker dependency #286
  • Tutorial: Use a test attribute #301
  • When finding by attribute, inline result in code #297
  • change Selector to be a union type #295
  • Rename qawolf record -> qawolf create #293
  • Test Different Devices doc #290
  • Restructure docs #288
  • Fix record command in Get Started doc and add section on contributing to docs #285

v0.7.11 - 2019-12-28

Merged

  • qawolf record --device "iPhone 7" #275

v0.7.10 - 2019-12-28

Merged

  • Expose launch options.device and options.size #273
  • 🐺🎁 #269
  • feat(chore): configure pre-commit hook #238

v0.7.9 - 2019-12-23

Merged

  • override transform to prevent using external babel-jest #271
  • Home page revamp #267

v0.7.8 - 2019-12-21

Merged

  • Docker: add docker-host to hosts #266
  • Simplify readme #260

v0.7.7 - 2019-12-20

Merged

  • Increase hot key held threshold to 500ms #256

v0.7.6 - 2019-12-20

Merged

  • Do not skip click before type events #248

v0.7.5 - 2019-12-20

Merged

  • ⌨️Improve recorder hotkey support #244

v0.7.4 - 2019-12-19

Merged

  • use sendCharacter for keys that are single characters #241
  • 🇹How to use Typescript #239
  • Escape single quote characters in test name #237

v0.7.3 - 2019-12-13

Merged

  • fix queryElements type to be Element #234
  • faq: clarify testing tools stance #233
  • Add padding to first line on home page #232
  • 📚Move docs into this repo #231
  • Update readme for 0.7.x #227

v0.7.2 - 2019-12-13

Merged

  • findText: find the best matching element and make it case sensitive #230
  • Clean API #229

v0.7.1 - 2019-12-11

Merged

  • Export missing helpers, fix small bugs #228

v0.7.0 - 2019-12-09

Merged

  • ⌨️Improve simplifyStrokes #226
  • 🧹Clean API 🤖 qawolf record --script #224

v0.7.0-alpha.1 - 2019-12-09

Commits

  • find: element not found immediately retry 0279f36
  • default selectElement and scrollElement timeoutMs to QAW_FIND_TIMEOUT_MS c4794b5

v0.7.0-alpha.0 - 2019-12-08

Merged

  • Browser.find: retryExecutionError #223

v0.6.0 - 2019-12-04

Merged

  • 🐛currentPage should not choose a closed page #218
  • ✏️Inline values in test #215
  • Use fixed qawolf version in generated CI files #217
  • innertext: cleanText before setting as an attribute #214
  • do not choose non-common clickable element types #211

v0.6.0-alpha.0 - 2019-12-02

Merged

  • Fix inner text attribute #209
  • 💪Revamp selector #201
  • qawolf gitlab command #206
  • Update generated CircleCI config with example for running on schedule #205

v0.5.14 - 2019-11-22

Merged

  • ⏭️ Only skip click on input if we type next #196

v0.5.13 - 2019-11-21

Merged

  • fix timeoutMs = 0 #190

v0.5.12 - 2019-11-21

Merged

  • Support all keyboards #179
  • Include child image src and alt #177
  • Update README to include Azure and CircleCI setup #174
  • chore: minor code refactoring #173

v0.5.11 - 2019-11-18

Commits

  • add back puppeteer types 8888f68
  • remove unnecessary \ escape since we are not using handlebars now f211a2a

v0.5.10 - 2019-11-18

Merged

  • cli: add "qawolf azure" and "qawolf circleci" commands #171
  • qawolf docker: remove entrypoint & support parallel qawolf calls w/ multiple xvfb displays #167
  • findClickableAncestor: stop at expected clickable element types #166
  • Add title as strong match #162
  • upgrade puppeteer to 2.0 #161

v0.5.9 - 2019-11-12

Merged

  • Fix spacing in GitHub Actions workflow file #159

v0.5.8 - 2019-11-12

Merged

  • 👴Clickable ancestors #153
  • add packages/README.md #155
  • Add quickstart guides and explain QA Wolf in README #154
  • Allow waitUntil to take async function #152

v0.5.7 - 2019-11-11

Merged

  • Hotfix/fixup usage information #150
  • Feat/show version info #149
  • run tests on fork PRs #147
  • Warn for unknown commands #144
  • Wait for option with specified value in select #136

Fixed

  • chore: fix up usage information #142

v0.5.6 - 2019-11-11

Merged

  • Include alt and src attributes on element #135
  • link to docs #134

v0.5.5 - 2019-11-10

Commits

v0.5.4 - 2019-11-10

Merged

  • CLI command to generate GitHub Action #132

v0.5.3 - 2019-11-08

Commits

  • reload element after sleep 7b7096f
  • update test snapshot e4138ab
  • allow non-duplicate click on submit inputs dc13510

v0.5.2 - 2019-11-08

Commits

  • focus for empty value type steps 0def9a9
  • separate Enter and Tab to their own steps df11d9a
  • improve log 9d3991b

v0.5.1 - 2019-11-08

Commits

  • can select "description" select -> can select "description" fcd6e71
  • cli: do not offset dsstore as an available tests :) 0883d5c
  • fix paste for multiple pages 1afbc4a

v0.5.0 - 2019-11-08

Merged

  • ⌨️ Support keyboard events ✏️Support content editables 🚫🤖🖱️do not record non-user scrolls #119
  • QAWolfPage: serialize elements as xpath to make debugging easier #117

v0.4.4 - 2019-11-03

Merged

  • Create dom replayer artifact #115
  • only error scrolling when we cannot scroll at all #113
  • rename scrollElement -> scroll #111
  • waitUntil and getElementProperty helpers #110
  • simplify gif creation #109
  • Recorder: remove value interception and weird date logic #108

v0.4.3 - 2019-10-30

Merged

  • Set better defaults #107
  • "hasText" assertion #106
  • if an invalid test is passed, prompt the user to select a test to run #105
  • setup listr for qawolf record #104
  • Capture browser logs #103
  • Use html of all svg icon children rather than just path #102
  • runTest: clear cache #101
  • setup qawolf action to user dockerhub for speed #100
  • alias qawolf in Dockerfile #99

v0.4.2 - 2019-10-27

Merged

  • use toUpperCase instead of lodash upperCase which replaces _ with spaces #98

v0.4.1 - 2019-10-27

Merged

  • add github workflow to publish docker image #97
  • Tweak ux #96

v0.4.0 - 2019-10-27

Merged

  • qawolf record #92
  • Create GitHub package #91
  • Make jest environment generic #90
  • setup QAWolfPage to manage page instead of Browser #89
  • Improve test name code #87
  • rename job -> workflow #86
  • @qawolf/recorder -> @qawolf/screen #85

v0.3.5 - 2019-10-18

Commits

  • build not bootstrap in prepublish 5b104a2

v0.3.4 - 2019-10-18

Commits

v0.3.3 - 2019-10-18

Commits

v0.3.2 - 2019-10-18

Commits

v0.3.1 - 2019-10-18

Commits

v0.3.0 - 2019-10-18

Merged

  • Record video in docker #84
  • Add aria-label and title to descriptor #83
  • Include icon content in descriptor #82
  • Use only present keys in denominator for share matching #81
  • Wait for desired select value to become available #80
  • Remove xpath from strong match keys #77
  • add back --ignore-scripts to bootstrap and remove --hoist #79
  • bootstrap: --hoist to share dependencies and do not --ignore-scripts so puppeteer gets installed #78
  • 🧹semantic tests & 🐙separate packages w/ lerna #75

Fixed

  • prefix env variables with QAW_ #61

v0.2.2 - 2019-10-10

Commits

  • fix audit & update packages f494c30

v0.2.1 - 2019-10-10

Commits

  • include bin in npm package f5c3b89

v0.2.0 - 2019-10-10

Merged

  • 🔍 Refactor locate and match code #69
  • Change isMouseDown -> isClick #70
  • RequestTracker #68
  • Add data attribute to locator #65
  • add SLEEP_AFTER_EACH env variable #67
  • only fail fast in browser tests, not for qawolf tests #66
  • fail test after first test fails #63
  • Use puppeteer for typing and clicking #62
  • 💻e2e tests #56
  • fix actions change test #59
  • Trigger change event when setting input value #55
  • Include select and textarea for type actions #54
  • use jest #53
  • Refactor planner and add tests #52
  • add device emulation #47
  • Remove unused scroll steps and improve cli formatting #46
  • findCandidateElements: filter out elements w/o height or width #45
  • Use correct job name in cli #44
  • Scroll up/down as user did #34
  • add SCREENSHOT_PATH env variable #41
  • Docker: link qawolf so we can run "qawolf" commands #40
  • 💾Save/run jobs in .qawolf #39
  • build dockerfile first to partition the action logs #36
  • Setup qawolf github action #33
  • ▶️ setup tests with github actions #31
  • Prepare to publish to npm #32
  • 🎭switch to Puppeteer #28
  • Support multiple windows #24
  • Initial CLI #19
  • Selector -> Locator #23
  • Callbacks with screenshot #22
  • Setup Server/Client/Runner #20
  • "Smart" selector #16
  • Browser actions #11
  • plan workflow #5
  • Add cli skeleton #4
  • Add selenium tests to ci #2
  • add circleci config #1

Fixed

  • 💾 Save/run jobs in cwd/.qawolf #35