mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
![]() |
import { assert } from "console";
|
||
|
import { helper } from "./helper";
|
||
|
|
||
|
// Copyright (c) Microsoft Corporation.
|
||
|
// Licensed under the MIT license.
|
||
|
|
||
|
export type Modifier = 'Alt' | 'Control' | 'Meta' | 'Shift';
|
||
|
export type Button = 'left' | 'right' | 'middle';
|
||
|
|
||
|
type Point = {
|
||
|
x: number;
|
||
|
y: number;
|
||
|
};
|
||
|
|
||
|
export type PointerActionOptions = {
|
||
|
modifiers?: Modifier[];
|
||
|
relativePoint?: Point;
|
||
|
};
|
||
|
|
||
|
export type ClickOptions = PointerActionOptions & {
|
||
|
delay?: number;
|
||
|
button?: Button;
|
||
|
clickCount?: number;
|
||
|
};
|
||
|
|
||
|
export type MultiClickOptions = PointerActionOptions & {
|
||
|
delay?: number;
|
||
|
button?: Button;
|
||
|
};
|
||
|
|
||
|
export type SelectOption = {
|
||
|
value?: string;
|
||
|
label?: string;
|
||
|
index?: number;
|
||
|
};
|
||
|
|
||
|
export const selectFunction = (element: HTMLSelectElement, ...optionsToSelect: (Node | SelectOption)[]) => {
|
||
|
if (element.nodeName.toLowerCase() !== 'select')
|
||
|
throw new Error('Element is not a <select> element.');
|
||
|
|
||
|
const options = Array.from(element.options);
|
||
|
element.value = undefined;
|
||
|
for (let index = 0; index < options.length; index++) {
|
||
|
const option = options[index];
|
||
|
option.selected = optionsToSelect.some(optionToSelect => {
|
||
|
if (optionToSelect instanceof Node)
|
||
|
return option === optionToSelect;
|
||
|
let matches = true;
|
||
|
if (optionToSelect.value !== undefined)
|
||
|
matches = matches && optionToSelect.value === option.value;
|
||
|
if (optionToSelect.label !== undefined)
|
||
|
matches = matches && optionToSelect.label === option.label;
|
||
|
if (optionToSelect.index !== undefined)
|
||
|
matches = matches && optionToSelect.index === index;
|
||
|
return matches;
|
||
|
});
|
||
|
if (option.selected && !element.multiple)
|
||
|
break;
|
||
|
}
|
||
|
element.dispatchEvent(new Event('input', { 'bubbles': true }));
|
||
|
element.dispatchEvent(new Event('change', { 'bubbles': true }));
|
||
|
return options.filter(option => option.selected).map(option => option.value);
|
||
|
};
|