chore: fix typos (#30645)
This commit is contained in:
parent
cf3ff6531a
commit
150cbcbdf3
|
|
@ -910,10 +910,10 @@ await expect(
|
||||||
assertThat(page.getByText("Welcome")).isVisible();
|
assertThat(page.getByText("Welcome")).isVisible();
|
||||||
|
|
||||||
// At least one item in the list is visible.
|
// At least one item in the list is visible.
|
||||||
asserThat(page.getByTestId("todo-item").first()).isVisible();
|
assertThat(page.getByTestId("todo-item").first()).isVisible();
|
||||||
|
|
||||||
// At least one of the two elements is visible, possibly both.
|
// At least one of the two elements is visible, possibly both.
|
||||||
asserThat(
|
assertThat(
|
||||||
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
|
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
|
||||||
.or(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign up")))
|
.or(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign up")))
|
||||||
.first()
|
.first()
|
||||||
|
|
|
||||||
|
|
@ -571,7 +571,7 @@ Whether to emulate network being offline. Defaults to `false`. Learn more about
|
||||||
- `username` <[string]>
|
- `username` <[string]>
|
||||||
- `password` <[string]>
|
- `password` <[string]>
|
||||||
- `origin` ?<[string]> Restrain sending http credentials on specific origin (scheme://host:port).
|
- `origin` ?<[string]> Restrain sending http credentials on specific origin (scheme://host:port).
|
||||||
- `sendImmediately` ?<[boolean]> Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent from the browser.
|
- `sendImmediately` ?<[boolean]> Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent from the browser.
|
||||||
|
|
||||||
Credentials for [HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication).
|
Credentials for [HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication).
|
||||||
If no origin is specified, the username and password are sent to any servers upon unauthorized responses.
|
If no origin is specified, the username and password are sent to any servers upon unauthorized responses.
|
||||||
|
|
@ -751,7 +751,7 @@ Whether to allow sites to register Service workers. Defaults to `'allow'`.
|
||||||
* since: v1.41
|
* since: v1.41
|
||||||
- `behavior` <[UnrouteBehavior]<"wait"|"ignoreErrors"|"default">>
|
- `behavior` <[UnrouteBehavior]<"wait"|"ignoreErrors"|"default">>
|
||||||
|
|
||||||
Specifies wether to wait for already running handlers and what to do if they throw errors:
|
Specifies whether to wait for already running handlers and what to do if they throw errors:
|
||||||
* `'default'` - do not wait for current handler calls (if any) to finish, if unrouted handler throws, it may result in unhandled error
|
* `'default'` - do not wait for current handler calls (if any) to finish, if unrouted handler throws, it may result in unhandled error
|
||||||
* `'wait'` - wait for current handler calls (if any) to finish
|
* `'wait'` - wait for current handler calls (if any) to finish
|
||||||
* `'ignoreErrors'` - do not wait for current handler calls (if any) to finish, all errors thrown by the handlers after unrouting are silently caught
|
* `'ignoreErrors'` - do not wait for current handler calls (if any) to finish, all errors thrown by the handlers after unrouting are silently caught
|
||||||
|
|
|
||||||
|
|
@ -371,7 +371,7 @@ pwsh bin/Debug/netX/playwright.ps1 codegen github.com/microsoft/playwright --sav
|
||||||
|
|
||||||
After performing authentication and closing the browser, `auth.json` will contain the storage state which you can then reuse in your tests.
|
After performing authentication and closing the browser, `auth.json` will contain the storage state which you can then reuse in your tests.
|
||||||
|
|
||||||
<img width="1394" alt="login to Github screen" src="https://user-images.githubusercontent.com/13063165/220561688-04b2b984-4ba6-4446-8b0a-8058876e2a02.png" />
|
<img width="1394" alt="login to GitHub screen" src="https://user-images.githubusercontent.com/13063165/220561688-04b2b984-4ba6-4446-8b0a-8058876e2a02.png" />
|
||||||
|
|
||||||
Make sure you only use the `auth.json` locally as it contains sensitive information. Add it to your `.gitignore` or delete it once you have finished generating your tests.
|
Make sure you only use the `auth.json` locally as it contains sensitive information. Add it to your `.gitignore` or delete it once you have finished generating your tests.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,7 @@ test('my test', async ({ page }) => {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively, you can delcare a hook **with a title**.
|
Alternatively, you can declare a hook **with a title**.
|
||||||
|
|
||||||
```js title="example.spec.ts"
|
```js title="example.spec.ts"
|
||||||
test.afterEach('Status check', async ({ page }) => {
|
test.afterEach('Status check', async ({ page }) => {
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,8 @@ Complete set of Playwright Test options is available in the [configuration file]
|
||||||
| `--debug`| Run tests with Playwright Inspector. Shortcut for `PWDEBUG=1` environment variable and `--timeout=0 --max-failures=1 --headed --workers=1` options.|
|
| `--debug`| Run tests with Playwright Inspector. Shortcut for `PWDEBUG=1` environment variable and `--timeout=0 --max-failures=1 --headed --workers=1` options.|
|
||||||
| `--forbid-only` | Whether to disallow `test.only`. Useful on CI.|
|
| `--forbid-only` | Whether to disallow `test.only`. Useful on CI.|
|
||||||
| `--global-timeout <number>` | Total timeout for the whole test run in milliseconds. By default, there is no global timeout. Learn more about [various timeouts](./test-timeouts.md).|
|
| `--global-timeout <number>` | Total timeout for the whole test run in milliseconds. By default, there is no global timeout. Learn more about [various timeouts](./test-timeouts.md).|
|
||||||
| `-g <grep>` or `--grep <grep>` | Only run tests matching this regular expression. For example, this will run `'should add to cart'` when passed `-g "add to cart"`. The regular expression will be tested against the string that consists of the test file name, `test.describe` titles if any, test title and all test tags, separated by spaces, e.g. `my-test.spec.ts my-suite my-test @smoke`. The filter does not apply to the tests from dependcy projects, i.e. Playwright will still run all tests from [project dependencies](./test-projects.md#dependencies). |
|
| `-g <grep>` or `--grep <grep>` | Only run tests matching this regular expression. For example, this will run `'should add to cart'` when passed `-g "add to cart"`. The regular expression will be tested against the string that consists of the test file name, `test.describe` titles if any, test title and all test tags, separated by spaces, e.g. `my-test.spec.ts my-suite my-test @smoke`. The filter does not apply to the tests from dependency projects, i.e. Playwright will still run all tests from [project dependencies](./test-projects.md#dependencies). |
|
||||||
| `--grep-invert <grep>` | Only run tests **not** matching this regular expression. The opposite of `--grep`. The filter does not apply to the tests from dependcy projects, i.e. Playwright will still run all tests from [project dependencies](./test-projects.md#dependencies).|
|
| `--grep-invert <grep>` | Only run tests **not** matching this regular expression. The opposite of `--grep`. The filter does not apply to the tests from dependency projects, i.e. Playwright will still run all tests from [project dependencies](./test-projects.md#dependencies).|
|
||||||
| `--headed` | Run tests in headed browsers. Useful for debugging. |
|
| `--headed` | Run tests in headed browsers. Useful for debugging. |
|
||||||
| `--ignore-snapshots` | Whether to ignore [snapshots](./test-snapshots.md). Use this when snapshot expectations are known to be different, e.g. running tests on Linux against Windows screenshots. |
|
| `--ignore-snapshots` | Whether to ignore [snapshots](./test-snapshots.md). Use this when snapshot expectations are known to be different, e.g. running tests on Linux against Windows screenshots. |
|
||||||
| `--last-failed` | Only re-run the failures.|
|
| `--last-failed` | Only re-run the failures.|
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ export const test = baseTest.extend<{}, { dbUserName: string }>({
|
||||||
dbUserName: [async ({ }, use) => {
|
dbUserName: [async ({ }, use) => {
|
||||||
// Use workerIndex as a unique identifier for each worker.
|
// Use workerIndex as a unique identifier for each worker.
|
||||||
const userName = `user-${test.info().workerIndex}`;
|
const userName = `user-${test.info().workerIndex}`;
|
||||||
// Inialize user in the database.
|
// Initialize user in the database.
|
||||||
await createUserInTestDatabase(userName);
|
await createUserInTestDatabase(userName);
|
||||||
await use(userName);
|
await use(userName);
|
||||||
// Clean up after the tests are done.
|
// Clean up after the tests are done.
|
||||||
|
|
|
||||||
|
|
@ -686,7 +686,7 @@ class FrameSession {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (reason === 'swap') {
|
if (reason === 'swap') {
|
||||||
// This is a local -> remote frame transtion, where
|
// This is a local -> remote frame transition, where
|
||||||
// Page.frameDetached arrives before Target.attachedToTarget.
|
// Page.frameDetached arrives before Target.attachedToTarget.
|
||||||
// We should keep the frame in the tree, and it will be used for the new target.
|
// We should keep the frame in the tree, and it will be used for the new target.
|
||||||
const frame = this._page._frameManager.frame(frameId);
|
const frame = this._page._frameManager.frame(frameId);
|
||||||
|
|
|
||||||
|
|
@ -349,7 +349,7 @@ export class DispatcherConnection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
response.error = serializeError(e);
|
response.error = serializeError(e);
|
||||||
// The command handler could have set error in the metada, do not reset it if there was no exception.
|
// The command handler could have set error in the metadata, do not reset it if there was no exception.
|
||||||
callMetadata.error = response.error;
|
callMetadata.error = response.error;
|
||||||
} finally {
|
} finally {
|
||||||
callMetadata.endTime = monotonicTime();
|
callMetadata.endTime = monotonicTime();
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ export class JSHandleDispatcher extends Dispatcher<js.JSHandle, channels.JSHandl
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic channel parser converts guids to JSHandleDispatchers,
|
// Generic channel parser converts guids to JSHandleDispatchers,
|
||||||
// and this function takes care of coverting them into underlying JSHandles.
|
// and this function takes care of converting them into underlying JSHandles.
|
||||||
export function parseArgument(arg: channels.SerializedArgument): any {
|
export function parseArgument(arg: channels.SerializedArgument): any {
|
||||||
return parseSerializedValue(arg.value, arg.handles.map(a => (a as JSHandleDispatcher)._object));
|
return parseSerializedValue(arg.value, arg.handles.map(a => (a as JSHandleDispatcher)._object));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ export type NavigationEvent = {
|
||||||
// Error for cross-document navigations if any. When error is present,
|
// Error for cross-document navigations if any. When error is present,
|
||||||
// the navigation did not commit.
|
// the navigation did not commit.
|
||||||
error?: Error,
|
error?: Error,
|
||||||
// Wether this event should be visible to the clients via the public APIs.
|
// Whether this event should be visible to the clients via the public APIs.
|
||||||
isPublic?: boolean;
|
isPublic?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@ export class HarTracer {
|
||||||
});
|
});
|
||||||
this._addBarrier(page || request.serviceWorker(), promise);
|
this._addBarrier(page || request.serviceWorker(), promise);
|
||||||
|
|
||||||
// Respose end timing is only available after the response event was received.
|
// Response end timing is only available after the response event was received.
|
||||||
const timing = response.timing();
|
const timing = response.timing();
|
||||||
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
|
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
|
||||||
this._computeHarEntryTotalTime(harEntry);
|
this._computeHarEntryTotalTime(harEntry);
|
||||||
|
|
|
||||||
|
|
@ -625,7 +625,7 @@ function getTextAlternativeInternal(element: Element, options: AccessibleNameOpt
|
||||||
if (trimFlatString(title))
|
if (trimFlatString(title))
|
||||||
return title;
|
return title;
|
||||||
// SPEC DIFFERENCE.
|
// SPEC DIFFERENCE.
|
||||||
// Spec says return localized "Submit Query", but browsers and axe-core insist on "Sumbit".
|
// Spec says return localized "Submit Query", but browsers and axe-core insist on "Submit".
|
||||||
return 'Submit';
|
return 'Submit';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -282,7 +282,7 @@ function buildLayoutClosure(layout: keyboardLayout.KeyboardLayout): Map<string,
|
||||||
shiftedDescription.keyCode = definition.shiftKeyCode;
|
shiftedDescription.keyCode = definition.shiftKeyCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map from code: Digit3 -> { ... descrption, shifted }
|
// Map from code: Digit3 -> { ... description, shifted }
|
||||||
result.set(code, { ...description, shifted: shiftedDescription });
|
result.set(code, { ...description, shifted: shiftedDescription });
|
||||||
|
|
||||||
// Map from aliases: Shift -> non-shiftable definition
|
// Map from aliases: Shift -> non-shiftable definition
|
||||||
|
|
|
||||||
16
packages/playwright-core/types/types.d.ts
vendored
16
packages/playwright-core/types/types.d.ts
vendored
|
|
@ -4390,7 +4390,7 @@ export interface Page {
|
||||||
*/
|
*/
|
||||||
unrouteAll(options?: {
|
unrouteAll(options?: {
|
||||||
/**
|
/**
|
||||||
* Specifies wether to wait for already running handlers and what to do if they throw errors:
|
* Specifies whether to wait for already running handlers and what to do if they throw errors:
|
||||||
* - `'default'` - do not wait for current handler calls (if any) to finish, if unrouted handler throws, it may
|
* - `'default'` - do not wait for current handler calls (if any) to finish, if unrouted handler throws, it may
|
||||||
* result in unhandled error
|
* result in unhandled error
|
||||||
* - `'wait'` - wait for current handler calls (if any) to finish
|
* - `'wait'` - wait for current handler calls (if any) to finish
|
||||||
|
|
@ -8827,7 +8827,7 @@ export interface BrowserContext {
|
||||||
*/
|
*/
|
||||||
unrouteAll(options?: {
|
unrouteAll(options?: {
|
||||||
/**
|
/**
|
||||||
* Specifies wether to wait for already running handlers and what to do if they throw errors:
|
* Specifies whether to wait for already running handlers and what to do if they throw errors:
|
||||||
* - `'default'` - do not wait for current handler calls (if any) to finish, if unrouted handler throws, it may
|
* - `'default'` - do not wait for current handler calls (if any) to finish, if unrouted handler throws, it may
|
||||||
* result in unhandled error
|
* result in unhandled error
|
||||||
* - `'wait'` - wait for current handler calls (if any) to finish
|
* - `'wait'` - wait for current handler calls (if any) to finish
|
||||||
|
|
@ -13378,7 +13378,7 @@ export interface BrowserType<Unused = {}> {
|
||||||
origin?: string;
|
origin?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when
|
* Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when
|
||||||
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
||||||
* from the browser.
|
* from the browser.
|
||||||
*/
|
*/
|
||||||
|
|
@ -14901,7 +14901,7 @@ export interface AndroidDevice {
|
||||||
origin?: string;
|
origin?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when
|
* Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when
|
||||||
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
||||||
* from the browser.
|
* from the browser.
|
||||||
*/
|
*/
|
||||||
|
|
@ -15632,7 +15632,7 @@ export interface APIRequest {
|
||||||
origin?: string;
|
origin?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when
|
* Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when
|
||||||
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
||||||
* from the browser.
|
* from the browser.
|
||||||
*/
|
*/
|
||||||
|
|
@ -16783,7 +16783,7 @@ export interface Browser extends EventEmitter {
|
||||||
origin?: string;
|
origin?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when
|
* Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when
|
||||||
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
||||||
* from the browser.
|
* from the browser.
|
||||||
*/
|
*/
|
||||||
|
|
@ -17677,7 +17677,7 @@ export interface Electron {
|
||||||
origin?: string;
|
origin?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when
|
* Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when
|
||||||
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
||||||
* from the browser.
|
* from the browser.
|
||||||
*/
|
*/
|
||||||
|
|
@ -20344,7 +20344,7 @@ export interface HTTPCredentials {
|
||||||
origin?: string;
|
origin?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to send `Authorization` header with the first API request. By deafult, the credentials are sent only when
|
* Whether to send `Authorization` header with the first API request. By default, the credentials are sent only when
|
||||||
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
* 401 (Unauthorized) response with `WWW-Authenticate` header is received. This option does not affect requests sent
|
||||||
* from the browser.
|
* from the browser.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ export async function incorporateCompilationCache() {
|
||||||
if (!loaderChannel)
|
if (!loaderChannel)
|
||||||
return;
|
return;
|
||||||
// This is needed to gather dependency information from the esm loader
|
// This is needed to gather dependency information from the esm loader
|
||||||
// that is populated from the resovle hook. We do not need to push
|
// that is populated from the resolve hook. We do not need to push
|
||||||
// this information proactively during load, but gather it at the end.
|
// this information proactively during load, but gather it at the end.
|
||||||
const result = await loaderChannel.send('getCompilationCache', {});
|
const result = await loaderChannel.send('getCompilationCache', {});
|
||||||
addToCompilationCache(result.cache);
|
addToCompilationCache(result.cache);
|
||||||
|
|
|
||||||
|
|
@ -235,7 +235,7 @@ export function fixtureParameterNames(fn: Function | any, location: Location, on
|
||||||
return fn[signatureSymbol];
|
return fn[signatureSymbol];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function inheritFixutreNames(from: Function, to: Function) {
|
export function inheritFixtureNames(from: Function, to: Function) {
|
||||||
(to as any)[signatureSymbol] = (from as any)[signatureSymbol];
|
(to as any)[signatureSymbol] = (from as any)[signatureSymbol];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ class SnapshotHelper {
|
||||||
++snapshotNames.anonymousSnapshotIndex,
|
++snapshotNames.anonymousSnapshotIndex,
|
||||||
].join(' ');
|
].join(' ');
|
||||||
inputPathSegments = [sanitizeForFilePath(trimLongString(fullTitleWithoutSpec)) + '.' + anonymousSnapshotExtension];
|
inputPathSegments = [sanitizeForFilePath(trimLongString(fullTitleWithoutSpec)) + '.' + anonymousSnapshotExtension];
|
||||||
// Trim the output file paths more aggresively to avoid hitting Windows filesystem limits.
|
// Trim the output file paths more aggressively to avoid hitting Windows filesystem limits.
|
||||||
this.outputBaseName = sanitizeForFilePath(trimLongString(fullTitleWithoutSpec, windowsFilesystemFriendlyLength)) + '.' + anonymousSnapshotExtension;
|
this.outputBaseName = sanitizeForFilePath(trimLongString(fullTitleWithoutSpec, windowsFilesystemFriendlyLength)) + '.' + anonymousSnapshotExtension;
|
||||||
} else {
|
} else {
|
||||||
// We intentionally do not sanitize user-provided array of segments, but for backwards
|
// We intentionally do not sanitize user-provided array of segments, but for backwards
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,7 @@ async function extractAndParseReports(dir: string, shardFiles: string[], interna
|
||||||
fileName = reportNames.makeUnique(fileName);
|
fileName = reportNames.makeUnique(fileName);
|
||||||
let parsedEvents = parseCommonEvents(content);
|
let parsedEvents = parseCommonEvents(content);
|
||||||
// Passing reviver to JSON.parse doesn't work, as the original strings
|
// Passing reviver to JSON.parse doesn't work, as the original strings
|
||||||
// keep beeing used. To work around that we traverse the parsed events
|
// keep being used. To work around that we traverse the parsed events
|
||||||
// as a post-processing step.
|
// as a post-processing step.
|
||||||
internalizer.traverse(parsedEvents);
|
internalizer.traverse(parsedEvents);
|
||||||
const metadata = findMetadata(parsedEvents, file);
|
const metadata = findMetadata(parsedEvents, file);
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ class Fixture {
|
||||||
this.failed = true;
|
this.failed = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Fixture teardown is root => leafs, when we need to teardown a fixture,
|
// Fixture teardown is root => leaves, when we need to teardown a fixture,
|
||||||
// it recursively tears down its usages first.
|
// it recursively tears down its usages first.
|
||||||
dep._usages.add(this);
|
dep._usages.add(this);
|
||||||
// Don't forget to decrement all usages when fixture goes.
|
// Don't forget to decrement all usages when fixture goes.
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ import { applyRepeatEachIndex, bindFileSuiteToProject, filterTestsRemoveEmptySui
|
||||||
import { PoolBuilder } from '../common/poolBuilder';
|
import { PoolBuilder } from '../common/poolBuilder';
|
||||||
import type { TestInfoError } from '../../types/test';
|
import type { TestInfoError } from '../../types/test';
|
||||||
import type { Location } from '../../types/testReporter';
|
import type { Location } from '../../types/testReporter';
|
||||||
import { inheritFixutreNames } from '../common/fixtures';
|
import { inheritFixtureNames } from '../common/fixtures';
|
||||||
import { type TimeSlot, TimeoutManagerError } from './timeoutManager';
|
import { type TimeSlot, TimeoutManagerError } from './timeoutManager';
|
||||||
|
|
||||||
export class WorkerMain extends ProcessRunner {
|
export class WorkerMain extends ProcessRunner {
|
||||||
|
|
@ -490,7 +490,7 @@ export class WorkerMain extends ProcessRunner {
|
||||||
const result = await modifier.fn(fixtures);
|
const result = await modifier.fn(fixtures);
|
||||||
testInfo[modifier.type](!!result, modifier.description);
|
testInfo[modifier.type](!!result, modifier.description);
|
||||||
};
|
};
|
||||||
inheritFixutreNames(modifier.fn, fn);
|
inheritFixtureNames(modifier.fn, fn);
|
||||||
runnables.push({
|
runnables.push({
|
||||||
title: `${modifier.type} modifier`,
|
title: `${modifier.type} modifier`,
|
||||||
location: modifier.location,
|
location: modifier.location,
|
||||||
|
|
|
||||||
4
packages/playwright/types/test.d.ts
vendored
4
packages/playwright/types/test.d.ts
vendored
|
|
@ -4233,7 +4233,7 @@ export interface TestType<TestArgs extends KeyValue, WorkerArgs extends KeyValue
|
||||||
* });
|
* });
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* Alternatively, you can delcare a hook **with a title**.
|
* Alternatively, you can declare a hook **with a title**.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* // example.spec.ts
|
* // example.spec.ts
|
||||||
|
|
@ -4283,7 +4283,7 @@ export interface TestType<TestArgs extends KeyValue, WorkerArgs extends KeyValue
|
||||||
* });
|
* });
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* Alternatively, you can delcare a hook **with a title**.
|
* Alternatively, you can declare a hook **with a title**.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* // example.spec.ts
|
* // example.spec.ts
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ test('emit an submit event when the button is clicked', async ({ mount }) => {
|
||||||
expect(messages).toEqual(['hello']);
|
expect(messages).toEqual(['hello']);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('emit a falltrough event when the button is double clicked', async ({ mount }) => {
|
test('emit a fallthrough event when the button is double clicked', async ({ mount }) => {
|
||||||
const messages: string[] = [];
|
const messages: string[] = [];
|
||||||
const component = await mount(Button, {
|
const component = await mount(Button, {
|
||||||
props: {
|
props: {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ test('emit an submit event when the button is clicked', async ({ mount }) => {
|
||||||
expect(messages).toEqual(['hello']);
|
expect(messages).toEqual(['hello']);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('emit a falltrough event when the button is double clicked', async ({ mount }) => {
|
test('emit a fallthrough event when the button is double clicked', async ({ mount }) => {
|
||||||
const messages: string[] = [];
|
const messages: string[] = [];
|
||||||
const component = await mount(
|
const component = await mount(
|
||||||
<Button
|
<Button
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ test('emit a submit event when the button is clicked', async ({ mount }) => {
|
||||||
expect(messages).toEqual(['hello']);
|
expect(messages).toEqual(['hello']);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('emit a falltrough event when the button is double clicked', async ({ mount }) => {
|
test('emit a fallthrough event when the button is double clicked', async ({ mount }) => {
|
||||||
const messages = [];
|
const messages = [];
|
||||||
const component = await mount(Button, {
|
const component = await mount(Button, {
|
||||||
props: {
|
props: {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ test('emit a submit event when the button is clicked', async ({ mount }) => {
|
||||||
expect(messages).toEqual(['hello']);
|
expect(messages).toEqual(['hello']);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('emit a falltrough event when the button is double clicked', async ({ mount }) => {
|
test('emit a fallthrough event when the button is double clicked', async ({ mount }) => {
|
||||||
const messages: string[] = [];
|
const messages: string[] = [];
|
||||||
const component = await mount(Button, {
|
const component = await mount(Button, {
|
||||||
props: {
|
props: {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ test('emit a submit event when the button is clicked', async ({ mount }) => {
|
||||||
expect(messages).toEqual(['hello']);
|
expect(messages).toEqual(['hello']);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('emit a falltrough event when the button is double clicked', async ({ mount }) => {
|
test('emit a fallthrough event when the button is double clicked', async ({ mount }) => {
|
||||||
const messages: string[] = [];
|
const messages: string[] = [];
|
||||||
const component = await mount(
|
const component = await mount(
|
||||||
<Button
|
<Button
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ import ws from 'ws';
|
||||||
import zlib, { gzip } from 'zlib';
|
import zlib, { gzip } from 'zlib';
|
||||||
import { createHttpServer, createHttpsServer } from '../../../packages/playwright-core/lib/utils/network';
|
import { createHttpServer, createHttpsServer } from '../../../packages/playwright-core/lib/utils/network';
|
||||||
|
|
||||||
const fulfillSymbol = Symbol('fullfil callback');
|
const fulfillSymbol = Symbol('fulfil callback');
|
||||||
const rejectSymbol = Symbol('reject callback');
|
const rejectSymbol = Symbol('reject callback');
|
||||||
|
|
||||||
const gzipAsync = util.promisify(gzip.bind(zlib));
|
const gzipAsync = util.promisify(gzip.bind(zlib));
|
||||||
|
|
@ -288,8 +288,8 @@ export class TestServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
waitForWebSocketConnectionRequest() {
|
waitForWebSocketConnectionRequest() {
|
||||||
return new Promise<http.IncomingMessage & { headers: http.IncomingHttpHeaders }>(fullfil => {
|
return new Promise<http.IncomingMessage & { headers: http.IncomingHttpHeaders }>(fulfil => {
|
||||||
this._wsServer.once('connection', (ws, req) => fullfil(req));
|
this._wsServer.once('connection', (ws, req) => fulfil(req));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ const fs = require('fs');
|
||||||
recordVideo: { dir: __dirname, size: {width: 320, height: 240} },
|
recordVideo: { dir: __dirname, size: {width: 320, height: 240} },
|
||||||
});
|
});
|
||||||
await context.newPage();
|
await context.newPage();
|
||||||
// Wait fo 1 second to actually record something.
|
// Wait for 1 second to actually record something.
|
||||||
await new Promise(x => setTimeout(x, 1000));
|
await new Promise(x => setTimeout(x, 1000));
|
||||||
await context.close();
|
await context.close();
|
||||||
await browser.close();
|
await browser.close();
|
||||||
|
|
|
||||||
|
|
@ -363,7 +363,7 @@ it('should detect overlay from another shadow root', async ({ page, server }) =>
|
||||||
expect(error.message).toContain(`<div id="container2"></div> intercepts pointer events`);
|
expect(error.message).toContain(`<div id="container2"></div> intercepts pointer events`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should detect overlayed element in a transformed iframe', async ({ page }) => {
|
it('should detect overlaid element in a transformed iframe', async ({ page }) => {
|
||||||
await page.setContent(`
|
await page.setContent(`
|
||||||
<style>
|
<style>
|
||||||
body, html, iframe { margin: 0; padding: 0; border: none; }
|
body, html, iframe { margin: 0; padding: 0; border: none; }
|
||||||
|
|
|
||||||
|
|
@ -462,7 +462,7 @@ await page1.GotoAsync("about:blank?foo");`);
|
||||||
expect(models.active).toBe('#checkbox');
|
expect(models.active).toBe('#checkbox');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should check input with chaning id', async ({ page, openRecorder }) => {
|
test('should check input with chaining id', async ({ page, openRecorder }) => {
|
||||||
const recorder = await openRecorder();
|
const recorder = await openRecorder();
|
||||||
await recorder.setContentAndWait(`<input id="checkbox" type="checkbox" name="accept" onchange="checkbox.name = 'updated'"></input>`);
|
await recorder.setContentAndWait(`<input id="checkbox" type="checkbox" name="accept" onchange="checkbox.name = 'updated'"></input>`);
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
|
|
||||||
|
|
@ -218,7 +218,7 @@ it('should support locator.or', async ({ page }) => {
|
||||||
await expect(page.locator('div').or(page.locator('span'))).toHaveCount(2);
|
await expect(page.locator('div').or(page.locator('span'))).toHaveCount(2);
|
||||||
await expect(page.locator('div').or(page.locator('span'))).toHaveText(['hello', 'world']);
|
await expect(page.locator('div').or(page.locator('span'))).toHaveText(['hello', 'world']);
|
||||||
await expect(page.locator('span').or(page.locator('article')).or(page.locator('div'))).toHaveText(['hello', 'world']);
|
await expect(page.locator('span').or(page.locator('article')).or(page.locator('div'))).toHaveText(['hello', 'world']);
|
||||||
await expect(page.locator('article').or(page.locator('someting'))).toHaveCount(0);
|
await expect(page.locator('article').or(page.locator('something'))).toHaveCount(0);
|
||||||
await expect(page.locator('article').or(page.locator('div'))).toHaveText('hello');
|
await expect(page.locator('article').or(page.locator('div'))).toHaveText('hello');
|
||||||
await expect(page.locator('article').or(page.locator('span'))).toHaveText('world');
|
await expect(page.locator('article').or(page.locator('span'))).toHaveText('world');
|
||||||
await expect(page.locator('div').or(page.locator('article'))).toHaveText('hello');
|
await expect(page.locator('div').or(page.locator('article'))).toHaveText('hello');
|
||||||
|
|
|
||||||
|
|
@ -981,7 +981,7 @@ it('should click in a transformed iframe', async ({ page }) => {
|
||||||
expect(await page.evaluate('window._clicked')).toBe(true);
|
expect(await page.evaluate('window._clicked')).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should click a button that is overlayed by a permission popup', async ({ page, server }) => {
|
it('should click a button that is overlaid by a permission popup', async ({ page, server }) => {
|
||||||
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/23280' });
|
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/23280' });
|
||||||
await page.setViewportSize({ width: 500, height: 500 });
|
await page.setViewportSize({ width: 500, height: 500 });
|
||||||
await page.goto(server.EMPTY_PAGE);
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ it('should traverse only form elements', async function({ page, browserName, pla
|
||||||
|
|
||||||
await page.setContent(`
|
await page.setContent(`
|
||||||
<input id="input-1">
|
<input id="input-1">
|
||||||
<button id="button">buttton</button>
|
<button id="button">button</button>
|
||||||
<a href id="link">link</a>
|
<a href id="link">link</a>
|
||||||
<input id="input-2">
|
<input id="input-2">
|
||||||
`);
|
`);
|
||||||
|
|
|
||||||
|
|
@ -596,7 +596,7 @@ it('should not fulfill with redirect status', async ({ page, server, browserName
|
||||||
'location': '/empty.html',
|
'location': '/empty.html',
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
reject('fullfill didn\'t throw');
|
reject('fulfill didn\'t throw');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
fulfill(e);
|
fulfill(e);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ test('should clear cache with type:module', async ({ runCLICommand }) => {
|
||||||
import { defineConfig } from '@playwright/test';
|
import { defineConfig } from '@playwright/test';
|
||||||
export default defineConfig({});
|
export default defineConfig({});
|
||||||
`,
|
`,
|
||||||
'pacakge.json': `
|
'package.json': `
|
||||||
{ "type": "module" }
|
{ "type": "module" }
|
||||||
`,
|
`,
|
||||||
'a.spec.ts': `
|
'a.spec.ts': `
|
||||||
|
|
|
||||||
|
|
@ -881,7 +881,7 @@ test('should chain expect matchers and expose matcher utils', async ({ runInline
|
||||||
expect(result.exitCode).toBe(1);
|
expect(result.exitCode).toBe(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should suppport toHaveAttribute without optional value', async ({ runTSC }) => {
|
test('should support toHaveAttribute without optional value', async ({ runTSC }) => {
|
||||||
const result = await runTSC({
|
const result = await runTSC({
|
||||||
'a.spec.ts': `
|
'a.spec.ts': `
|
||||||
import { test, expect as baseExpect } from '@playwright/test';
|
import { test, expect as baseExpect } from '@playwright/test';
|
||||||
|
|
@ -925,7 +925,7 @@ test('should support mergeExpects (TSC)', async ({ runTSC }) => {
|
||||||
await expect(page).toBeAGoodPage(123);
|
await expect(page).toBeAGoodPage(123);
|
||||||
await expect(page).toBeABadPage('123');
|
await expect(page).toBeABadPage('123');
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
await expect(page).toBeAMedicorePage();
|
await expect(page).toBeAMediocrePage();
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
await expect(page).toBeABadPage(123);
|
await expect(page).toBeABadPage(123);
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
|
|
|
||||||
|
|
@ -641,11 +641,11 @@ test('generate html with attachment urls', async ({ runInlineTest, mergeReports,
|
||||||
for (const entry of await fs.promises.readdir(htmlReportDir))
|
for (const entry of await fs.promises.readdir(htmlReportDir))
|
||||||
await fs.promises.cp(path.join(htmlReportDir, entry), path.join(reportDir, entry), { recursive: true });
|
await fs.promises.cp(path.join(htmlReportDir, entry), path.join(reportDir, entry), { recursive: true });
|
||||||
|
|
||||||
const oldSeveFile = server.serveFile;
|
const oldServeFile = server.serveFile;
|
||||||
server.serveFile = async (req, res) => {
|
server.serveFile = async (req, res) => {
|
||||||
const pathName = url.parse(req.url!).pathname!;
|
const pathName = url.parse(req.url!).pathname!;
|
||||||
const filePath = path.join(reportDir, pathName.substring(1));
|
const filePath = path.join(reportDir, pathName.substring(1));
|
||||||
return oldSeveFile.call(server, req, res, filePath);
|
return oldServeFile.call(server, req, res, filePath);
|
||||||
};
|
};
|
||||||
|
|
||||||
await page.goto(`${server.PREFIX}/index.html`);
|
await page.goto(`${server.PREFIX}/index.html`);
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ test('should be included in testInfo', async ({ runInlineTest }, testInfo) => {
|
||||||
expect(result.exitCode).toBe(0);
|
expect(result.exitCode).toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should be included in testInfo if comming from describe', async ({ runInlineTest }, testInfo) => {
|
test('should be included in testInfo if coming from describe', async ({ runInlineTest }, testInfo) => {
|
||||||
const result = await runInlineTest({
|
const result = await runInlineTest({
|
||||||
'a.test.ts': `
|
'a.test.ts': `
|
||||||
import { test, expect } from '@playwright/test';
|
import { test, expect } from '@playwright/test';
|
||||||
|
|
|
||||||
4
tests/third_party/proxy/index.ts
vendored
4
tests/third_party/proxy/index.ts
vendored
|
|
@ -92,7 +92,7 @@ async function onrequest(
|
||||||
if (!success) return requestAuthorization(req, res);
|
if (!success) return requestAuthorization(req, res);
|
||||||
} catch (_err: unknown) {
|
} catch (_err: unknown) {
|
||||||
const err = _err as Error;
|
const err = _err as Error;
|
||||||
// an error occured during login!
|
// an error occurred during login!
|
||||||
res.writeHead(500);
|
res.writeHead(500);
|
||||||
res.end((err.stack || err.message || err) + '\n');
|
res.end((err.stack || err.message || err) + '\n');
|
||||||
return;
|
return;
|
||||||
|
|
@ -403,7 +403,7 @@ async function onconnect(
|
||||||
if (!success) return requestAuthorization(req, res);
|
if (!success) return requestAuthorization(req, res);
|
||||||
} catch (_err) {
|
} catch (_err) {
|
||||||
const err = _err as Error;
|
const err = _err as Error;
|
||||||
// an error occured during login!
|
// an error occurred during login!
|
||||||
res.writeHead(500);
|
res.writeHead(500);
|
||||||
res.end((err.stack || err.message || err) + '\n');
|
res.end((err.stack || err.message || err) + '\n');
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -184,12 +184,12 @@ class TypesGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} overriddes
|
* @param {string} overrides
|
||||||
*/
|
*/
|
||||||
objectDefinitionsToString(overriddes) {
|
objectDefinitionsToString(overrides) {
|
||||||
let definition;
|
let definition;
|
||||||
const parts = [];
|
const parts = [];
|
||||||
const internalWords = new Set(overriddes.split(/[^\w$]/g));
|
const internalWords = new Set(overrides.split(/[^\w$]/g));
|
||||||
while ((definition = this.objectDefinitions.pop())) {
|
while ((definition = this.objectDefinitions.pop())) {
|
||||||
const { name, properties } = definition;
|
const { name, properties } = definition;
|
||||||
const shouldExport = !!exported[name];
|
const shouldExport = !!exported[name];
|
||||||
|
|
|
||||||
|
|
@ -321,13 +321,13 @@ playwright.chromium.launch().then(async browser => {
|
||||||
console.log(await resultHandle.jsonValue());
|
console.log(await resultHandle.jsonValue());
|
||||||
await resultHandle.dispose();
|
await resultHandle.dispose();
|
||||||
|
|
||||||
// evaluteHandle with two different return types (JSHandle)
|
// evaluateHandle with two different return types (JSHandle)
|
||||||
{
|
{
|
||||||
const handle = await page.evaluateHandle(() => '' as string | number);
|
const handle = await page.evaluateHandle(() => '' as string | number);
|
||||||
const result = await handle.evaluate(value => value);
|
const result = await handle.evaluate(value => value);
|
||||||
const assertion: AssertType<string | number, typeof result> = true;
|
const assertion: AssertType<string | number, typeof result> = true;
|
||||||
}
|
}
|
||||||
// evaluteHandle with two different return types (ElementHandle)
|
// evaluateHandle with two different return types (ElementHandle)
|
||||||
{
|
{
|
||||||
const handle = await page.evaluateHandle(() => '' as any as HTMLInputElement | HTMLTextAreaElement);
|
const handle = await page.evaluateHandle(() => '' as any as HTMLInputElement | HTMLTextAreaElement);
|
||||||
await handle.evaluate(element => element.value);
|
await handle.evaluate(element => element.value);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue