Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(e2e): Major refactor and stabilization of e2e tests #7581

Merged
merged 115 commits into from
Aug 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
6f2250d
fix: update broken locator
ozyx Jul 26, 2024
8071784
update eslint package
unlikelyzero Feb 26, 2024
0e39055
first pass of lint fixes
unlikelyzero Feb 26, 2024
337ab4a
update package
unlikelyzero Mar 12, 2024
cf9f6fe
change ruleset
unlikelyzero Mar 12, 2024
b81fa6c
update component tests to match linting rules
unlikelyzero Mar 12, 2024
cf983c8
driveby
unlikelyzero Mar 13, 2024
7aa6817
start to factor out bad locators
unlikelyzero Mar 13, 2024
bcbb7aa
update gauge component
unlikelyzero Mar 13, 2024
57824ee
update notebook snapshot drop area
unlikelyzero Mar 13, 2024
f0e4590
Update plot aria
unlikelyzero Mar 13, 2024
8f42632
add draggable true to tree items
unlikelyzero Mar 13, 2024
8665fad
update package
unlikelyzero Jul 13, 2024
b863684
driveby to remove dead code
unlikelyzero Jul 13, 2024
dffd82f
unneeded
unlikelyzero Jul 13, 2024
46660fe
unneeded
unlikelyzero Jul 13, 2024
f84574a
tells a screenreader that this is a row and a cell
unlikelyzero Jul 13, 2024
b77a907
adds an id for dragondrops
unlikelyzero Jul 13, 2024
16c8e9b
this should be a button
unlikelyzero Jul 13, 2024
e902717
first pass at fixing tooltip selectors
unlikelyzero Jul 13, 2024
442c0d0
review comments
unlikelyzero Jul 22, 2024
54ee078
Updating more tests
unlikelyzero Jul 23, 2024
73bec41
update to remove expect expect given our use of check functions
unlikelyzero Jul 23, 2024
82a2c90
add expand component
unlikelyzero Jul 23, 2024
9d57e70
move role around
unlikelyzero Jul 23, 2024
e9a84cb
update more locators
unlikelyzero Jul 23, 2024
32d8c8b
force
unlikelyzero Jul 23, 2024
8fd531d
new local storage
unlikelyzero Jul 24, 2024
3b15eb9
remove choochoo steps
unlikelyzero Jul 24, 2024
b3d9018
test: do `lint:fix` and also add back accidentally removed code
ozyx Jul 31, 2024
3a5e9d8
test: add back more removed code
ozyx Jul 31, 2024
251bc4f
test: remove `unstable` annotation from tests which are not unstable
ozyx Jul 31, 2024
eebddbc
Merge branch 'fix-generatedata-tests' into eslint_update
ozyx Jul 31, 2024
1fc05c3
test: remove invalid test-- the "new" time conductor doesn't allow fo…
ozyx Jul 31, 2024
ad5986a
test: fix unstable gauge test
ozyx Jul 31, 2024
ffb5b7b
test: remove useless asserts-- this was secretly non-functional. now …
ozyx Jul 31, 2024
50adb24
test: add back accidentally removed changes
ozyx Jul 31, 2024
299da60
test: revert changes that break test
ozyx Jul 31, 2024
ea238af
test: more fixes
ozyx Jul 31, 2024
be74eca
Remove all notion of the unstable/stable e2e tests
unlikelyzero Jul 31, 2024
1877b73
test: eviscerate the flake with FACTS and LOGIC
ozyx Jul 31, 2024
7341423
test: fix anotha one
ozyx Jul 31, 2024
c6d46ec
lint fixes
unlikelyzero Jul 31, 2024
d33a697
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Jul 31, 2024
2978181
test: no need to wait for save dialog
ozyx Aug 1, 2024
f1b9010
test: fix more tests
ozyx Aug 1, 2024
ee2f515
lint: fix more warnings
ozyx Aug 1, 2024
0807aa9
test: fix anotha one
ozyx Aug 1, 2024
bf68a64
test: use `toHaveLength` instead of `.length).toBe()`
ozyx Aug 2, 2024
f778445
test: stabilize tabs view example imagery test
ozyx Aug 2, 2024
814e562
fix: more tests be fixed
ozyx Aug 2, 2024
e2aa696
test: more `toHaveCount()`s please
ozyx Aug 2, 2024
51d4f0f
test: revert more accidentally removed fixes
ozyx Aug 2, 2024
1b9e15b
test: fix selector
ozyx Aug 2, 2024
1ad5bd1
test: fix anotha one
ozyx Aug 2, 2024
2985e70
update lint rules to clean up bad locators in shared fixtures
unlikelyzero Aug 2, 2024
8247140
update and remove bad appActions
unlikelyzero Aug 2, 2024
1861553
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 2, 2024
d05cb89
test: fix some restricted notebook tests
ozyx Aug 2, 2024
ad7977c
test: mass find/replace to enforce `toHaveCount()` instead of `.count…
ozyx Aug 2, 2024
694c0e9
Remove some bad appActions and update text
unlikelyzero Aug 2, 2024
68b45f8
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 2, 2024
9fce8e4
test: fix da tree tests
ozyx Aug 2, 2024
1144cb8
test: await not await await
ozyx Aug 2, 2024
46967e7
test: fix upload plan appAction and add a11y
ozyx Aug 2, 2024
0f0eadf
Updating externalFixtures with best practice locators and add missing…
unlikelyzero Aug 2, 2024
5e9a27f
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 2, 2024
f640b73
test: fix test
ozyx Aug 2, 2024
78cc66c
test: fix appAction test for plans
ozyx Aug 2, 2024
f920b16
test: yum yum fix'em up and get rid of some dragon drops
ozyx Aug 2, 2024
f0cd9ce
fix: alas, a `.only()` got my hopes up that i was done fixing tests
ozyx Aug 2, 2024
deb52c8
test: add `setTimeConductorMode` test "suite" which covers most TC re…
ozyx Aug 2, 2024
758238c
test: fix arg
ozyx Aug 2, 2024
fb0e517
test(couchdb): fix some network tests via expect polling
ozyx Aug 3, 2024
6e4da76
Stabalize visual test
unlikelyzero Aug 3, 2024
1821eaa
getCanasPixels
unlikelyzero Aug 3, 2024
af5c7e9
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 3, 2024
8c7025c
test: stabilize tooltip telemetry table test, better a11y for tooltips
ozyx Aug 5, 2024
c0dec4f
chore: update to use `docker compose` instead of `docker-compose`
ozyx Aug 5, 2024
55ae3ff
New rules, new tests, new me
unlikelyzero Aug 6, 2024
bfaa435
fix sort order
unlikelyzero Aug 6, 2024
b717599
test: add `waitForPlotsToRender` framework test, passthru timeout ove…
ozyx Aug 6, 2024
110d7b4
test: remove `clockOptions` test as we have `page.clock` now
ozyx Aug 6, 2024
5ab5745
test: refactor out `overrideClock`
ozyx Aug 6, 2024
7b593ff
test: use `clock.install` instead
ozyx Aug 6, 2024
0adc9e3
test: use `clock.install` instead
ozyx Aug 6, 2024
0d960af
time clock fix
unlikelyzero Aug 6, 2024
f4ceb8e
test: fix timer tests
ozyx Aug 6, 2024
6e5dbe2
remove ever reference to old base fixture
unlikelyzero Aug 6, 2024
8af5b82
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 6, 2024
4894aee
test: stabilize restricted notebook test
ozyx Aug 6, 2024
f17884f
lint fixes
unlikelyzero Aug 6, 2024
6fa3876
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 6, 2024
1a9bf8d
test: use clock.install
ozyx Aug 6, 2024
b85c8ce
update timelist
unlikelyzero Aug 6, 2024
cdb1d1f
Merge branch 'eslint_update' of https://github.com/nasa/openmct into …
unlikelyzero Aug 6, 2024
ba74373
test: update visual tests to use `page.clock()`, update snapshots
ozyx Aug 6, 2024
c05b999
test: stabilize tree renaming/reordering test
ozyx Aug 7, 2024
754f490
a11y: add aria-label and role=region to object view
ozyx Aug 7, 2024
3d67f0f
refactor: use `dragTo`
ozyx Aug 7, 2024
5a66f12
refactor: use `dragTo`, other small fixes
ozyx Aug 7, 2024
01a5e37
test: use `page.clock()` to stabilize tooltip telemetry table test
ozyx Aug 7, 2024
cd91a9c
test: use web-first assertion to stabilize staleness test
ozyx Aug 7, 2024
5fb32ea
test: knock out a few more `page.click`s
ozyx Aug 7, 2024
8dd4b19
test: destroy all `page.click()`s
ozyx Aug 7, 2024
2614c62
refactor: consistently use `'Ok'` instead of `'OK'` and `'Ok'` mixed
ozyx Aug 7, 2024
2c0d73d
test: remove gauge aria label
ozyx Aug 7, 2024
6361995
test: more test fixes
ozyx Aug 7, 2024
26e2308
test: more fixes and refactors
ozyx Aug 7, 2024
5770780
docs: add comment
ozyx Aug 7, 2024
fdd0861
test: refactor all instances of `dragAndDrop`
ozyx Aug 7, 2024
013a632
test: remove redundant test (covered in previous test steps)
ozyx Aug 7, 2024
f00834a
test: stabilize imagery operations tests for display layout
ozyx Aug 7, 2024
34cf925
chore: remove bad unicorn rule
ozyx Aug 7, 2024
93f2833
chore(lint): remove unused disable directives
ozyx Aug 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ jobs:
- generate_and_store_version_and_filesystem_artifacts
e2e-test:
parameters:
suite: #stable or full
suite: #ci or full
type: string
executor: pw-focal-development
parallelism: 7
Expand Down Expand Up @@ -162,7 +162,7 @@ jobs:
- run: npx playwright@1.45.2 install #Necessary for bare ubuntu machine
- run: |
export $(cat src/plugins/persistence/couch/.env.ci | xargs)
docker-compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach
docker compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach
sleep 3
bash src/plugins/persistence/couch/setup-couchdb.sh
- run: sh src/plugins/persistence/couch/replace-localstorage-with-couchdb-indexhtml.sh #Replace LocalStorage Plugin with CouchDB
Expand Down Expand Up @@ -253,8 +253,8 @@ workflows:
name: node18-chrome
node-version: lts/hydrogen
- e2e-test:
name: e2e-stable
suite: stable
name: e2e-ci
suite: ci
- e2e-mobile
- visual-a11y:
name: visual-a11y-ci
Expand Down
17 changes: 4 additions & 13 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -482,19 +482,10 @@
"composables",
"countup",
"darkmatter",
"Undeletes"
],
"dictionaries": [
"npm",
"softwareTerms",
"node",
"html",
"css",
"bash",
"en_US",
"en-gb",
"misc"
"Undeletes",
"SSSZ"
],
"dictionaries": ["npm", "softwareTerms", "node", "html", "css", "bash", "en_US", "en-gb", "misc"],
"ignorePaths": [
"package.json",
"dist/**",
Expand All @@ -505,4 +496,4 @@
"html-test-results",
"test-results"
]
}
}
5 changes: 2 additions & 3 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ const config = {
browser: true,
es2024: true,
jasmine: true,
node: true,
worker: true,
serviceworker: true
amd: true,
ozyx marked this conversation as resolved.
Show resolved Hide resolved
node: true
ozyx marked this conversation as resolved.
Show resolved Hide resolved
},
globals: {
_: 'readonly',
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e-couchdb.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
- name: Start CouchDB Docker Container and Init with Setup Scripts
run: |
export $(cat src/plugins/persistence/couch/.env.ci | xargs)
docker-compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach
docker compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach
sleep 3
bash src/plugins/persistence/couch/setup-couchdb.sh
bash src/plugins/persistence/couch/replace-localstorage-with-couchdb-indexhtml.sh
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e-flakefinder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
- run: npm ci --no-audit --progress=false

- name: Run E2E Tests (Repeated 10 Times)
run: npm run test:e2e:stable -- --retries=0 --repeat-each=10 --max-failures=50
run: npm run test:e2e:ci -- --retries=0 --repeat-each=10 --max-failures=50

- name: Archive test results
if: success() || failure()
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Our e2e (end-to-end), Visual, and Performance tests leverage the Playwright fram
- **e2e Tests**: These tests are run on every commit. To run the tests locally, use:

```sh
npm run test:e2e:stable
npm run test:e2e:ci
```

- **Visual Tests**: For running the visual test suite, use:
Expand Down
4 changes: 2 additions & 2 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ The e2e line coverage is a bit more complex than the karma implementation. This
1. Each e2e suite will start webpack with the ```npm run start:coverage``` command with config `webpack.coverage.mjs` and the `babel-plugin-istanbul` plugin to generate code coverage during e2e test execution using our custom [baseFixture](./baseFixtures.js).
1. During testcase execution, each e2e shard will generate its piece of the larger coverage suite. **This coverage file is not merged**. The raw coverage file is stored in a `.nyc_report` directory.
1. [nyc](https://github.com/istanbuljs/nyc) converts this directory into a `lcov` file with the following command `npm run cov:e2e:report`
1. Most of the tests are run in the '@stable' configuration and focus on chrome/ubuntu at a single resolution. This coverage is published to codecov with `npm run cov:e2e:stable:publish`.
1. The rest of our coverage only appears when run against `@unstable` tests, persistent datastore (couchdb), non-ubuntu machines, and non-chrome browsers with the `npm run cov:e2e:full:publish` flag. Since this happens about once a day, we have leveraged codecov.io's carryforward flag to report on lines covered outside of each commit on an individual PR.
1. Most of the tests focus on chrome/ubuntu at a single resolution. This coverage is published to codecov with `npm run cov:e2e:ci:publish`.
1. The rest of our coverage only appears when run against persistent datastore (couchdb), non-ubuntu machines, and non-chrome browsers with the `npm run cov:e2e:full:publish` flag. Since this happens about once a day, we have leveraged codecov.io's carryforward flag to report on lines covered outside of each commit on an individual PR.


### Limitations in our code coverage reporting
Expand Down
6 changes: 3 additions & 3 deletions codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ coverage:
informational: true
precision: 2
round: down
range: '66...100'
range: "66...100"

flags:
unit:
carryforward: false
e2e-stable:
e2e-ci:
carryforward: false
e2e-full:
carryforward: true

comment:
layout: 'diff,flags,files,footer'
layout: "diff,flags,files,footer"
behavior: default
require_changes: false
show_carryforward_flags: true
18 changes: 14 additions & 4 deletions e2e/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
/* eslint-disable no-undef */
module.exports = {
extends: ['plugin:playwright/playwright-test'],
extends: ['plugin:playwright/recommended'],
rules: {
'playwright/max-nested-describe': ['error', { max: 1 }]
'playwright/max-nested-describe': ['error', { max: 1 }],
'playwright/expect-expect': 'off'
},
overrides: [
{
files: ['tests/visual/*.spec.js'],
//Apply Best Practices to externalFixtures and exampleTemplate.e2e.spec.js
files: [
'appActions.js',
'baseFixtures.js',
'pluginFixtures.js',
'**/exampleTemplate.e2e.spec.js'
],
rules: {
'playwright/no-wait-for-timeout': 'off'
'playwright/no-raw-locators': 'error',
'playwright/no-nth-methods': 'error',
'playwright/no-get-by-title': 'error',
'playwright/prefer-comparison-matcher': 'error'
}
}
]
Expand Down
55 changes: 24 additions & 31 deletions e2e/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,13 @@ Current list of test tags:
|:-:|-|
|`@mobile` | Test case or test suite is compatible with Playwright's iPad support and Open MCT's read-only mobile view (i.e. no create button).|
|`@a11y` | Test case or test suite to execute playwright-axe accessibility checks and generate a11y reports.|
|`@gds` | Denotes a GDS Test Case used in the VIPER Mission.|
|`@addInit` | Initializes the browser with an injected and artificial state. Useful for loading non-default plugins. Likely will not work outside of `npm start`.|
|`@localStorage` | Captures or generates session storage to manipulate browser state. Useful for excluding in tests which require a persistent backend (i.e. CouchDB). See [note](#utilizing-localstorage)|
|`@snapshot` | Uses Playwright's snapshot functionality to record a copy of the DOM for direct comparison. Must be run inside of the playwright container.|
|`@unstable` | A new test or test which is known to be flaky.|
|`@2p` | Indicates that multiple users are involved, or multiple tabs/pages are used. Useful for testing multi-user interactivity.|
|`@generatedata` | Indicates that a test is used to generate testdata or test the generated test data. Usually to be associated with localstorage, but this may grow over time.|
|`@clock` | A test which modifies the clock. These have expanded out of the visual tests and into the functional tests.
|`@framework` | A test for open mct e2e capabilities. This is primarily to ensure we don't break projects which depend on sourcing this project's fixtures like appActions.js.

### Continuous Integration

Expand All @@ -248,7 +247,7 @@ Our CI environment consists of 3 main modes of operation:

CircleCI

- Stable e2e tests against ubuntu and chrome
- e2e tests against ubuntu and chrome
- Performance tests against ubuntu and chrome
- e2e tests are linted
- Visual and a11y tests are run in a single resolution on the default `espresso` theme
Expand Down Expand Up @@ -287,18 +286,6 @@ So for every commit, Playwright is effectively running 4 x 2 concurrent browserc

At the same time, we don't want to waste CI resources on parallel runs, so we've configured each shard to fail after 5 test failures. Test failure logs are recorded and stored to allow fast triage.

#### Test Promotion

In order to maintain fast and reliable feedback, tests go through a promotion process. All new test cases or test suites must be labeled with the `@unstable` annotation. The Open MCT dev team runs these unstable tests in our private repos to ensure they work downstream and are reliable.

- To run the stable tests, use the `npm run test:e2e:stable` command.
- To run the new and flaky tests, use the `npm run test:e2e:unstable` command.

A testcase and testsuite are to be unmarked as @unstable when:

1. They run as part of "full" run 5 times without failure.
2. They've been by a Open MCT Developer 5 times in the closed source repo without failure.

### Cross-browser and Cross-operating system

#### **What's supported:**
Expand Down Expand Up @@ -380,8 +367,7 @@ By adhering to this principle, we can create tests that are both robust and refl
1. Avoid creating locator aliases. This likely means that you're compensating for a bad locator. Improve the application instead.
1. Leverage `await page.goto('./', { waitUntil: 'domcontentloaded' });` instead of `{ waitUntil: 'networkidle' }`. Tests run against deployments with websockets often have issues with the networkidle detection.

#### How to make tests faster and more resilient

#### How to make tests faster and more resilient to application changes
1. Avoid app interaction when possible. The best way of doing this is to navigate directly by URL:

```js
Expand All @@ -396,6 +382,16 @@ By adhering to this principle, we can create tests that are both robust and refl
- Initial navigation should _almost_ always use the `{ waitUntil: 'domcontentloaded' }` option.
1. Avoid repeated setup to test a single assertion. Write longer tests with multiple soft assertions.
This ensures that your changes will be picked up with large refactors.
1. Use [user-facing locators](https://playwright.dev/docs/best-practices#use-locators) (Now a eslint rule!)

```js
page.getByRole('button', { name: 'Create' } )
```
Instead of
```js
page.locator('.c-create-button')
```
Note: `page.locator()` can be used in performance tests as xk6-browser does not yet support the new `page.getBy` pattern and css lookups can be [1.5x faster](https://serpapi.com/blog/css-selectors-faster-than-getbyrole-playwright/)
Comment on lines +385 to +394
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion:

  1. Prefer using user-facing locators for better readability and maintainability:
// Recommended
page.getByRole('button', { name: 'Create' })

Instead of the less intuitive:

// Not recommended
page.locator('.c-create-button')

Note: In performance tests, page.locator() may still be used as xk6-browser lacks support for the page.getBy pattern. Additionally, CSS selectors can be up to 1.5x faster than role-based selectors.


##### Utilizing LocalStorage

Expand Down Expand Up @@ -448,6 +444,7 @@ By adhering to this principle, we can create tests that are both robust and refl
- Use Open MCT's fixed-time mode unless explicitly testing realtime clock
- Employ the `createExampleTelemetryObject` appAction to source telemetry and specify a `name` to avoid autogenerated names.
- Avoid creating objects with a time component like timers and clocks.
- Utilize the playwright clock() API. See @clock Annotations for examples.

5. **Hide the Tree and Inspector**: Generally, your test will not require comparisons involving the tree and inspector. These aspects are covered in component-specific tests (explained below). To exclude them from the comparison by default, navigate to the root of the main view with the tree and inspector hidden:
- `await page.goto('./#/browse/mine?hideTree=true&hideInspector=true')`
Expand Down Expand Up @@ -493,29 +490,25 @@ For best practices with regards to mocking network responses, see our [couchdb.e
The following contains a list of tips and tricks which don't exactly fit into a FAQ or Best Practices doc.

- (Advanced) Overriding the Browser's Clock
It is possible to override the browser's clock in order to control time-based elements. Since this can cause unwanted behavior (i.e. Tree not rendering), only use this sparingly. To do this, use the `overrideClock` fixture as such:
It is possible to override the browser's clock in order to control time-based elements. Since this can cause unwanted behavior -- i.e. Tree not rendering -- only use this sparingly. Use the `page.clock()` API as such:

```js
import { test, expect } from '../../pluginFixtures.js';

test.describe('foo test suite', () => {

// All subsequent tests in this suite will override the clock
test.use({
clockOptions: {
now: 1732413600000, // A timestamp given as milliseconds since the epoch
shouldAdvanceTime: true // Should the clock tick?
}
test.describe('foo test suite @clock', () => {
test.beforeEach(async ({ page }) => {
//Set clock time
await page.clock.install({ time: MISSION_TIME });
await page.clock.resume();
//Navigate to page with new clock
await page.goto('./', { waitUntil: 'domcontentloaded' });
});

test('bar test', async ({ page }) => {
// ...
test('bar here', async ({ page }) => {
/// ...
});
});
```

More info and options for `overrideClock` can be found in [baseFixtures.js](baseFixtures.js)

- Working with multiple pages
There are instances where multiple browser pages will needed to verify multi-page or multi-tab application behavior. Make sure to use the `@2p` annotation as well as name each page appropriately: i.e. `page1` and `page2` or `tab1` and `tab2` depending on the intended use case. Generally pages should be used unless testing `sharedWorker` code, specifically.

Expand Down
Loading
Loading