docs: per worker login with auto fixture (#19307)
This commit is contained in:
parent
4784dae10f
commit
405d6267dc
|
|
@ -252,7 +252,7 @@ import { test, expect } from '@playwright/test';
|
||||||
|
|
||||||
// Name of the storage state entry. The entry is saved in the project setup.
|
// Name of the storage state entry. The entry is saved in the project setup.
|
||||||
test.use({
|
test.use({
|
||||||
storageStateName: 'outlook-test-user'
|
storageStateName: 'github-test-user'
|
||||||
})
|
})
|
||||||
|
|
||||||
test('test', async ({ page }) => {
|
test('test', async ({ page }) => {
|
||||||
|
|
@ -265,7 +265,7 @@ const { test } = require('@playwright/test');
|
||||||
|
|
||||||
// Name of the storage state entry. The entry is saved in the project setup.
|
// Name of the storage state entry. The entry is saved in the project setup.
|
||||||
test.use({
|
test.use({
|
||||||
storageStateName: 'outlook-test-user'
|
storageStateName: 'github-test-user'
|
||||||
})
|
})
|
||||||
|
|
||||||
test('test', async ({ page }) => {
|
test('test', async ({ page }) => {
|
||||||
|
|
@ -351,8 +351,8 @@ By default, Playwright Test runs tests in parallel. If you reuse a single signed
|
||||||
In this example we [override `storageState` fixture](./test-fixtures.md#overriding-fixtures) and ensure we only sign in once per worker, using [`property: TestInfo.workerIndex`] to differentiate between workers.
|
In this example we [override `storageState` fixture](./test-fixtures.md#overriding-fixtures) and ensure we only sign in once per worker, using [`property: TestInfo.workerIndex`] to differentiate between workers.
|
||||||
|
|
||||||
```js tab=js-js
|
```js tab=js-js
|
||||||
// signin-all-users.setup.js
|
// login-fixture.js
|
||||||
const { setup, storage } = require('@playwright/test');
|
const { test: base, storage } = require('@playwright/test');
|
||||||
|
|
||||||
const users = [
|
const users = [
|
||||||
{ username: 'user-1', password: 'password-1' },
|
{ username: 'user-1', password: 'password-1' },
|
||||||
|
|
@ -360,30 +360,35 @@ const users = [
|
||||||
// ... put your test users here ...
|
// ... put your test users here ...
|
||||||
];
|
];
|
||||||
|
|
||||||
// Run all logins in parallel.
|
exports.test = base.extend({
|
||||||
setup.describe.configure({
|
// Sign in corresponding user during test worker startup and save the state
|
||||||
mode: 'parallel'
|
// to storage.
|
||||||
});
|
login: [async ({ browser }, use) => {
|
||||||
|
const page = await browser.newPage();
|
||||||
// Sign in all test users duing project setup and save their state
|
|
||||||
// to be used in the tests.
|
|
||||||
for (let i = 0; i < users.length; i++) {
|
|
||||||
setup(`login user ${i}`, async ({ page }) => {
|
|
||||||
await page.goto('https://github.com/login');
|
await page.goto('https://github.com/login');
|
||||||
await page.getByLabel('User Name').fill(users[i].username);
|
// Use a unique credentials for each worker.
|
||||||
await page.getByLabel('Password').fill(users[i].password);
|
const index = test.info().parallelIndex;
|
||||||
|
await page.getByLabel('User Name').fill(users[index].username);
|
||||||
|
await page.getByLabel('Password').fill(users[index].password);
|
||||||
await page.getByText('Sign in').click();
|
await page.getByText('Sign in').click();
|
||||||
|
|
||||||
const contextState = await page.context().storageState();
|
const contextState = await page.context().storageState();
|
||||||
await storage.set(`test-user-${i}`, contextState);
|
// Store with worker-specific key.
|
||||||
});
|
await storage.set(`test-user-${index}`, contextState);
|
||||||
}
|
|
||||||
|
await page.close();
|
||||||
|
await use();
|
||||||
|
}, { auto: true }],
|
||||||
|
});
|
||||||
|
|
||||||
|
exports.expect = base.expect;
|
||||||
|
exporta.storage = base.storage;
|
||||||
|
|
||||||
// example.spec.js
|
// example.spec.js
|
||||||
const { test } = require('@playwright/test');
|
const { test, expect } = require('./login-fixture');
|
||||||
|
|
||||||
test.use({
|
test.use({
|
||||||
// User different user for each worker.
|
// User worker specific user.
|
||||||
storageStateName: ({}, use) => use(`test-user-${test.info().parallelIndex}`)
|
storageStateName: ({}, use) => use(`test-user-${test.info().parallelIndex}`)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -393,8 +398,8 @@ test('test', async ({ page }) => {
|
||||||
```
|
```
|
||||||
|
|
||||||
```js tab=js-ts
|
```js tab=js-ts
|
||||||
// signin-all-users.setup.ts
|
// login-fixture.ts
|
||||||
import { setup, storage } from '@playwright/test';
|
import { test as base, storage } from '@playwright/test';
|
||||||
|
|
||||||
const users = [
|
const users = [
|
||||||
{ username: 'user-1', password: 'password-1' },
|
{ username: 'user-1', password: 'password-1' },
|
||||||
|
|
@ -402,31 +407,33 @@ const users = [
|
||||||
// ... put your test users here ...
|
// ... put your test users here ...
|
||||||
];
|
];
|
||||||
|
|
||||||
// Run all logins in parallel.
|
export const test = base.extend<{ login: void }>({
|
||||||
setup.describe.configure({
|
// Sign in corresponding user during test worker startup and save the state
|
||||||
mode: 'parallel'
|
// to storage.
|
||||||
});
|
login: [async ({ browser }, use) => {
|
||||||
|
const page = await browser.newPage();
|
||||||
// Sign in all test users duing project setup and save their state
|
|
||||||
// to be used in the tests.
|
|
||||||
for (let i = 0; i < users.length; i++) {
|
|
||||||
setup(`login user ${i}`, async ({ page }) => {
|
|
||||||
await page.goto('https://github.com/login');
|
await page.goto('https://github.com/login');
|
||||||
// Use a unique username for each worker.
|
// Use a unique credentials for each worker.
|
||||||
await page.getByLabel('User Name').fill(users[i].username);
|
const index = test.info().parallelIndex;
|
||||||
await page.getByLabel('Password').fill(users[i].password);
|
await page.getByLabel('User Name').fill(users[index].username);
|
||||||
|
await page.getByLabel('Password').fill(users[index].password);
|
||||||
await page.getByText('Sign in').click();
|
await page.getByText('Sign in').click();
|
||||||
|
|
||||||
const contextState = await page.context().storageState();
|
const contextState = await page.context().storageState();
|
||||||
await storage.set(`test-user-${i}`, contextState);
|
// Store with worker-specific key.
|
||||||
});
|
await storage.set(`test-user-${index}`, contextState);
|
||||||
}
|
|
||||||
|
await page.close();
|
||||||
|
await use();
|
||||||
|
}, { auto: true }],
|
||||||
|
});
|
||||||
|
export { expect } from '@playwright/test';
|
||||||
|
|
||||||
// example.spec.ts
|
// example.spec.ts
|
||||||
import { test } from '@playwright/test';
|
import { test } from './login-fixture';
|
||||||
|
|
||||||
test.use({
|
test.use({
|
||||||
// User different user for each worker.
|
// User worker specific user.
|
||||||
storageStateName: ({}, use) => use(`test-user-${test.info().parallelIndex}`)
|
storageStateName: ({}, use) => use(`test-user-${test.info().parallelIndex}`)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue