Skip to content

Commit

Permalink
Merge branch 'main' into giordanodaniel-guide-layout-optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
Dgiordano33 authored Oct 21, 2024
2 parents 7e2daba + 40faccb commit c75762f
Show file tree
Hide file tree
Showing 6 changed files with 704 additions and 2 deletions.
480 changes: 480 additions & 0 deletions site/content/guides/empowering-developers-with-checkly.md

Large diffs are not rendered by default.

209 changes: 209 additions & 0 deletions site/content/learn/playwright/playwright-vs-cypress.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
---
title: Playwright vs Cypress - Detailed comparison
subTitle: Key features, and pros & cons of each framework
date: 2024-10-17
author: Nocnica Mellifera
githubUser: serverless-mom
tags:
- basics
weight: 4
displayTitle: Playwright vs Cypress
navTitle: Playwright vs Cypress
menu:
learn:
parent: "Getting started"
---
Playwright and Cypress are two frameworks both closely associated with end-to-end testing of production websites. Both frameworks can do quite a bit more than 'making sure nothing on your site is broken' and their design philosophies, architectures, and use cases are different.

Starting in mid-2024, according to [npmtrends.com](https://npmtrends.com/cypress-vs-playwright), Playwright surpassed Cypress in npm downloads, indicating that more projects are starting with Playwright as their preferred automation framework. Playwright is the framework supported by Checkly in our current runtimes.

## Playwright overview
While Cypress is a testing tool, Playwright is an automation solution.

This distinction is important when you compare these solutions to the present day realities of automation.

Playwright is a tool focused on developer productivity with more robust built-in features, the ability to use async/await, built in parallelization, a much lighter weight in CI. Playwright is also less opinionated because it doesn’t have to be, you can use it however you want. Playwright can [monitor your APIs](https://www.checklyhq.com/blog/test-apis-with-playwright/) just as well as it can your frontend web pages. Scraping content for a LLM model? Check! Have a nested app in an iframe you want to test? Go wild! *Three different browser sessions in the same chat instance? Sounds cool! Re-use your tests to monitor production? Absolutely.*

## Playwright Key Features
- Supports multiple languages: JavaScript, TypeScript, Python, Java, C#
- Create tests without writing any code with their test generator
- Cross-platform testing (Windows, macOS, Linux)
- Native support for multiple browsers (Chromium, Firefox, WebKit)
- API testing, visual regression, and component testing support
- Test parallelism and isolated browser contexts
- Headless and headed modes for fast execution
- Advanced debugging tools like Trace Viewer
- Network-level testing: intercepts requests and manipulates responses
- Integrates easily with CI/CD pipelines

## Cypress overview

With Cypress, E2E went from the painful world of hard-coded waits and heavy-handed POM approaches to built in actionability and visibility checks with a focus on community building and developer experience. What we’ve seen over the course of the last five years or so is a cultural shift in the testing world from a heavy reliance on Manual QA and non-developer owned testing responsibilities to testing as a more fully incorporated practice. We’ve shifted left.

We’ve also seen testing become the battleground of where your developer velocity goes to die.

Titles have changed, entire departments have been lost to restructures, responsibilities have adjusted and solutions that were groundbreaking less than a decade ago are now no longer cutting edge.

The main areas where Cypress loses now used to be where they won; community trust, focus on developer productivity and rapid feature development. It’s not that those things don’t matter to Cypress any longer, but their attention has clearly shifted to solving enterprise problems. We can talk about [blocking npm packages](https://currents.dev/posts/v13-blocking), or [paywalling features](https://docs.cypress.io/guides/cloud/test-replay) that create parity with Playwright, but that would be a distraction. What really matters is velocity and practicality. A solution without parity to its top competitor, that requires the largest machines in CI and is still slower to run; is neither efficient nor practical unless you’re already using it.

## Cypress Key Features
- JavaScript and TypeScript support (limited to web apps)
- Native test runner with interactive GUI
- Provides automatic waits, retry logic, and time travel debugging
- Rich network mocking and stubbing tools
- Custom dot-notation language for async
- Supports browser automation for Chromium-based browsers
- Focuses on frontend testing but supports API testing
- Strong documentation
- Direct access to browser internals, enabling state manipulation

## **Playwright vs Cypress: Architectural Differences**

### **Overview of Architectures**
The architectural differences between Playwright and Cypress reflect distinct design philosophies and impact how each tool interacts with browsers and testing workflows. Playwright leverages the **Chrome DevTools Protocol (CDP)** to automate browsers directly, while Cypress runs within the browser’s execution loop via a custom Electron-based app. These design choices affect browser support, performance, parallelization, and test writing practices.

---

### **Playwright Architecture**
- **CDP-based**: Playwright interacts with browsers using the Chrome DevTools Protocol, which is natively supported by major browsers (Chromium, Firefox, WebKit). This allows it to control the browser externally without modifying the browser’s native execution loop.
- **Separate Node Process**: Since Playwright runs outside the browser’s execution loop, it requires an external process (Node.js) to orchestrate tests. This design is more similar to Selenium’s WebDriver model, although Selenium 4 now also supports CDP.
- **Language Flexibility**: Playwright’s architecture allows multi-language support, including JavaScript, TypeScript, Python, Java, and C#. It can also integrate with other frameworks like RobotFramework.
- **Parallel Testing**: Playwright offers built-in parallelism without additional configuration, enabling faster test execution out of the box.
- **Browser & Tab Support**: Playwright supports all major browsers and multiple tabs, giving it flexibility for complex test scenarios. It also has experimental support for mobile testing.
- **Standardized Integration**: Playwright integrates smoothly with high-level testing frameworks (e.g., CucumberJS, CodeceptJS) without custom runners, as the browser behaviors remain unmodified.

---

### **Cypress Architecture**
- **Electron-based App**: Cypress runs as a native JavaScript app embedded within an Electron browser. This architecture means tests and Cypress’s custom library run **within the browser’s execution loop**, directly injecting code into the test browser.
- **Tight Browser Integration**: This direct integration allows Cypress to manipulate browser behavior (e.g., automatic waits and retries) but limits support to JavaScript and transpiled languages. It also complicates browser support—Safari, for instance, is not currently supported.
- **Single Process Control**: Cypress uses a combination of Node.js and its custom library for test execution, but the bulk of the test control happens in the browser, limiting flexibility compared to Playwright’s external Node process.
- **Component Testing Support**: Because Cypress runs directly within the browser, it enables component and unit testing as well as E2E tests in the same framework. However, this approach changes the browser’s behavior, creating potential differences from real-world user scenarios.
- **Limited Parallelism**: Parallelization is not available out of the box and requires a **SaaS subscription** to Cypress Cloud for optimal parallel test execution.
- **Limited Tab and iFrame Support**: Cypress does not support multiple tabs and has limited and sometimes inconsistent iFrame handling, making it less effective for complex web applications.

---

### **Impact of Architectural Differences**

1. **Browser and Platform Support**
- Playwright supports all modern browsers (Chromium, Firefox, WebKit) and can run on multiple operating systems with little configuration (sidenote: Checkly currently supports using Chromium or Chrome with Playwright Test and Playwright library, with Chromium being the default browser for all checks. [Read more about using Chrome](https://www.checklyhq.com/docs/browser-checks/#using-other-browsers)).
- Cypress, with its Electron-based architecture, requires adaptation for each browser and does not support Safari or tabs.

2. **Testing Flexibility**
- Playwright’s language-agnostic design supports a wide range of frameworks and languages beyond JavaScript. Cypress is restricted to JavaScript and TypeScript.
- Playwright focuses on E2E and system testing, while Cypress can handle both component and E2E testing within the same framework, though it changes browser behavior in the process.

3. **Parallelization and CI Integration**
- Playwright offers **free built-in parallel testing** and easily integrates with CI pipelines using only `npm install`. Cypress requires either SaaS subscriptions or workarounds for parallelism, increasing costs and complexity.
- For remote testing, Playwright integrates seamlessly with Selenium Grid and SaaS solutions (e.g., BrowserStack), while Cypress relies on its own cloud service.

4. **Performance and Practicality**
- Playwright’s external control through CDP offers **more realistic testing**, reflecting real user behavior without modifying browser internals.
- Cypress’s tight browser integration provides fast feedback loops for developers but can lead to discrepancies between test environments and real-world scenarios.

5. **Asynchronous Code Handling**
- Playwright uses standard **async/await** syntax, providing a clear, modern JavaScript interface. Cypress uses a custom dot notation that simplifies code but is not fully asynchronous, limiting flexibility.

---

### **Which Architecture Fits Your Needs?**
- **Choose Playwright** if you need cross-browser support, parallelism, and multi-language flexibility. Its architecture is more scalable for complex, multi-layered applications that demand realistic, real-world testing.
- **Choose Cypress** if your focus is on quick feedback during frontend development, and you prefer a highly interactive testing experience embedded within the browser. Cypress is ideal for teams already working in a JavaScript/TypeScript environment with limited browser requirements.

## Playwright vs Cypress: Key Differences Comparison

| Feature | Playwright | Cypress |
|------------------------|--------------------------------------------|--------------------------------------|
| Language | JavaScript, TypeScript, Python, Java, C# | JavaScript, TypeScript |
| Test Runner | Works with Jest, Mocha, and others | Built-in test runner |
| Operating Systems | Windows, macOS, Linux | Windows, macOS, Linux |
| Open Source | Yes | Yes |
| Parallel Testing | Full parallelism, even within specs | Parallel at spec level only |
| Architecture | Uses browser contexts for isolation | Runs within the browser itself |
| Browsers Supported | Chromium, Firefox, WebKit | Chrome, Edge (Chromium-based) |
| Documentation | Strong Microsoft support, Discord channel | Strong community, Slack support |
| Real Devices Support | Limited | No |
| Plugins | Relies on custom setup | Ecosystem of plugins |

---

## Playwright vs Cypress Examples
At the highest level, Playwright and Cypress tests look very similar when writing a basic tests. Differences only really become visible when you make two asynchronous requests with assertions.

### Playwright Example
```javascript
const { test, expect } = require('@playwright/test');

test('Multiple API Requests Test', async ({ request }) => {
// First request and assertion
const todoResponse = await request.get('https://jsonplaceholder.typicode.com/todos/1');
expect(todoResponse.status()).toBe(200);

// Second request and assertion
const userResponse = await request.get('https://jsonplaceholder.typicode.com/users/1');
expect(userResponse.status()).toBe(200);
});

```

Playwright uses the standard `await` syntax used in the rest of Node.js.

### Cypress Example
```javascript
describe('Multiple API Requests Test', () => {
it('should return valid status codes for two API requests', () => {
// First request and assertion
cy.request('https://jsonplaceholder.typicode.com/todos/1')
.its('status')
.should('eq', 200);

// Second request and assertion
cy.request('https://jsonplaceholder.typicode.com/users/1')
.its('status')
.should('eq', 200);
});
});

```
With Cypress, we're using their custom syntax, which is a bit more compact but still has it's own specialized field of knowledge. If you're pursuing a monitoring as code strategy and getting everyone involved in testing and monitoring, this domain-specific syntax may be a barrier to entry.

Further, Cypress asynchrony may not act as expected if we're used to asynchrony from Node.js. In Cypress, each `cy.request()` runs asynchronously, but Cypress queues them sequentially. This ensures that the second request only executes after the first one completes, making this pattern simple and effective for making multiple assertions across async requests.

---

## Playwright vs Cypress: Pros & Cons

### Playwright Pros
- Supports more browsers, including Firefox and Safari/WebKit
- Suitable for complex web apps with API, UI, and visual testing combined
- Superior parallelism and scalability for larger test suites
- Works on multiple platforms

### Playwright Cons
- More complex setup for beginners
- Larger learning curve compared to Cypress
- Requires deeper configuration to utilize full power

### Cypress Pros
- User-friendly interface, easy for beginners
- GUI with real-time updates during tests
- Great for frontend testing

### Cypress Cons
- Limited to Chromium-based browsers
- Struggles with large-scale parallelism
- No native support for multi-language tests

---

## Playwright vs Cypress: Which Solution is Better for You?

- Choose Playwright if you need to test across multiple browsers, require advanced parallelism, or need to include API and component testing in your workflow. It’s better suited for complex, large-scale projects with multiple stakeholders.
- Choose Cypress if your focus is frontend testing, or you are working on web apps that run primarily in Chrome/Edge. Cypress is more user-friendly for teams without extensive testing experience and offers quick startup time with fewer configurations.

---

## Conclusion

Both Playwright and Cypress are powerful tools, but each shines in different areas. Playwright’s versatility makes it the better choice for complex, multi-layered applications requiring scalability, while Cypress excels in simplicity and frontend testing. Your decision should align with your project’s needs, team experience, and browser requirements.
8 changes: 7 additions & 1 deletion site/content/learn/playwright/playwright-vs-others.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ menu:
learn:
parent: "Getting started"
---

There are a number of options when for [frameworks for end-to-end testing](https://www.checklyhq.com/blog/cypress-vs-selenium-vs-playwright-vs-puppeteer-speed-comparison/). If you're thinking about using Checkly, you're likely aware of a few.

## Puppeteer vs Playwright

Expand All @@ -31,3 +31,9 @@ In short, Playwright builds on the experience of Puppeteer to provide a way to:

This is achieved in the form of a compact node library that exposes a high-level API to interact with web pages in a fast, secure, stable and simple way. As it is an open-source project, you can [contribute](https://github.com/microsoft/playwright/blob/master/CONTRIBUTING.md) to it yourself.

## Playwright vs Cypress
Long the dominant framework for (at the time) modern end-to-end testing, Cypress is still very widley used as a testing framework by front-end focused teams.

Due to architectural differences, Playwright can support multiple languages for writing tests, and run more browsers for testing. Due to Playwright's status as a free and open source project, users don't have to deal with new features being paywalled, a significant issue for Cypress users since 2023.

[Read more about Playwright vs. Cypress.](/learn/playwright/playwright-vs-cypress/)
Binary file added site/static/images/avatars/daniel-giordano.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/static/images/avatars/nica-mellifera.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 8 additions & 1 deletion vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@
{ "source": "/guides/puppeteer-to-playwright(/)?", "destination": "/guides/moving-from-puppeteer-to-playwright/", "permanent": true },
{ "source": "/guides/monitoring-as-code-cli(/)?", "destination": "/guides/monitoring-ecommerce-apps-using-playwright/", "permanent": true },
{ "source": "/guides/setup-scripts(/)?", "destination": "/guides/setup-scripts-for-apis/", "permanent": true },
{ "source": "/guides/openapi-swagger(/)?", "destination": "/guides/monitoring-an-openapi-spec/", "permanent": true }
{ "source": "/guides/openapi-swagger(/)?", "destination": "/guides/monitoring-an-openapi-spec/", "permanent": true },
{ "source": "/docs/private-locations/private-locations-getting-started(/)?", "destination": "/docs/private-locations/private-locations-getting-started/", "permanent": true },
{ "source": "/docs/private-locations/checkly-agent-guide(/)?", "destination": "/docs/private-locations/checkly-agent-configuration/", "permanent": true },
{ "source": "/docs/browser-checks/partials-code-snippets(/)?", "destination": "/docs/snippets/", "permanent": true },
{ "source": "/docs/integrations/terraform(/)?", "destination": "/docs/terraform-provider/", "permanent": true },
{ "source": "/docs/browser-checks/runner-specification(/)?", "destination": "/docs/runtimes/specs/", "permanent": true },
{ "source": "/docs/browser-checks/login-and-secrets(/)?", "destination": "/docs/browser-checks/login-scenarios/", "permanent": true },
{ "source": "/docs/integrations/prometheus-v1(/)?", "destination": "/docs/integrations/prometheus/", "permanent": true }
]
}

0 comments on commit c75762f

Please sign in to comment.