chore: fix typos (#30645)

This commit is contained in:
Viktor Szépe 2024-05-08 20:40:03 +02:00 committed by GitHub
parent cf3ff6531a
commit 150cbcbdf3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 61 additions and 61 deletions

View File

@ -910,10 +910,10 @@ await expect(
assertThat(page.getByText("Welcome")).isVisible();
// 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.
asserThat(
assertThat(
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
.or(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign up")))
.first()

View File

@ -571,7 +571,7 @@ Whether to emulate network being offline. Defaults to `false`. Learn more about
- `username` <[string]>
- `password` <[string]>
- `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).
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
- `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
* `'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

View File

@ -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.
<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.

View File

@ -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"
test.afterEach('Status check', async ({ page }) => {

View File

@ -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.|
| `--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).|
| `-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). |
| `--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).|
| `-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 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. |
| `--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.|

View File

@ -183,7 +183,7 @@ export const test = baseTest.extend<{}, { dbUserName: string }>({
dbUserName: [async ({ }, use) => {
// Use workerIndex as a unique identifier for each worker.
const userName = `user-${test.info().workerIndex}`;
// Inialize user in the database.
// Initialize user in the database.
await createUserInTestDatabase(userName);
await use(userName);
// Clean up after the tests are done.

View File

@ -686,7 +686,7 @@ class FrameSession {
return;
}
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.
// We should keep the frame in the tree, and it will be used for the new target.
const frame = this._page._frameManager.frame(frameId);

View File

@ -349,7 +349,7 @@ export class DispatcherConnection {
}
}
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;
} finally {
callMetadata.endTime = monotonicTime();

View File

@ -75,7 +75,7 @@ export class JSHandleDispatcher extends Dispatcher<js.JSHandle, channels.JSHandl
}
// 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 {
return parseSerializedValue(arg.value, arg.handles.map(a => (a as JSHandleDispatcher)._object));
}

View File

@ -76,7 +76,7 @@ export type NavigationEvent = {
// Error for cross-document navigations if any. When error is present,
// the navigation did not commit.
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;
};

View File

@ -351,7 +351,7 @@ export class HarTracer {
});
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();
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
this._computeHarEntryTotalTime(harEntry);

View File

@ -625,7 +625,7 @@ function getTextAlternativeInternal(element: Element, options: AccessibleNameOpt
if (trimFlatString(title))
return title;
// 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';
}

View File

@ -282,7 +282,7 @@ function buildLayoutClosure(layout: keyboardLayout.KeyboardLayout): Map<string,
shiftedDescription.keyCode = definition.shiftKeyCode;
}
// Map from code: Digit3 -> { ... descrption, shifted }
// Map from code: Digit3 -> { ... description, shifted }
result.set(code, { ...description, shifted: shiftedDescription });
// Map from aliases: Shift -> non-shiftable definition

View File

@ -4390,7 +4390,7 @@ export interface Page {
*/
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
* result in unhandled error
* - `'wait'` - wait for current handler calls (if any) to finish
@ -8827,7 +8827,7 @@ export interface BrowserContext {
*/
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
* result in unhandled error
* - `'wait'` - wait for current handler calls (if any) to finish
@ -13378,7 +13378,7 @@ export interface BrowserType<Unused = {}> {
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
* from the browser.
*/
@ -14901,7 +14901,7 @@ export interface AndroidDevice {
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
* from the browser.
*/
@ -15632,7 +15632,7 @@ export interface APIRequest {
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
* from the browser.
*/
@ -16783,7 +16783,7 @@ export interface Browser extends EventEmitter {
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
* from the browser.
*/
@ -17677,7 +17677,7 @@ export interface Electron {
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
* from the browser.
*/
@ -20344,7 +20344,7 @@ export interface HTTPCredentials {
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
* from the browser.
*/

View File

@ -61,7 +61,7 @@ export async function incorporateCompilationCache() {
if (!loaderChannel)
return;
// 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.
const result = await loaderChannel.send('getCompilationCache', {});
addToCompilationCache(result.cache);

View File

@ -235,7 +235,7 @@ export function fixtureParameterNames(fn: Function | any, location: Location, on
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];
}

View File

@ -130,7 +130,7 @@ class SnapshotHelper {
++snapshotNames.anonymousSnapshotIndex,
].join(' ');
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;
} else {
// We intentionally do not sanitize user-provided array of segments, but for backwards

View File

@ -139,7 +139,7 @@ async function extractAndParseReports(dir: string, shardFiles: string[], interna
fileName = reportNames.makeUnique(fileName);
let parsedEvents = parseCommonEvents(content);
// 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.
internalizer.traverse(parsedEvents);
const metadata = findMetadata(parsedEvents, file);

View File

@ -83,7 +83,7 @@ class Fixture {
this.failed = true;
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.
dep._usages.add(this);
// Don't forget to decrement all usages when fixture goes.

View File

@ -30,7 +30,7 @@ import { applyRepeatEachIndex, bindFileSuiteToProject, filterTestsRemoveEmptySui
import { PoolBuilder } from '../common/poolBuilder';
import type { TestInfoError } from '../../types/test';
import type { Location } from '../../types/testReporter';
import { inheritFixutreNames } from '../common/fixtures';
import { inheritFixtureNames } from '../common/fixtures';
import { type TimeSlot, TimeoutManagerError } from './timeoutManager';
export class WorkerMain extends ProcessRunner {
@ -490,7 +490,7 @@ export class WorkerMain extends ProcessRunner {
const result = await modifier.fn(fixtures);
testInfo[modifier.type](!!result, modifier.description);
};
inheritFixutreNames(modifier.fn, fn);
inheritFixtureNames(modifier.fn, fn);
runnables.push({
title: `${modifier.type} modifier`,
location: modifier.location,

View File

@ -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
* // 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
* // example.spec.ts

View File

@ -15,7 +15,7 @@ test('emit an submit event when the button is clicked', async ({ mount }) => {
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 component = await mount(Button, {
props: {

View File

@ -16,7 +16,7 @@ test('emit an submit event when the button is clicked', async ({ mount }) => {
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 component = await mount(
<Button

View File

@ -15,7 +15,7 @@ test('emit a submit event when the button is clicked', async ({ mount }) => {
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 component = await mount(Button, {
props: {

View File

@ -15,7 +15,7 @@ test('emit a submit event when the button is clicked', async ({ mount }) => {
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 component = await mount(Button, {
props: {

View File

@ -16,7 +16,7 @@ test('emit a submit event when the button is clicked', async ({ mount }) => {
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 component = await mount(
<Button

View File

@ -26,7 +26,7 @@ import ws from 'ws';
import zlib, { gzip } from 'zlib';
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 gzipAsync = util.promisify(gzip.bind(zlib));
@ -288,8 +288,8 @@ export class TestServer {
}
waitForWebSocketConnectionRequest() {
return new Promise<http.IncomingMessage & { headers: http.IncomingHttpHeaders }>(fullfil => {
this._wsServer.once('connection', (ws, req) => fullfil(req));
return new Promise<http.IncomingMessage & { headers: http.IncomingHttpHeaders }>(fulfil => {
this._wsServer.once('connection', (ws, req) => fulfil(req));
});
}

View File

@ -28,7 +28,7 @@ const fs = require('fs');
recordVideo: { dir: __dirname, size: {width: 320, height: 240} },
});
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 context.close();
await browser.close();

View File

@ -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`);
});
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(`
<style>
body, html, iframe { margin: 0; padding: 0; border: none; }

View File

@ -462,7 +462,7 @@ await page1.GotoAsync("about:blank?foo");`);
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();
await recorder.setContentAndWait(`<input id="checkbox" type="checkbox" name="accept" onchange="checkbox.name = 'updated'"></input>`);
await Promise.all([

View File

@ -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'))).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('span'))).toHaveText('world');
await expect(page.locator('div').or(page.locator('article'))).toHaveText('hello');

View File

@ -981,7 +981,7 @@ it('should click in a transformed iframe', async ({ page }) => {
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' });
await page.setViewportSize({ width: 500, height: 500 });
await page.goto(server.EMPTY_PAGE);

View File

@ -84,7 +84,7 @@ it('should traverse only form elements', async function({ page, browserName, pla
await page.setContent(`
<input id="input-1">
<button id="button">buttton</button>
<button id="button">button</button>
<a href id="link">link</a>
<input id="input-2">
`);

View File

@ -596,7 +596,7 @@ it('should not fulfill with redirect status', async ({ page, server, browserName
'location': '/empty.html',
}
});
reject('fullfill didn\'t throw');
reject('fulfill didn\'t throw');
} catch (e) {
fulfill(e);
}

View File

@ -25,7 +25,7 @@ test('should clear cache with type:module', async ({ runCLICommand }) => {
import { defineConfig } from '@playwright/test';
export default defineConfig({});
`,
'pacakge.json': `
'package.json': `
{ "type": "module" }
`,
'a.spec.ts': `

View File

@ -881,7 +881,7 @@ test('should chain expect matchers and expose matcher utils', async ({ runInline
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({
'a.spec.ts': `
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).toBeABadPage('123');
// @ts-expect-error
await expect(page).toBeAMedicorePage();
await expect(page).toBeAMediocrePage();
// @ts-expect-error
await expect(page).toBeABadPage(123);
// @ts-expect-error

View File

@ -641,11 +641,11 @@ test('generate html with attachment urls', async ({ runInlineTest, mergeReports,
for (const entry of await fs.promises.readdir(htmlReportDir))
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) => {
const pathName = url.parse(req.url!).pathname!;
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`);

View File

@ -162,7 +162,7 @@ test('should be included in testInfo', async ({ runInlineTest }, testInfo) => {
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({
'a.test.ts': `
import { test, expect } from '@playwright/test';

View File

@ -92,7 +92,7 @@ async function onrequest(
if (!success) return requestAuthorization(req, res);
} catch (_err: unknown) {
const err = _err as Error;
// an error occured during login!
// an error occurred during login!
res.writeHead(500);
res.end((err.stack || err.message || err) + '\n');
return;
@ -403,7 +403,7 @@ async function onconnect(
if (!success) return requestAuthorization(req, res);
} catch (_err) {
const err = _err as Error;
// an error occured during login!
// an error occurred during login!
res.writeHead(500);
res.end((err.stack || err.message || err) + '\n');
return;

View File

@ -184,12 +184,12 @@ class TypesGenerator {
}
/**
* @param {string} overriddes
* @param {string} overrides
*/
objectDefinitionsToString(overriddes) {
objectDefinitionsToString(overrides) {
let definition;
const parts = [];
const internalWords = new Set(overriddes.split(/[^\w$]/g));
const internalWords = new Set(overrides.split(/[^\w$]/g));
while ((definition = this.objectDefinitions.pop())) {
const { name, properties } = definition;
const shouldExport = !!exported[name];

View File

@ -321,13 +321,13 @@ playwright.chromium.launch().then(async browser => {
console.log(await resultHandle.jsonValue());
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 result = await handle.evaluate(value => value);
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);
await handle.evaluate(element => element.value);