Recommended Free Tools
To migrate Protractor tests for an Angular application, choose a maintained end-to-end runner, translate the tests and configuration into its idioms, then verify that the new suite preserves the user-visible behaviors your old tests covered. This is a test-runner migration—not usually a change to the Angular application itself. There is no universal replacement: Angular documents setup paths for Cypress and Playwright, while the Protractor maintainers also named Selenium WebDriver, Puppeteer, TestCafe, and WebdriverIO as alternatives.
Why migrate from Protractor?
The Angular team proposed ending Protractor development in a 2021 RFC. The proposal anticipated development ending around Angular v15 at the end of 2022 and identified August 2023 as an end-of-life milestone. These were proposed dates, not the date the repository was ultimately archived: the Protractor repository says it was archived on July 29, 2024. The RFC and repository notice provide the project history.
The RFC cited the legacy Control Flow model, its incompatibility with modern async/await and Selenium WebDriver 4, and the maintenance cost of removing that design. It also said, “there is no one-size-fits-all solution for all Angular projects out there.” The RFC reported close to 1,000 survey responses to an Angular E2E survey conducted in January 2021, with fewer than 20% reporting Protractor use. Those are historical survey results reported by the Angular team in 2021—not current market-share figures.
Choose a replacement for your requirements
Angular’s current end-to-end testing page documents setup directions for Cypress and Playwright. The commands below reflect that page at the time of writing; check the page for current integration availability and instructions before adopting one. Angular: End-to-End Testing.
#1 Best Overall
| Candidate | Useful decision question | What the cited guidance establishes |
|---|---|---|
| Cypress | Does its command and retry model, team familiarity, and CI workflow fit the suite? | Angular documents ng add @cypress/schematic. Cypress has a Protractor migration guide. Cypress migration guide. |
| Playwright | Do its locator, async/await, browser, and debugging idioms fit the suite? | Angular documents ng add playwright-ng-schematics. Playwright provides a Protractor migration guide and API mappings. Playwright migration guide. |
| Selenium WebDriver | Does standards-based WebDriver compatibility matter, and is a closer API transition useful? | The RFC says Protractor uses Selenium WebDriver underneath, making it API-close, but not an exact replacement; remove Control Flow assumptions if present. |
| Puppeteer, TestCafe, or WebdriverIO | Do the team’s existing skills, browser needs, and CI setup favor one of these? | The Protractor RFC lists them among non-exhaustive alternatives; the cited material does not rank or benchmark them. |
Before choosing, compare required browser engines and CI coverage, existing helpers and page objects, Angular CLI and CI integration, parallel execution and reporting needs, and whether tests cover non-Angular pages or multiple origins. These are project decision criteria, not product benchmark results.
Inventory the existing suite before rewriting it
Treat the old tests as a record of user-visible behavior to preserve, not as code that must be translated line by line. Record:
- Scenarios and assertions that protect critical user journeys.
- Custom locators, page objects, wrappers, helpers, and test data setup.
- Setup and teardown, browser configuration, environment assumptions, and CI commands.
- AngularJS-specific locators or reliance on Angular Testability, if any.
- Browser-specific behavior, non-Angular pages, and any navigation across origins.
This inventory is practical migration guidance, not an official prescribed checklist. It helps expose work that a simple locator mapping will miss.
Rank #2
How to migrate Protractor tests to Playwright
Playwright’s official guide recommends its own asynchronous test and locator idioms. For example, a Protractor scenario that opens a page, interacts with a field, and checks the result should be rewritten around Playwright’s page, locators, and assertions—not wrapped mechanically. The following is a runnable-style example using Playwright Test; adapt the route, selectors, and expected text to the actual application.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →import { test, expect } from '@playwright/test';
test('submits a search and shows matching results', async ({ page }) => {
await page.goto('http://localhost:4200/');
await page.getByLabel('Search').fill('angular');
await page.getByRole('button', { name: 'Search' }).click();
await expect(page.getByRole('heading', { name: /results/i })).toBeVisible();
});
Use selectors that correspond to the rendered UI and confirm they identify the intended element. The official migration guide maps Protractor CSS and other locators to page.locator(...), navigation to await page.goto(...), and browser URL reads to page.url(). Its mappings are starting points, not a guarantee that old selectors remain robust after application markup changes. See Playwright’s Protractor migration guide and API cheat sheet.
| Protractor pattern | Playwright direction |
|---|---|
| Locator methods or CSS selector | Use page.locator(selector), or a role, label, or other locator suited to the UI. |
| Navigate to a URL | await page.goto(url) |
| Read current browser URL | page.url() |
| Action or navigation that used Control Flow | Make the test async and explicitly await Playwright actions. |
How to migrate Protractor tests to Cypress
Cypress has a command and query model rather than Protractor’s promise-oriented call sequence. Translate the scenario into Cypress commands; do not mechanically wrap Protractor calls. This example shows a visit, form interaction, and retrying assertion. Update selectors and text for your application.
Rank #3
describe('search', () => {
it('shows matching results', () => {
cy.visit('http://localhost:4200/');
cy.get('input[aria-label="Search"]').type('angular');
cy.contains('button', 'Search').click();
cy.get('h1').should('contain.text', 'Results');
});
});
Cypress’s guide maps browser.get to cy.visit and browser back/forward actions to cy.go. It explains that Protractor assumes Angular unless told otherwise, while Cypress does not require disabling Angular behavior to visit a non-Angular page. Read the Cypress migration guide.
What replaces waitForAngular?
There is no single wait call to substitute everywhere. The destination runner’s own waiting model should usually handle ordinary UI transitions; first write an assertion about the desired UI state rather than adding an arbitrary delay.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Playwright: rely on auto-waiting for ordinary interactions
Playwright says its built-in auto-waiting makes Protractor’s waitForAngular unnecessary in general. For exceptional Angular 2+ synchronization needs, the migration guide documents a workaround that uses window.getAllAngularTestabilities() and Testability.whenStable. It also describes a polyfill that relies on Protractor client-side scripts. These are specific options for edge cases, not wrappers to add to every test. The simpler Testability example in that guide applies only to Angular 2+. Playwright synchronization guidance.
Rank #4
Cypress: use retrying queries and assertions
Cypress DOM queries retry until matching elements appear, with command failure governed by defaultCommandTimeout. A query followed by an assertion can express the expected rendered state without a Protractor-style wait call. This is not the same mechanism as Playwright’s auto-waiting, so follow Cypress’s own command and assertion model. Cypress waiting and migration guidance.
The Angular team’s RFC explains why this distinction matters: Protractor used Angular Testability to detect app stability, coupling the test framework to Angular internals. The RFC notes that other teams can use retry strategies without requiring the test platform to know those internals. That rationale does not prove that every application’s asynchronous behavior will be covered automatically; assert the specific outcome your test needs.
A safe migration sequence
- Document what must remain covered. Record critical scenarios, assertions, helpers, selectors, setup, browsers, and CI behavior.
- Pick a destination and verify its current setup. Check the runner’s official instructions for your Angular CLI and target CI environment; integrations can change.
- Pilot one representative scenario. Choose a flow that covers navigation, a form or other interaction, asynchronous rendering, and a meaningful assertion.
- Remove Control Flow assumptions. For Playwright, use async tests and await actions. For Cypress, use its command, query, and retry style.
- Translate selectors and assertions. Check the rendered UI and verify the same user outcome, not just that the rewritten test compiles.
- Move tests in small groups. Run old and new coverage in parallel where practical until important scenarios are represented in the replacement suite.
- Update infrastructure after the pilot works. Change dependencies, configuration, scripts, browser or driver provisioning, and CI jobs based on the destination runner’s current requirements. Protractor’s archived Selenium Server and WebDriver Manager tutorial is historical context, not current installation guidance. Protractor repository and archive notice.
- Retire Protractor only after verification. Remove the old runner and dependencies once the replacement suite covers required scenarios and the team has checked CI results.
Can you convert Protractor tests automatically?
Do not assume an arbitrary suite can be safely converted with one click. Playwright’s guide offers line-by-line examples and API mappings, not a guarantee of automatic suite conversion. Cypress published a migrator article on August 21, 2023 describing a hands-on playground that converts pasted snippets and links the Cypress APIs used; the article said it was not intended to transform entire folders or suites at that time. Because that statement is dated, check the tool’s current capabilities before relying on it. Neither source establishes automatic conversion for arbitrary suites. Cypress Migrator article.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Migration effort depends on your own wrappers and page objects, browser-specific behavior, AngularJS locators versus modern Angular markup, non-Angular pages, test-data setup, and CI infrastructure. A small pilot surfaces these differences without requiring an invented time estimate.
Troubleshooting common migration failures
| Symptom | Likely cause | What to check |
|---|---|---|
| The test fails on an element lookup | The old locator mapping does not match the rendered UI, or more than one element matches. | Inspect the page and validate the selector against the intended element; prefer stable semantic selectors where the application supports them. |
| An action runs before the expected content appears | The test still assumes Protractor’s Angular-stability behavior, or the new runner’s waiting idiom has not been used. | Wait for the actual UI condition with the target framework’s locator/assertion model. For an exceptional Angular 2+ Playwright case, consult the documented Testability option. |
| Playwright reports a missing await or tests race | Control Flow expectations remain in the converted code. | Make the test asynchronous and await navigation and actions as required by Playwright. |
| Cypress commands behave differently from sequential Protractor code | The test was translated mechanically instead of adopting Cypress’s command model. | Rewrite the flow using Cypress commands and retrying queries/assertions. |
| Angular CLI setup instructions do not work as expected | The integration instructions or project configuration may have changed, or the project environment differs. | Check Angular’s current E2E page and the runner’s official setup guide rather than relying on a stale command. |
| CI fails although a local pilot passes | Browser provisioning, scripts, environment assumptions, or CI configuration were not carried over. | Compare the pilot’s local and CI invocation, browser setup, configuration, and required test data before migrating the full suite. |
Or skip the browser setup:
If you need screenshots as part of debugging or documentation rather than an interactive E2E assertion, ScreenshotNeo is a separate website screenshot API and MCP server for developers. One GET request can return an image or PDF. It accepts cookie-consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be disabled. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses identify the page verdict and billing status. AI agents can use its MCP server tools: take_screenshot, get_page_info, and capture_pdf. Plans include 1,000 shots per month free with no card, and paid plans start at $5 for 3,000 shots. ScreenshotNeo also supports options such as full-page capture, CSS-selector element capture, device and viewport settings, PDF output, custom CSS and JavaScript, and async jobs; see the API documentation.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://angular.dev/tools/cli/end-to-end -o shot.webp
Sign up for ScreenshotNeo: get 1,000 screenshots a month free, with no card.
Frequently Asked Questions
Does migrating away from Protractor require changing the Angular application?
Usually this is a test-code and runner-configuration migration. The application changes only if your own selectors or testability setup need adjustment.
Should I choose Cypress or Playwright for every Angular project?
No. Select based on your browser and CI requirements, existing suite and team experience, and the runner’s waiting and debugging model; Angular documents setup paths for both.
Can I keep some Protractor tests while migrating?
A risk-managed migration can move tests in small groups and run old and new coverage in parallel where practical. Retire the old runner after required scenarios and CI output are verified.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




