mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
Reason: new tests are flaky on all bots.
This commit is contained in:
parent
9413351d3f
commit
dbb45d443a
40
docs/api.md
40
docs/api.md
@ -760,7 +760,6 @@ To disable authentication, pass `null`.
|
|||||||
- `selector` <[string]> A selector to search for checkbox or radio button to check. If there are multiple elements satisfying the selector, the first will be checked.
|
- `selector` <[string]> A selector to search for checkbox or radio button to check. If there are multiple elements satisfying the selector, the first will be checked.
|
||||||
- `options` <[Object]>
|
- `options` <[Object]>
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully checked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully checked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -780,7 +779,6 @@ Shortcut for [page.mainFrame().check(selector[, options])](#framecheckselector-o
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully clicked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully clicked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -837,7 +835,6 @@ Browser-specific Coverage implementation, only available for Chromium atm. See [
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the double click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the double click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully double clicked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully double clicked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -1122,7 +1119,6 @@ Shortcut for [page.mainFrame().goto(url, options)](#framegotourl-options)
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the hover, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the hover, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully hovered. Promise gets rejected if there's no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully hovered. Promise gets rejected if there's no element matching `selector`.
|
||||||
|
|
||||||
@ -1393,7 +1389,6 @@ Shortcut for [page.mainFrame().title()](#frametitle).
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the triple click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the triple click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully triple clicked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully triple clicked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -1430,9 +1425,8 @@ Shortcut for [page.mainFrame().type(selector, text[, options])](#frametypeselect
|
|||||||
- `selector` <[string]> A selector to search for uncheckbox to check. If there are multiple elements satisfying the selector, the first will be checked.
|
- `selector` <[string]> A selector to search for uncheckbox to check. If there are multiple elements satisfying the selector, the first will be checked.
|
||||||
- `options` <[Object]>
|
- `options` <[Object]>
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully unchecked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully checked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
This method fetches an element with `selector`, if element is not already unchecked, it scrolls it into view if needed, and then uses [page.click](#pageclickselector-options) to click in the center of the element.
|
This method fetches an element with `selector`, if element is not already unchecked, it scrolls it into view if needed, and then uses [page.click](#pageclickselector-options) to click in the center of the element.
|
||||||
If there's no element matching `selector`, the method throws an error.
|
If there's no element matching `selector`, the method throws an error.
|
||||||
@ -1801,7 +1795,6 @@ Adds a `<link rel="stylesheet">` tag into the page with the desired url or a `<s
|
|||||||
- `selector` <[string]> A selector to search for checkbox to check. If there are multiple elements satisfying the selector, the first will be checked.
|
- `selector` <[string]> A selector to search for checkbox to check. If there are multiple elements satisfying the selector, the first will be checked.
|
||||||
- `options` <[Object]>
|
- `options` <[Object]>
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully checked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully checked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -1822,7 +1815,6 @@ If there's no element matching `selector`, the method throws an error.
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully clicked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully clicked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -1853,7 +1845,6 @@ Gets the full HTML contents of the frame, including the doctype.
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the double click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the double click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully double clicked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully double clicked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -1989,7 +1980,6 @@ console.log(frame === contentFrame); // -> true
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the hover, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the hover, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully hovered. Promise gets rejected if there's no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully hovered. Promise gets rejected if there's no element matching `selector`.
|
||||||
|
|
||||||
@ -2065,7 +2055,6 @@ frame.select('select#colors', { value: 'blue' }, { index: 2 }, 'red');
|
|||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the triple click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the triple click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully triple clicked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully triple clicked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
@ -2098,9 +2087,8 @@ await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a
|
|||||||
- `selector` <[string]> A selector to search for uncheckbox to check. If there are multiple elements satisfying the selector, the first will be checked.
|
- `selector` <[string]> A selector to search for uncheckbox to check. If there are multiple elements satisfying the selector, the first will be checked.
|
||||||
- `options` <[Object]>
|
- `options` <[Object]>
|
||||||
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
- `waitFor` <"visible"|"hidden"|"any"|"nowait"> Wait for element to become visible (`visible`), hidden (`hidden`), present in dom (`any`) or do not wait at all (`nowait`). Defaults to `visible`.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
||||||
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully unchecked. The Promise will be rejected if there is no element matching `selector`.
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully checked. The Promise will be rejected if there is no element matching `selector`.
|
||||||
|
|
||||||
This method fetches an element with `selector`, if element is not already unchecked, it scrolls it into view if needed, and then uses [frame.click](#frameclickselector-options) to click in the center of the element.
|
This method fetches an element with `selector`, if element is not already unchecked, it scrolls it into view if needed, and then uses [frame.click](#frameclickselector-options) to click in the center of the element.
|
||||||
If there's no element matching `selector`, the method throws an error.
|
If there's no element matching `selector`, the method throws an error.
|
||||||
@ -2275,7 +2263,7 @@ ElementHandle instances can be used as arguments in [`page.$eval()`](#pageevalse
|
|||||||
- [elementHandle.$$eval(selector, pageFunction[, ...args])](#elementhandleevalselector-pagefunction-args)
|
- [elementHandle.$$eval(selector, pageFunction[, ...args])](#elementhandleevalselector-pagefunction-args)
|
||||||
- [elementHandle.$eval(selector, pageFunction[, ...args])](#elementhandleevalselector-pagefunction-args-1)
|
- [elementHandle.$eval(selector, pageFunction[, ...args])](#elementhandleevalselector-pagefunction-args-1)
|
||||||
- [elementHandle.boundingBox()](#elementhandleboundingbox)
|
- [elementHandle.boundingBox()](#elementhandleboundingbox)
|
||||||
- [elementHandle.check([options])](#elementhandlecheckoptions)
|
- [elementHandle.check()](#elementhandlecheck)
|
||||||
- [elementHandle.click([options])](#elementhandleclickoptions)
|
- [elementHandle.click([options])](#elementhandleclickoptions)
|
||||||
- [elementHandle.contentFrame()](#elementhandlecontentframe)
|
- [elementHandle.contentFrame()](#elementhandlecontentframe)
|
||||||
- [elementHandle.dblclick([options])](#elementhandledblclickoptions)
|
- [elementHandle.dblclick([options])](#elementhandledblclickoptions)
|
||||||
@ -2291,7 +2279,7 @@ ElementHandle instances can be used as arguments in [`page.$eval()`](#pageevalse
|
|||||||
- [elementHandle.toString()](#elementhandletostring)
|
- [elementHandle.toString()](#elementhandletostring)
|
||||||
- [elementHandle.tripleclick([options])](#elementhandletripleclickoptions)
|
- [elementHandle.tripleclick([options])](#elementhandletripleclickoptions)
|
||||||
- [elementHandle.type(text[, options])](#elementhandletypetext-options)
|
- [elementHandle.type(text[, options])](#elementhandletypetext-options)
|
||||||
- [elementHandle.uncheck([options])](#elementhandleuncheckoptions)
|
- [elementHandle.uncheck()](#elementhandleuncheck)
|
||||||
- [elementHandle.visibleRatio()](#elementhandlevisibleratio)
|
- [elementHandle.visibleRatio()](#elementhandlevisibleratio)
|
||||||
<!-- GEN:stop -->
|
<!-- GEN:stop -->
|
||||||
<!-- GEN:toc-extends-JSHandle -->
|
<!-- GEN:toc-extends-JSHandle -->
|
||||||
@ -2364,10 +2352,7 @@ expect(await tweetHandle.$eval('.retweets', node => node.innerText)).toBe('10');
|
|||||||
|
|
||||||
This method returns the bounding box of the element (relative to the main frame), or `null` if the element is not visible.
|
This method returns the bounding box of the element (relative to the main frame), or `null` if the element is not visible.
|
||||||
|
|
||||||
#### elementHandle.check([options])
|
#### elementHandle.check()
|
||||||
- `options` <[Object]>
|
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
|
||||||
- returns: <[Promise]> Promise which resolves when the element is successfully checked. Promise gets rejected if the operation fails.
|
- returns: <[Promise]> Promise which resolves when the element is successfully checked. Promise gets rejected if the operation fails.
|
||||||
|
|
||||||
If element is not already checked, it scrolls it into view if needed, and then uses [elementHandle.click](#elementhandleclickoptions) to click in the center of the element.
|
If element is not already checked, it scrolls it into view if needed, and then uses [elementHandle.click](#elementhandleclickoptions) to click in the center of the element.
|
||||||
@ -2381,8 +2366,6 @@ If element is not already checked, it scrolls it into view if needed, and then u
|
|||||||
- x <[number]>
|
- x <[number]>
|
||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
|
||||||
- returns: <[Promise]> Promise which resolves when the element is successfully clicked. Promise gets rejected if the element is detached from DOM.
|
- returns: <[Promise]> Promise which resolves when the element is successfully clicked. Promise gets rejected if the element is detached from DOM.
|
||||||
|
|
||||||
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to click in the center of the element.
|
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to click in the center of the element.
|
||||||
@ -2399,8 +2382,6 @@ If the element is detached from DOM, the method throws an error.
|
|||||||
- x <[number]>
|
- x <[number]>
|
||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the double click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the double click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
|
||||||
- returns: <[Promise]> Promise which resolves when the element is successfully double clicked. Promise gets rejected if the element is detached from DOM.
|
- returns: <[Promise]> Promise which resolves when the element is successfully double clicked. Promise gets rejected if the element is detached from DOM.
|
||||||
|
|
||||||
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to click in the center of the element.
|
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to click in the center of the element.
|
||||||
@ -2428,8 +2409,6 @@ Calls [focus](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus
|
|||||||
- x <[number]>
|
- x <[number]>
|
||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the hover, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the hover, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
|
||||||
- returns: <[Promise]> Promise which resolves when the element is successfully hovered.
|
- returns: <[Promise]> Promise which resolves when the element is successfully hovered.
|
||||||
|
|
||||||
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to hover over the center of the element.
|
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to hover over the center of the element.
|
||||||
@ -2515,8 +2494,6 @@ This method expects `elementHandle` to point to an [input element](https://devel
|
|||||||
- x <[number]>
|
- x <[number]>
|
||||||
- y <[number]>
|
- y <[number]>
|
||||||
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the triple click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
- `modifiers` <[Array]<"Alt"|"Control"|"Meta"|"Shift">> Modifier keys to press. Ensures that only these modifiers are pressed during the triple click, and then restores current modifiers back. If not specified, currently pressed modifiers are used.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
|
||||||
- returns: <[Promise]> Promise which resolves when the element is successfully triple clicked. Promise gets rejected if the element is detached from DOM.
|
- returns: <[Promise]> Promise which resolves when the element is successfully triple clicked. Promise gets rejected if the element is detached from DOM.
|
||||||
|
|
||||||
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to click in the center of the element.
|
This method scrolls element into view if needed, and then uses [page.mouse](#pagemouse) to click in the center of the element.
|
||||||
@ -2548,11 +2525,8 @@ await elementHandle.type('some text');
|
|||||||
await elementHandle.press('Enter');
|
await elementHandle.press('Enter');
|
||||||
```
|
```
|
||||||
|
|
||||||
#### elementHandle.uncheck([options])
|
#### elementHandle.uncheck()
|
||||||
- `options` <[Object]>
|
- returns: <[Promise]> Promise which resolves when the element is successfully checked. Promise gets rejected if the operation fails.
|
||||||
- `waitForInteractable` <[boolean]> Whether to wait for element to become static (not moving) and receive pointer events at the click point.
|
|
||||||
- `timeout` <[number]> Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by using the [browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout) or [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) methods.
|
|
||||||
- returns: <[Promise]> Promise which resolves when the element is successfully unchecked. Promise gets rejected if the operation fails.
|
|
||||||
|
|
||||||
If element is not already unchecked, it scrolls it into view if needed, and then uses [elementHandle.click](#elementhandleclickoptions) to click in the center of the element.
|
If element is not already unchecked, it scrolls it into view if needed, and then uses [elementHandle.click](#elementhandleclickoptions) to click in the center of the element.
|
||||||
|
|
||||||
|
123
src/dom.ts
123
src/dom.ts
@ -25,8 +25,6 @@ import { Page } from './page';
|
|||||||
import * as platform from './platform';
|
import * as platform from './platform';
|
||||||
import { Selectors } from './selectors';
|
import { Selectors } from './selectors';
|
||||||
|
|
||||||
export type WaitForInteractableOptions = types.TimeoutOptions & { waitForInteractable?: boolean };
|
|
||||||
|
|
||||||
export class FrameExecutionContext extends js.ExecutionContext {
|
export class FrameExecutionContext extends js.ExecutionContext {
|
||||||
readonly frame: frames.Frame;
|
readonly frame: frames.Frame;
|
||||||
|
|
||||||
@ -232,15 +230,10 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
|
||||||
async _performPointerAction(action: (point: types.Point) => Promise<void>, options?: input.PointerActionOptions & WaitForInteractableOptions): Promise<void> {
|
async _performPointerAction(action: (point: types.Point) => Promise<void>, options?: input.PointerActionOptions): Promise<void> {
|
||||||
const { waitForInteractable = true } = (options || {});
|
|
||||||
if (waitForInteractable)
|
|
||||||
await this._waitForStablePosition(options);
|
|
||||||
const relativePoint = options ? options.relativePoint : undefined;
|
const relativePoint = options ? options.relativePoint : undefined;
|
||||||
await this._scrollRectIntoViewIfNeeded(relativePoint ? { x: relativePoint.x, y: relativePoint.y, width: 0, height: 0 } : undefined);
|
await this._scrollRectIntoViewIfNeeded(relativePoint ? { x: relativePoint.x, y: relativePoint.y, width: 0, height: 0 } : undefined);
|
||||||
const point = relativePoint ? await this._relativePoint(relativePoint) : await this._clickablePoint();
|
const point = relativePoint ? await this._relativePoint(relativePoint) : await this._clickablePoint();
|
||||||
if (waitForInteractable)
|
|
||||||
await this._waitForHitTargetAt(point, options);
|
|
||||||
let restoreModifiers: input.Modifier[] | undefined;
|
let restoreModifiers: input.Modifier[] | undefined;
|
||||||
if (options && options.modifiers)
|
if (options && options.modifiers)
|
||||||
restoreModifiers = await this._page.keyboard._ensureModifiers(options.modifiers);
|
restoreModifiers = await this._page.keyboard._ensureModifiers(options.modifiers);
|
||||||
@ -249,19 +242,19 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||||||
await this._page.keyboard._ensureModifiers(restoreModifiers);
|
await this._page.keyboard._ensureModifiers(restoreModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
hover(options?: input.PointerActionOptions & WaitForInteractableOptions): Promise<void> {
|
hover(options?: input.PointerActionOptions): Promise<void> {
|
||||||
return this._performPointerAction(point => this._page.mouse.move(point.x, point.y), options);
|
return this._performPointerAction(point => this._page.mouse.move(point.x, point.y), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
click(options?: input.ClickOptions & WaitForInteractableOptions): Promise<void> {
|
click(options?: input.ClickOptions): Promise<void> {
|
||||||
return this._performPointerAction(point => this._page.mouse.click(point.x, point.y, options), options);
|
return this._performPointerAction(point => this._page.mouse.click(point.x, point.y, options), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
dblclick(options?: input.MultiClickOptions & WaitForInteractableOptions): Promise<void> {
|
dblclick(options?: input.MultiClickOptions): Promise<void> {
|
||||||
return this._performPointerAction(point => this._page.mouse.dblclick(point.x, point.y, options), options);
|
return this._performPointerAction(point => this._page.mouse.dblclick(point.x, point.y, options), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
tripleclick(options?: input.MultiClickOptions & WaitForInteractableOptions): Promise<void> {
|
tripleclick(options?: input.MultiClickOptions): Promise<void> {
|
||||||
return this._performPointerAction(point => this._page.mouse.tripleclick(point.x, point.y, options), options);
|
return this._performPointerAction(point => this._page.mouse.tripleclick(point.x, point.y, options), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -409,20 +402,19 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||||||
await this._page.keyboard.type(text, options);
|
await this._page.keyboard.type(text, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async press(key: string, options?: { delay?: number, text?: string }) {
|
async press(key: string, options: { delay?: number; text?: string; } | undefined) {
|
||||||
await this.focus();
|
await this.focus();
|
||||||
await this._page.keyboard.press(key, options);
|
await this._page.keyboard.press(key, options);
|
||||||
}
|
}
|
||||||
|
async check() {
|
||||||
async check(options?: WaitForInteractableOptions) {
|
await this._setChecked(true);
|
||||||
await this._setChecked(true, options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async uncheck(options?: WaitForInteractableOptions) {
|
async uncheck() {
|
||||||
await this._setChecked(false, options);
|
await this._setChecked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _setChecked(state: boolean, options: WaitForInteractableOptions = {}) {
|
private async _setChecked(state: boolean) {
|
||||||
const isCheckboxChecked = async (): Promise<boolean> => {
|
const isCheckboxChecked = async (): Promise<boolean> => {
|
||||||
return this._evaluateInUtility((node: Node) => {
|
return this._evaluateInUtility((node: Node) => {
|
||||||
if (node.nodeType !== Node.ELEMENT_NODE)
|
if (node.nodeType !== Node.ELEMENT_NODE)
|
||||||
@ -450,7 +442,7 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||||||
|
|
||||||
if (await isCheckboxChecked() === state)
|
if (await isCheckboxChecked() === state)
|
||||||
return;
|
return;
|
||||||
await this.click(options);
|
await this.click();
|
||||||
if (await isCheckboxChecked() !== state)
|
if (await isCheckboxChecked() !== state)
|
||||||
throw new Error('Unable to click checkbox');
|
throw new Error('Unable to click checkbox');
|
||||||
}
|
}
|
||||||
@ -505,52 +497,6 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||||||
return visibleRatio;
|
return visibleRatio;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async _waitForStablePosition(options: types.TimeoutOptions = {}): Promise<void> {
|
|
||||||
const context = await this._context.frame._utilityContext();
|
|
||||||
const stablePromise = context.evaluate((injected: Injected, node: Node, timeout: number) => {
|
|
||||||
if (!node.isConnected)
|
|
||||||
throw new Error('Element is not attached to the DOM');
|
|
||||||
const element = node.nodeType === Node.ELEMENT_NODE ? (node as Element) : node.parentElement;
|
|
||||||
if (!element)
|
|
||||||
throw new Error('Element is not attached to the DOM');
|
|
||||||
|
|
||||||
let lastRect: types.Rect | undefined;
|
|
||||||
return injected.poll('raf', undefined, timeout, () => {
|
|
||||||
const clientRect = element.getBoundingClientRect();
|
|
||||||
const rect = { x: clientRect.top, y: clientRect.left, width: clientRect.width, height: clientRect.height };
|
|
||||||
const isStable = lastRect && rect.x === lastRect.x && rect.y === lastRect.y && rect.width === lastRect.width && rect.height === lastRect.height;
|
|
||||||
lastRect = rect;
|
|
||||||
return isStable;
|
|
||||||
});
|
|
||||||
}, await context._injected(), this, options.timeout || 0);
|
|
||||||
await helper.waitWithTimeout(stablePromise, 'element to stop moving', options.timeout || 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
async _waitForHitTargetAt(point: types.Point, options: types.TimeoutOptions = {}): Promise<void> {
|
|
||||||
const frame = await this.ownerFrame();
|
|
||||||
if (frame && frame.parentFrame()) {
|
|
||||||
const element = await frame.frameElement();
|
|
||||||
const box = await element.boundingBox();
|
|
||||||
if (!box)
|
|
||||||
throw new Error('Element is not attached to the DOM');
|
|
||||||
// Translate from viewport coordinates to frame coordinates.
|
|
||||||
point = { x: point.x - box.x, y: point.y - box.y };
|
|
||||||
}
|
|
||||||
const context = await this._context.frame._utilityContext();
|
|
||||||
const hitTargetPromise = context.evaluate((injected: Injected, node: Node, timeout: number, point: types.Point) => {
|
|
||||||
const element = node.nodeType === Node.ELEMENT_NODE ? (node as Element) : node.parentElement;
|
|
||||||
if (!element)
|
|
||||||
throw new Error('Element is not attached to the DOM');
|
|
||||||
return injected.poll('raf', undefined, timeout, () => {
|
|
||||||
let hitElement = injected.utils.deepElementFromPoint(document, point.x, point.y);
|
|
||||||
while (hitElement && hitElement !== element)
|
|
||||||
hitElement = injected.utils.parentElementOrShadowHost(hitElement);
|
|
||||||
return hitElement === element;
|
|
||||||
});
|
|
||||||
}, await context._injected(), this, options.timeout || 0, point);
|
|
||||||
await helper.waitWithTimeout(hitTargetPromise, 'element to receive mouse events', options.timeout || 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function normalizeSelector(selector: string): string {
|
function normalizeSelector(selector: string): string {
|
||||||
@ -568,44 +514,51 @@ function normalizeSelector(selector: string): string {
|
|||||||
|
|
||||||
export type Task = (context: FrameExecutionContext) => Promise<js.JSHandle>;
|
export type Task = (context: FrameExecutionContext) => Promise<js.JSHandle>;
|
||||||
|
|
||||||
function assertPolling(polling: types.Polling) {
|
export function waitForFunctionTask(selector: string | undefined, pageFunction: Function | string, options: types.WaitForFunctionOptions, ...args: any[]) {
|
||||||
|
const { polling = 'raf' } = options;
|
||||||
if (helper.isString(polling))
|
if (helper.isString(polling))
|
||||||
assert(polling === 'raf' || polling === 'mutation', 'Unknown polling option: ' + polling);
|
assert(polling === 'raf' || polling === 'mutation', 'Unknown polling option: ' + polling);
|
||||||
else if (helper.isNumber(polling))
|
else if (helper.isNumber(polling))
|
||||||
assert(polling > 0, 'Cannot poll with non-positive interval: ' + polling);
|
assert(polling > 0, 'Cannot poll with non-positive interval: ' + polling);
|
||||||
else
|
else
|
||||||
throw new Error('Unknown polling options: ' + polling);
|
throw new Error('Unknown polling options: ' + polling);
|
||||||
}
|
|
||||||
|
|
||||||
export function waitForFunctionTask(selector: string | undefined, pageFunction: Function | string, options: types.WaitForFunctionOptions, ...args: any[]): Task {
|
|
||||||
const { polling = 'raf' } = options;
|
|
||||||
assertPolling(polling);
|
|
||||||
const predicateBody = helper.isString(pageFunction) ? 'return (' + pageFunction + ')' : 'return (' + pageFunction + ')(...args)';
|
const predicateBody = helper.isString(pageFunction) ? 'return (' + pageFunction + ')' : 'return (' + pageFunction + ')(...args)';
|
||||||
if (selector !== undefined)
|
if (selector !== undefined)
|
||||||
selector = normalizeSelector(selector);
|
selector = normalizeSelector(selector);
|
||||||
|
|
||||||
return async (context: FrameExecutionContext) => context.evaluateHandle((injected: Injected, selector: string | undefined, predicateBody: string, polling: types.Polling, timeout: number, ...args) => {
|
return async (context: FrameExecutionContext) => context.evaluateHandle((injected: Injected, selector: string | undefined, predicateBody: string, polling: types.Polling, timeout: number, ...args) => {
|
||||||
const innerPredicate = new Function('...args', predicateBody);
|
const innerPredicate = new Function('...args', predicateBody);
|
||||||
return injected.poll(polling, selector, timeout, (element: Element | undefined): any => {
|
if (polling === 'raf')
|
||||||
|
return injected.pollRaf(selector, predicate, timeout);
|
||||||
|
if (polling === 'mutation')
|
||||||
|
return injected.pollMutation(selector, predicate, timeout);
|
||||||
|
return injected.pollInterval(selector, polling, predicate, timeout);
|
||||||
|
|
||||||
|
function predicate(element: Element | undefined): any {
|
||||||
if (selector === undefined)
|
if (selector === undefined)
|
||||||
return innerPredicate(...args);
|
return innerPredicate(...args);
|
||||||
return innerPredicate(element, ...args);
|
return innerPredicate(element, ...args);
|
||||||
});
|
}
|
||||||
}, await context._injected(), selector, predicateBody, polling, options.timeout || 0, ...args);
|
}, await context._injected(), selector, predicateBody, polling, options.timeout || 0, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function waitForSelectorTask(selector: string, visibility: types.Visibility, timeout: number): Task {
|
export function waitForSelectorTask(selector: string, visibility: types.Visibility, timeout: number): Task {
|
||||||
selector = normalizeSelector(selector);
|
return async (context: FrameExecutionContext) => {
|
||||||
return async (context: FrameExecutionContext) => context.evaluateHandle((injected: Injected, selector: string, visibility: types.Visibility, timeout: number) => {
|
selector = normalizeSelector(selector);
|
||||||
const polling = visibility === 'any' ? 'mutation' : 'raf';
|
return context.evaluateHandle((injected: Injected, selector: string, visibility: types.Visibility, timeout: number) => {
|
||||||
return injected.poll(polling, selector, timeout, (element: Element | undefined): Element | boolean => {
|
if (visibility !== 'any')
|
||||||
if (!element)
|
return injected.pollRaf(selector, predicate, timeout);
|
||||||
return visibility === 'hidden';
|
return injected.pollMutation(selector, predicate, timeout);
|
||||||
if (visibility === 'any')
|
|
||||||
return element;
|
function predicate(element: Element | undefined): Element | boolean {
|
||||||
return injected.isVisible(element) === (visibility === 'visible') ? element : false;
|
if (!element)
|
||||||
});
|
return visibility === 'hidden';
|
||||||
}, await context._injected(), selector, visibility, timeout);
|
if (visibility === 'any')
|
||||||
|
return element;
|
||||||
|
return injected.isVisible(element) === (visibility === 'visible') ? element : false;
|
||||||
|
}
|
||||||
|
}, await context._injected(), selector, visibility, timeout);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const setFileInputFunction = async (element: HTMLInputElement, payloads: types.FilePayload[]) => {
|
export const setFileInputFunction = async (element: HTMLInputElement, payloads: types.FilePayload[]) => {
|
||||||
|
@ -780,19 +780,19 @@ export class Frame {
|
|||||||
return result!;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
async click(selector: string, options?: WaitForOptions & ClickOptions & dom.WaitForInteractableOptions) {
|
async click(selector: string, options?: WaitForOptions & ClickOptions) {
|
||||||
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
||||||
await handle.click(options);
|
await handle.click(options);
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
async dblclick(selector: string, options?: WaitForOptions & MultiClickOptions & dom.WaitForInteractableOptions) {
|
async dblclick(selector: string, options?: WaitForOptions & MultiClickOptions) {
|
||||||
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
||||||
await handle.dblclick(options);
|
await handle.dblclick(options);
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
async tripleclick(selector: string, options?: WaitForOptions & MultiClickOptions & dom.WaitForInteractableOptions) {
|
async tripleclick(selector: string, options?: WaitForOptions & MultiClickOptions) {
|
||||||
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
||||||
await handle.tripleclick(options);
|
await handle.tripleclick(options);
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
@ -810,7 +810,7 @@ export class Frame {
|
|||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
async hover(selector: string, options?: WaitForOptions & PointerActionOptions & dom.WaitForInteractableOptions) {
|
async hover(selector: string, options?: WaitForOptions & PointerActionOptions) {
|
||||||
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
||||||
await handle.hover(options);
|
await handle.hover(options);
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
@ -830,15 +830,15 @@ export class Frame {
|
|||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
async check(selector: string, options?: WaitForOptions & dom.WaitForInteractableOptions) {
|
async check(selector: string, options?: WaitForOptions) {
|
||||||
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
||||||
await handle.check(options);
|
await handle.check();
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
async uncheck(selector: string, options?: WaitForOptions & dom.WaitForInteractableOptions) {
|
async uncheck(selector: string, options?: WaitForOptions) {
|
||||||
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
const handle = await this._optionallyWaitForSelectorInUtilityContext(selector, options);
|
||||||
await handle.uncheck(options);
|
await handle.uncheck();
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ class Injected {
|
|||||||
return !!(rect.top || rect.bottom || rect.width || rect.height);
|
return !!(rect.top || rect.bottom || rect.width || rect.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _pollMutation(selector: string | undefined, predicate: Predicate, timeout: number): Promise<any> {
|
pollMutation(selector: string | undefined, predicate: Predicate, timeout: number): Promise<any> {
|
||||||
let timedOut = false;
|
let timedOut = false;
|
||||||
if (timeout)
|
if (timeout)
|
||||||
setTimeout(() => timedOut = true, timeout);
|
setTimeout(() => timedOut = true, timeout);
|
||||||
@ -178,7 +178,7 @@ class Injected {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _pollRaf(selector: string | undefined, predicate: Predicate, timeout: number): Promise<any> {
|
pollRaf(selector: string | undefined, predicate: Predicate, timeout: number): Promise<any> {
|
||||||
let timedOut = false;
|
let timedOut = false;
|
||||||
if (timeout)
|
if (timeout)
|
||||||
setTimeout(() => timedOut = true, timeout);
|
setTimeout(() => timedOut = true, timeout);
|
||||||
@ -203,7 +203,7 @@ class Injected {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _pollInterval(selector: string | undefined, pollInterval: number, predicate: Predicate, timeout: number): Promise<any> {
|
pollInterval(selector: string | undefined, pollInterval: number, predicate: Predicate, timeout: number): Promise<any> {
|
||||||
let timedOut = false;
|
let timedOut = false;
|
||||||
if (timeout)
|
if (timeout)
|
||||||
setTimeout(() => timedOut = true, timeout);
|
setTimeout(() => timedOut = true, timeout);
|
||||||
@ -226,14 +226,6 @@ class Injected {
|
|||||||
onTimeout();
|
onTimeout();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
poll(polling: 'raf' | 'mutation' | number, selector: string | undefined, timeout: number, predicate: Predicate): Promise<any> {
|
|
||||||
if (polling === 'raf')
|
|
||||||
return this._pollRaf(selector, predicate, timeout);
|
|
||||||
if (polling === 'mutation')
|
|
||||||
return this._pollMutation(selector, predicate, timeout);
|
|
||||||
return this._pollInterval(selector, polling, predicate, timeout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Injected;
|
export default Injected;
|
||||||
|
12
src/page.ts
12
src/page.ts
@ -485,15 +485,15 @@ export class Page extends platform.EventEmitter {
|
|||||||
return this._closed;
|
return this._closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
async click(selector: string, options?: frames.WaitForOptions & input.ClickOptions & dom.WaitForInteractableOptions) {
|
async click(selector: string, options?: frames.WaitForOptions & input.ClickOptions) {
|
||||||
return this.mainFrame().click(selector, options);
|
return this.mainFrame().click(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async dblclick(selector: string, options?: frames.WaitForOptions & input.MultiClickOptions & dom.WaitForInteractableOptions) {
|
async dblclick(selector: string, options?: frames.WaitForOptions & input.MultiClickOptions) {
|
||||||
return this.mainFrame().dblclick(selector, options);
|
return this.mainFrame().dblclick(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async tripleclick(selector: string, options?: frames.WaitForOptions & input.MultiClickOptions & dom.WaitForInteractableOptions) {
|
async tripleclick(selector: string, options?: frames.WaitForOptions & input.MultiClickOptions) {
|
||||||
return this.mainFrame().tripleclick(selector, options);
|
return this.mainFrame().tripleclick(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,7 +505,7 @@ export class Page extends platform.EventEmitter {
|
|||||||
return this.mainFrame().focus(selector, options);
|
return this.mainFrame().focus(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async hover(selector: string, options?: frames.WaitForOptions & input.PointerActionOptions & dom.WaitForInteractableOptions) {
|
async hover(selector: string, options?: frames.WaitForOptions & input.PointerActionOptions) {
|
||||||
return this.mainFrame().hover(selector, options);
|
return this.mainFrame().hover(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,11 +517,11 @@ export class Page extends platform.EventEmitter {
|
|||||||
return this.mainFrame().type(selector, text, options);
|
return this.mainFrame().type(selector, text, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async check(selector: string, options?: frames.WaitForOptions & dom.WaitForInteractableOptions) {
|
async check(selector: string, options?: frames.WaitForOptions) {
|
||||||
return this.mainFrame().check(selector, options);
|
return this.mainFrame().check(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async uncheck(selector: string, options?: frames.WaitForOptions & dom.WaitForInteractableOptions) {
|
async uncheck(selector: string, options?: frames.WaitForOptions) {
|
||||||
return this.mainFrame().uncheck(selector, options);
|
return this.mainFrame().uncheck(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
window.pageX = undefined;
|
window.pageX = undefined;
|
||||||
window.pageY = undefined;
|
window.pageY = undefined;
|
||||||
window.shiftKey = undefined;
|
window.shiftKey = undefined;
|
||||||
window.pageX = undefined;
|
|
||||||
window.pageY = undefined;
|
|
||||||
document.querySelector('button').addEventListener('click', e => {
|
document.querySelector('button').addEventListener('click', e => {
|
||||||
result = 'Clicked';
|
result = 'Clicked';
|
||||||
offsetX = e.offsetX;
|
offsetX = e.offsetX;
|
||||||
|
@ -378,96 +378,6 @@ module.exports.describe = function({testRunner, expect, playwright, FFOX, CHROMI
|
|||||||
expect(await page.evaluate(() => pageY)).toBe(expected.y);
|
expect(await page.evaluate(() => pageY)).toBe(expected.y);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should wait for stable position', async({page, server}) => {
|
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
|
||||||
await page.$eval('button', button => {
|
|
||||||
button.style.transition = 'margin 500ms linear 0s';
|
|
||||||
button.style.marginLeft = '200px';
|
|
||||||
button.style.borderWidth = '0';
|
|
||||||
button.style.width = '200px';
|
|
||||||
button.style.height = '20px';
|
|
||||||
document.body.style.margin = '0';
|
|
||||||
});
|
|
||||||
await page.click('button');
|
|
||||||
expect(await page.evaluate(() => window.result)).toBe('Clicked');
|
|
||||||
expect(await page.evaluate(() => pageX)).toBe(300);
|
|
||||||
expect(await page.evaluate(() => pageY)).toBe(10);
|
|
||||||
});
|
|
||||||
it('should timeout waiting for stable position', async({page, server}) => {
|
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
|
||||||
const button = await page.$('button');
|
|
||||||
await button.evaluate(button => {
|
|
||||||
button.style.transition = 'margin 5s linear 0s';
|
|
||||||
button.style.marginLeft = '200px';
|
|
||||||
});
|
|
||||||
const error = await button.click({ timeout: 100 }).catch(e => e);
|
|
||||||
expect(error.message).toContain('timeout 100ms exceeded');
|
|
||||||
});
|
|
||||||
it('should wait for becoming hit target', async({page, server}) => {
|
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
|
||||||
await page.$eval('button', button => {
|
|
||||||
button.style.borderWidth = '0';
|
|
||||||
button.style.width = '200px';
|
|
||||||
button.style.height = '20px';
|
|
||||||
document.body.style.margin = '0';
|
|
||||||
document.body.style.position = 'relative';
|
|
||||||
const flyOver = document.createElement('div');
|
|
||||||
flyOver.className = 'flyover';
|
|
||||||
flyOver.style.position = 'absolute';
|
|
||||||
flyOver.style.width = '400px';
|
|
||||||
flyOver.style.height = '20px';
|
|
||||||
flyOver.style.left = '-200px';
|
|
||||||
flyOver.style.top = '0';
|
|
||||||
flyOver.style.background = 'red';
|
|
||||||
document.body.appendChild(flyOver);
|
|
||||||
});
|
|
||||||
let clicked = false;
|
|
||||||
const clickPromise = page.click('button').then(() => clicked = true);
|
|
||||||
expect(clicked).toBe(false);
|
|
||||||
|
|
||||||
await page.$eval('.flyover', flyOver => flyOver.style.left = '0');
|
|
||||||
await page.evaluate(() => new Promise(requestAnimationFrame));
|
|
||||||
await page.evaluate(() => new Promise(requestAnimationFrame));
|
|
||||||
expect(clicked).toBe(false);
|
|
||||||
|
|
||||||
await page.$eval('.flyover', flyOver => flyOver.style.left = '200px');
|
|
||||||
await clickPromise;
|
|
||||||
expect(clicked).toBe(true);
|
|
||||||
expect(await page.evaluate(() => window.result)).toBe('Clicked');
|
|
||||||
});
|
|
||||||
it('should timeout waiting for hit target', async({page, server}) => {
|
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
|
||||||
const button = await page.$('button');
|
|
||||||
await page.evaluate(() => {
|
|
||||||
document.body.style.position = 'relative';
|
|
||||||
const blocker = document.createElement('div');
|
|
||||||
blocker.style.position = 'absolute';
|
|
||||||
blocker.style.width = '400px';
|
|
||||||
blocker.style.height = '20px';
|
|
||||||
blocker.style.left = '0';
|
|
||||||
blocker.style.top = '0';
|
|
||||||
document.body.appendChild(blocker);
|
|
||||||
});
|
|
||||||
const error = await button.click({ timeout: 100 }).catch(e => e);
|
|
||||||
expect(error.message).toContain('timeout 100ms exceeded');
|
|
||||||
});
|
|
||||||
it('should fail when obscured and not waiting for interactable', async({page, server}) => {
|
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
|
||||||
const button = await page.$('button');
|
|
||||||
await page.evaluate(() => {
|
|
||||||
document.body.style.position = 'relative';
|
|
||||||
const blocker = document.createElement('div');
|
|
||||||
blocker.style.position = 'absolute';
|
|
||||||
blocker.style.width = '400px';
|
|
||||||
blocker.style.height = '20px';
|
|
||||||
blocker.style.left = '0';
|
|
||||||
blocker.style.top = '0';
|
|
||||||
document.body.appendChild(blocker);
|
|
||||||
});
|
|
||||||
await button.click({ waitForInteractable: false });
|
|
||||||
expect(await page.evaluate(() => window.result)).toBe('Was not clicked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should update modifiers correctly', async({page, server}) => {
|
it('should update modifiers correctly', async({page, server}) => {
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
await page.goto(server.PREFIX + '/input/button.html');
|
||||||
await page.click('button', { modifiers: ['Shift'] });
|
await page.click('button', { modifiers: ['Shift'] });
|
||||||
|
@ -228,7 +228,7 @@ module.exports.describe = function({testRunner, expect, FFOX, CHROMIUM, WEBKIT})
|
|||||||
await page.evaluate(button => button.remove(), button);
|
await page.evaluate(button => button.remove(), button);
|
||||||
let error = null;
|
let error = null;
|
||||||
await button.click().catch(err => error = err);
|
await button.click().catch(err => error = err);
|
||||||
expect(error.message).toContain('Element is not attached to the DOM');
|
expect(error.message).toContain('Node is detached from document');
|
||||||
});
|
});
|
||||||
it('should throw for hidden nodes', async({page, server}) => {
|
it('should throw for hidden nodes', async({page, server}) => {
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
await page.goto(server.PREFIX + '/input/button.html');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user