- https://github.com/kolodny/safetest
- https://github.com/cypress-io/cypress
- https://github.com/SeleniumHQ/selenium
- https://github.com/microsoft/playwright
- https://github.com/codeceptjs/CodeceptJS
- https://github.com/webdriverio/webdriverio
- https://github.com/testing-library/dom-testing-library
- https://github.com/dareid/chakram
- https://github.com/pactumjs/pactum
- https://github.com/karatelabs/karate
- https://github.com/Orange-OpenSource/hurl
-
Selenium released in 2004 (opensource; requires java - WebDriver, complex installation because different dependencies version must match: java, selenium, webdriver, protractor; chrome, complex dom manipulation, flaky tests) ~28k stars on Github.
-
Cypress released in 2017 (partially opensource, simple installation, simple dom manipulation, stable tests, but dashboard is closed source, alternative called sorrycypress) ~45k stars on Github.
-
Playwright released in 2020 (opensource, simple installation, simple dom manipulation, stable tests, powerfull tooling) ~57k stars on Github.
-
Others solutions are: WebdriverIO, Puppeteer, Nightwatch, Protractor (NES)
-
The main arguments to use Cypress and Playwright is they are supported by Angular and Nx, that it manages tests directly with the browser; via Chrome DevTools Protocol (CDP) or directly run on it (Cypress) compared to Selenium that uses an intermeriary tool called WebDriver to communicate with the differents browser that makes tests flaky.
-
https://www.rainerhahnekamp.com/en/angular-e2e-testing-protractor-is-dead-long-live-cypress/
-
https://www.lambdatest.com/blog/playwright-vs-selenium-vs-cypress/
- https://www.guru99.com/smoke-sanity-testing.html
- https://github.com/NoriSte/ui-testing-best-practices
- https://cypress.slides.com/amirrustam/patterns-practices
- https://netflixtechblog.com/introducing-safetest-a-novel-approach-to-front-end-testing-37f9f88c152d
- https://screenster.io/
- https://testrec.com/
- https://www.browserstack.com/
- https://angularplayground.it/
- https://testing-playground.com/
- https://crossbrowsertesting.com/
- https://github.com/grafana/k6
- https://github.com/apache/jmeter
- https://github.com/tsenart/vegeta
- https://github.com/buger/goreplay
- https://github.com/kffl/speedbump
- https://github.com/locustio/locust
- https://github.com/codesenberg/bombardier
- https://github.com/browserless/browserless
- https://github.com/webhooksite/webhook.site
- https://github.com/ihsw/toxiproxy-node-client
- https://github.com/mswjs/msw
- https://github.com/appium/appium
- https://github.com/rrweb-io/rrweb
- https://github.com/Netflix/pollyjs
- https://github.com/TradeMe/tractor
- https://github.com/nas5w/combinate
- https://github.com/guidepup/guidepup a11
- https://github.com/ComponentDriven/csf
- https://github.com/DevExpress/testcafe
- https://github.com/jscutlery/test-utils
- https://github.com/nightwatchjs/nightwatch
- https://www.herodevs.com/support/endbridge
- https://github.com/facebookincubator/memlab
- https://github.com/bahmutov/cy-api
- https://github.com/cypress-io/cypress
- https://github.com/NetanelBasal/cyrun
- https://github.com/agoldis/sorry-cypress
- https://github.com/YOU54F/cypress-plugins
- https://github.com/mfrachet/cypress-audit
- https://github.com/tnicola/cypress-parallel
- https://github.com/cypress-io/cypress-xpath
- https://github.com/briebug/cypress-schematic
- https://github.com/NoriSte/cypress-wait-until
- https://github.com/smeijer/testing-playground
- https://github.com/bahmutov/cypress-failed-log
- https://github.com/Elecash/nx-cypress-coverage
- https://github.com/socreate/angular-playground
- https://github.com/component-driven/cypress-axe
- https://github.com/ceceliacreates/ionic-cypress
- https://github.com/cypress-io/cypress-skip-test
- https://github.com/currents-dev/cypress-cloud
- https://github.com/currents-dev/cypress-debugger
- https://github.com/bahmutov/cypress-should-really
- https://github.com/gkushang/cucumber-html-reporter
- https://github.com/ksocha/cypress-circleci-reporter
- https://github.com/cypress-io/cypress-realworld-app
- https://github.com/meinaart/cypress-plugin-snapshots
- https://github.com/cypress-io/cypress-example-recipes
- https://github.com/maximilianschmitt/cypress-routines
- https://github.com/bahmutov/cypress-angular-unit-test
- https://github.com/testing-library/cypress-testing-library
- https://github.com/LayZeeDK/angular-module-teardown-options
- https://github.com/gothinkster/angular-realworld-example-app
- https://github.com/TheBrainFamily/cypress-cucumber-preprocessor
- https://github.com/Flaxline/angular-nx-cypress-coverage-example
- https://github.com/CypressCecelia/cypress-testing-angular-workshop
- https://github.com/cypress-visual-regression/cypress-visual-regression
- https://github.com/currents-dev/playwright-gh-actions-demo
- https://github.com/microsoft/playwright-test
- https://github.com/valendres/playwright-msw
- https://github.com/mxschmitt/try-playwright
- https://playwrightsolutions.com/
- https://try.playwright.tech
- https://playwright.tech/
- https://playwright.dev/
- https://github.com/stevekinney/cypress
- https://cypress.slides.com/cecelia/testing-angular-applications-with-cypress#/1
- https://webdave.de/blog/cypress
- https://www.youtube.com/watch?v=V-o8WzlwKmM Cypress Patterns and Practices
- https://www.youtube.com/watch?v=UHgtUSAROtc Comparing Testing Tools
- https://www.youtube.com/watch?v=aH19jwv1l70 Cypress test in angular
- https://medium.com/@charith.rhettiarachchi/why-use-jest-over-karma-for-angular-testing-b56ffa82f8
- https://itnext.io/cypress-storybook-keeping-test-scenario-data-and-component-rendering-in-one-place-c57b23cc1640
- https://blog.checklyhq.com/easy-automated-e2e-testing-monitoring-for-your-frontend-with-vercel-and-checkly-3/
- https://christianlydemann.com/the-most-common-cypress-mistakes/
- https://www.checklyhq.com/docs/puppeteer-recorder/
- https://timdeschryver.dev/blog/using-msw-in-an-angular-project
- the difference between the then() and the within(). then() allows you to do imperative/js on the get element itself while the within() is in the elements inside the get
- the difference between the within() and find(): within() allows you to do imperative/js and the find is classic chaining
note: you can also use then then() to trigger a function that use the cypress chaining, similar to a command but inside a function