Best JavaScript code snippet using playwright-internal
dom.js
Source:dom.js
...370 async _waitAndScrollIntoViewIfNeeded(progress) {371 while (progress.isRunning()) {372 assertDone(373 throwRetargetableDOMError(374 await this._waitForDisplayedAtStablePosition(375 progress,376 false,377 /* force */378 false379 /* waitForEnabled */380 )381 )382 )383 progress.throwIfAborted() // Avoid action that has side-effects.384 const result = throwRetargetableDOMError(385 await this._scrollRectIntoViewIfNeeded()386 )387 if (result === 'error:notvisible') continue388 assertDone(result)389 return390 }391 }392 async scrollIntoViewIfNeeded(metadata, options = {}) {393 const controller = new _progress.ProgressController(metadata, this)394 return controller.run(395 (progress) => this._waitAndScrollIntoViewIfNeeded(progress),396 this._page._timeoutSettings.timeout(options)397 )398 }399 async _clickablePoint() {400 const intersectQuadWithViewport = (quad) => {401 return quad.map((point) => ({402 x: Math.min(Math.max(point.x, 0), metrics.width),403 y: Math.min(Math.max(point.y, 0), metrics.height)404 }))405 }406 const computeQuadArea = (quad) => {407 // Compute sum of all directed areas of adjacent triangles408 // https://en.wikipedia.org/wiki/Polygon#Simple_polygons409 let area = 0410 for (let i = 0; i < quad.length; ++i) {411 const p1 = quad[i]412 const p2 = quad[(i + 1) % quad.length]413 area += (p1.x * p2.y - p2.x * p1.y) / 2414 }415 return Math.abs(area)416 }417 const [quads, metrics] = await Promise.all([418 this._page._delegate.getContentQuads(this),419 this._page420 .mainFrame()421 ._utilityContext()422 .then((utility) =>423 utility.evaluate(() => ({424 width: innerWidth,425 height: innerHeight426 }))427 )428 ])429 if (!quads || !quads.length) return 'error:notvisible' // Allow 1x1 elements. Compensate for rounding errors by comparing with 0.99 instead.430 const filtered = quads431 .map((quad) => intersectQuadWithViewport(quad))432 .filter((quad) => computeQuadArea(quad) > 0.99)433 if (!filtered.length) return 'error:notinviewport' // Return the middle point of the first quad.434 const result = {435 x: 0,436 y: 0437 }438 for (const point of filtered[0]) {439 result.x += point.x / 4440 result.y += point.y / 4441 }442 compensateHalfIntegerRoundingError(result)443 return result444 }445 async _offsetPoint(offset) {446 const [box, border] = await Promise.all([447 this.boundingBox(),448 this.evaluateInUtility(449 ([injected, node]) => injected.getElementBorderWidth(node),450 {}451 ).catch((e) => {})452 ])453 if (!box || !border) return 'error:notvisible'454 if (border === 'error:notconnected') return border // Make point relative to the padding box to align with offsetX/offsetY.455 return {456 x: box.x + border.left + offset.x,457 y: box.y + border.top + offset.y458 }459 }460 async _retryPointerAction(461 progress,462 actionName,463 waitForEnabled,464 action,465 options466 ) {467 let retry = 0 // We progressively wait longer between retries, up to 500ms.468 const waitTime = [0, 20, 100, 100, 500] // By default, we scroll with protocol method to reveal the action point.469 // However, that might not work to scroll from under position:sticky elements470 // that overlay the target element. To fight this, we cycle through different471 // scroll alignments. This works in most scenarios.472 const scrollOptions = [473 undefined,474 {475 block: 'end',476 inline: 'end'477 },478 {479 block: 'center',480 inline: 'center'481 },482 {483 block: 'start',484 inline: 'start'485 }486 ]487 while (progress.isRunning()) {488 if (retry) {489 progress.log(490 `retrying ${actionName} action${491 options.trial ? ' (trial run)' : ''492 }, attempt #${retry}`493 )494 const timeout = waitTime[Math.min(retry - 1, waitTime.length - 1)]495 if (timeout) {496 progress.log(` waiting ${timeout}ms`)497 const result = await this.evaluateInUtility(498 ([injected, node, timeout]) =>499 new Promise((f) => setTimeout(f, timeout)),500 timeout501 )502 if (result === 'error:notconnected') return result503 }504 } else {505 progress.log(506 `attempting ${actionName} action${507 options.trial ? ' (trial run)' : ''508 }`509 )510 }511 const forceScrollOptions = scrollOptions[retry % scrollOptions.length]512 const result = await this._performPointerAction(513 progress,514 actionName,515 waitForEnabled,516 action,517 forceScrollOptions,518 options519 )520 ++retry521 if (result === 'error:notvisible') {522 if (options.force) throw new Error('Element is not visible')523 progress.log(' element is not visible')524 continue525 }526 if (result === 'error:notinviewport') {527 if (options.force) throw new Error('Element is outside of the viewport')528 progress.log(' element is outside of the viewport')529 continue530 }531 if (typeof result === 'object' && 'hitTargetDescription' in result) {532 if (options.force)533 throw new Error(534 `Element does not receive pointer events, ${result.hitTargetDescription} intercepts them`535 )536 progress.log(537 ` ${result.hitTargetDescription} intercepts pointer events`538 )539 continue540 }541 return result542 }543 return 'done'544 }545 async _performPointerAction(546 progress,547 actionName,548 waitForEnabled,549 action,550 forceScrollOptions,551 options552 ) {553 const { force = false, position } = options554 if (options.__testHookBeforeStable) await options.__testHookBeforeStable()555 const result = await this._waitForDisplayedAtStablePosition(556 progress,557 force,558 waitForEnabled559 )560 if (result !== 'done') return result561 if (options.__testHookAfterStable) await options.__testHookAfterStable()562 progress.log(' scrolling into view if needed')563 progress.throwIfAborted() // Avoid action that has side-effects.564 if (forceScrollOptions) {565 const scrolled = await this.evaluateInUtility(566 ([injected, node, options]) => {567 if (568 node.nodeType === 1569 /* Node.ELEMENT_NODE */570 )571 node.scrollIntoView(options)572 },573 forceScrollOptions574 )575 if (scrolled === 'error:notconnected') return scrolled576 } else {577 const scrolled = await this._scrollRectIntoViewIfNeeded(578 position579 ? {580 x: position.x,581 y: position.y,582 width: 0,583 height: 0584 }585 : undefined586 )587 if (scrolled !== 'done') return scrolled588 }589 progress.log(' done scrolling')590 const maybePoint = position591 ? await this._offsetPoint(position)592 : await this._clickablePoint()593 if (typeof maybePoint === 'string') return maybePoint594 const point = roundPoint(maybePoint)595 if (!force) {596 if (options.__testHookBeforeHitTarget)597 await options.__testHookBeforeHitTarget()598 progress.log(599 ` checking that element receives pointer events at (${point.x},${point.y})`600 )601 const hitTargetResult = await this._checkHitTargetAt(point)602 if (hitTargetResult !== 'done') return hitTargetResult603 progress.log(` element does receive pointer events`)604 }605 progress.metadata.point = point606 if (options.trial) {607 progress.log(` trial ${actionName} has finished`)608 return 'done'609 }610 await progress.beforeInputAction(this)611 await this._page._frameManager.waitForSignalsCreatedBy(612 progress,613 options.noWaitAfter,614 async () => {615 if (options.__testHookBeforePointerAction)616 await options.__testHookBeforePointerAction()617 progress.throwIfAborted() // Avoid action that has side-effects.618 let restoreModifiers619 if (options && options.modifiers)620 restoreModifiers = await this._page.keyboard._ensureModifiers(621 options.modifiers622 )623 progress.log(` performing ${actionName} action`)624 await action(point)625 progress.log(` ${actionName} action done`)626 progress.log(' waiting for scheduled navigations to finish')627 if (options.__testHookAfterPointerAction)628 await options.__testHookAfterPointerAction()629 if (restoreModifiers)630 await this._page.keyboard._ensureModifiers(restoreModifiers)631 },632 'input'633 )634 progress.log(' navigations have finished')635 return 'done'636 }637 async hover(metadata, options) {638 const controller = new _progress.ProgressController(metadata, this)639 return controller.run(async (progress) => {640 const result = await this._hover(progress, options)641 return assertDone(throwRetargetableDOMError(result))642 }, this._page._timeoutSettings.timeout(options))643 }644 _hover(progress, options) {645 return this._retryPointerAction(646 progress,647 'hover',648 false,649 /* waitForEnabled */650 (point) => this._page.mouse.move(point.x, point.y),651 options652 )653 }654 async click(metadata, options = {}) {655 const controller = new _progress.ProgressController(metadata, this)656 return controller.run(async (progress) => {657 const result = await this._click(progress, options)658 return assertDone(throwRetargetableDOMError(result))659 }, this._page._timeoutSettings.timeout(options))660 }661 _click(progress, options) {662 return this._retryPointerAction(663 progress,664 'click',665 true,666 /* waitForEnabled */667 (point) => this._page.mouse.click(point.x, point.y, options),668 options669 )670 }671 async dblclick(metadata, options) {672 const controller = new _progress.ProgressController(metadata, this)673 return controller.run(async (progress) => {674 const result = await this._dblclick(progress, options)675 return assertDone(throwRetargetableDOMError(result))676 }, this._page._timeoutSettings.timeout(options))677 }678 _dblclick(progress, options) {679 return this._retryPointerAction(680 progress,681 'dblclick',682 true,683 /* waitForEnabled */684 (point) => this._page.mouse.dblclick(point.x, point.y, options),685 options686 )687 }688 async tap(metadata, options = {}) {689 const controller = new _progress.ProgressController(metadata, this)690 return controller.run(async (progress) => {691 const result = await this._tap(progress, options)692 return assertDone(throwRetargetableDOMError(result))693 }, this._page._timeoutSettings.timeout(options))694 }695 _tap(progress, options) {696 return this._retryPointerAction(697 progress,698 'tap',699 true,700 /* waitForEnabled */701 (point) => this._page.touchscreen.tap(point.x, point.y),702 options703 )704 }705 async selectOption(metadata, elements, values, options) {706 const controller = new _progress.ProgressController(metadata, this)707 return controller.run(async (progress) => {708 const result = await this._selectOption(709 progress,710 elements,711 values,712 options713 )714 return throwRetargetableDOMError(result)715 }, this._page._timeoutSettings.timeout(options))716 }717 async _selectOption(progress, elements, values, options) {718 const optionsToSelect = [...elements, ...values]719 await progress.beforeInputAction(this)720 return this._page._frameManager.waitForSignalsCreatedBy(721 progress,722 options.noWaitAfter,723 async () => {724 progress.throwIfAborted() // Avoid action that has side-effects.725 progress.log(' selecting specified option(s)')726 const result = await this.evaluatePoll(727 progress,728 ([injected, node, { optionsToSelect, force }]) => {729 return injected.waitForElementStatesAndPerformAction(730 node,731 ['visible', 'enabled'],732 force,733 injected.selectOptions.bind(injected, optionsToSelect)734 )735 },736 {737 optionsToSelect,738 force: options.force739 }740 )741 await this._page._doSlowMo()742 return result743 }744 )745 }746 async fill(metadata, value, options = {}) {747 const controller = new _progress.ProgressController(metadata, this)748 return controller.run(async (progress) => {749 const result = await this._fill(progress, value, options)750 assertDone(throwRetargetableDOMError(result))751 }, this._page._timeoutSettings.timeout(options))752 }753 async _fill(progress, value, options) {754 progress.log(`elementHandle.fill("${value}")`)755 await progress.beforeInputAction(this)756 return this._page._frameManager.waitForSignalsCreatedBy(757 progress,758 options.noWaitAfter,759 async () => {760 progress.log(761 ' waiting for element to be visible, enabled and editable'762 )763 const filled = await this.evaluatePoll(764 progress,765 ([injected, node, { value, force }]) => {766 return injected.waitForElementStatesAndPerformAction(767 node,768 ['visible', 'enabled', 'editable'],769 force,770 injected.fill.bind(injected, value)771 )772 },773 {774 value,775 force: options.force776 }777 )778 progress.throwIfAborted() // Avoid action that has side-effects.779 if (filled === 'error:notconnected') return filled780 progress.log(' element is visible, enabled and editable')781 if (filled === 'needsinput') {782 progress.throwIfAborted() // Avoid action that has side-effects.783 if (value) await this._page.keyboard.insertText(value)784 else await this._page.keyboard.press('Delete')785 } else {786 assertDone(filled)787 }788 return 'done'789 },790 'input'791 )792 }793 async selectText(metadata, options = {}) {794 const controller = new _progress.ProgressController(metadata, this)795 return controller.run(async (progress) => {796 progress.throwIfAborted() // Avoid action that has side-effects.797 const result = await this.evaluatePoll(798 progress,799 ([injected, node, force]) => {800 return injected.waitForElementStatesAndPerformAction(801 node,802 ['visible'],803 force,804 injected.selectText.bind(injected)805 )806 },807 options.force808 )809 assertDone(throwRetargetableDOMError(result))810 }, this._page._timeoutSettings.timeout(options))811 }812 async setInputFiles(metadata, files, options) {813 const controller = new _progress.ProgressController(metadata, this)814 return controller.run(async (progress) => {815 const result = await this._setInputFiles(progress, files, options)816 return assertDone(throwRetargetableDOMError(result))817 }, this._page._timeoutSettings.timeout(options))818 }819 async _setInputFiles(progress, files, options) {820 for (const payload of files) {821 if (!payload.mimeType)822 payload.mimeType =823 mime.getType(payload.name) || 'application/octet-stream'824 }825 const result = await this.evaluateHandleInUtility(826 ([injected, node, multiple]) => {827 const element = injected.retarget(node, 'follow-label')828 if (!element) return829 if (element.tagName !== 'INPUT')830 throw injected.createStacklessError('Node is not an HTMLInputElement')831 if (multiple && !element.multiple)832 throw injected.createStacklessError(833 'Non-multiple file input can only accept single file'834 )835 return element836 },837 files.length > 1838 )839 if (result === 'error:notconnected' || !result.asElement())840 return 'error:notconnected'841 const retargeted = result.asElement()842 await progress.beforeInputAction(this)843 await this._page._frameManager.waitForSignalsCreatedBy(844 progress,845 options.noWaitAfter,846 async () => {847 progress.throwIfAborted() // Avoid action that has side-effects.848 await this._page._delegate.setInputFiles(retargeted, files)849 }850 )851 await this._page._doSlowMo()852 return 'done'853 }854 async focus(metadata) {855 const controller = new _progress.ProgressController(metadata, this)856 await controller.run(async (progress) => {857 const result = await this._focus(progress)858 await this._page._doSlowMo()859 return assertDone(throwRetargetableDOMError(result))860 }, 0)861 }862 async _focus(progress, resetSelectionIfNotFocused) {863 progress.throwIfAborted() // Avoid action that has side-effects.864 return await this.evaluateInUtility(865 ([injected, node, resetSelectionIfNotFocused]) =>866 injected.focusNode(node, resetSelectionIfNotFocused),867 resetSelectionIfNotFocused868 )869 }870 async type(metadata, text, options) {871 const controller = new _progress.ProgressController(metadata, this)872 return controller.run(async (progress) => {873 const result = await this._type(progress, text, options)874 return assertDone(throwRetargetableDOMError(result))875 }, this._page._timeoutSettings.timeout(options))876 }877 async _type(progress, text, options) {878 progress.log(`elementHandle.type("${text}")`)879 await progress.beforeInputAction(this)880 return this._page._frameManager.waitForSignalsCreatedBy(881 progress,882 options.noWaitAfter,883 async () => {884 const result = await this._focus(885 progress,886 true887 /* resetSelectionIfNotFocused */888 )889 if (result !== 'done') return result890 progress.throwIfAborted() // Avoid action that has side-effects.891 await this._page.keyboard.type(text, options)892 return 'done'893 },894 'input'895 )896 }897 async press(metadata, key, options) {898 const controller = new _progress.ProgressController(metadata, this)899 return controller.run(async (progress) => {900 const result = await this._press(progress, key, options)901 return assertDone(throwRetargetableDOMError(result))902 }, this._page._timeoutSettings.timeout(options))903 }904 async _press(progress, key, options) {905 progress.log(`elementHandle.press("${key}")`)906 await progress.beforeInputAction(this)907 return this._page._frameManager.waitForSignalsCreatedBy(908 progress,909 options.noWaitAfter,910 async () => {911 const result = await this._focus(912 progress,913 true914 /* resetSelectionIfNotFocused */915 )916 if (result !== 'done') return result917 progress.throwIfAborted() // Avoid action that has side-effects.918 await this._page.keyboard.press(key, options)919 return 'done'920 },921 'input'922 )923 }924 async check(metadata, options) {925 const controller = new _progress.ProgressController(metadata, this)926 return controller.run(async (progress) => {927 const result = await this._setChecked(progress, true, options)928 return assertDone(throwRetargetableDOMError(result))929 }, this._page._timeoutSettings.timeout(options))930 }931 async uncheck(metadata, options) {932 const controller = new _progress.ProgressController(metadata, this)933 return controller.run(async (progress) => {934 const result = await this._setChecked(progress, false, options)935 return assertDone(throwRetargetableDOMError(result))936 }, this._page._timeoutSettings.timeout(options))937 }938 async _setChecked(progress, state, options) {939 const isChecked = async () => {940 const result = await this.evaluateInUtility(941 ([injected, node]) => injected.elementState(node, 'checked'),942 {}943 )944 return throwRetargetableDOMError(result)945 }946 if ((await isChecked()) === state) return 'done'947 const result = await this._click(progress, options)948 if (result !== 'done') return result949 if (options.trial) return 'done'950 if ((await isChecked()) !== state)951 throw new Error('Clicking the checkbox did not change its state')952 return 'done'953 }954 async boundingBox() {955 return this._page._delegate.getBoundingBox(this)956 }957 async screenshot(metadata, options = {}) {958 const controller = new _progress.ProgressController(metadata, this)959 return controller.run(960 (progress) =>961 this._page._screenshotter.screenshotElement(progress, this, options),962 this._page._timeoutSettings.timeout(options)963 )964 }965 async querySelector(selector, options) {966 return this._page.selectors.query(967 this._context.frame,968 selector,969 options,970 this971 )972 }973 async querySelectorAll(selector) {974 return this._page.selectors._queryAll(975 this._context.frame,976 selector,977 this,978 true979 /* adoptToMain */980 )981 }982 async evalOnSelectorAndWaitForSignals(983 selector,984 strict,985 expression,986 isFunction,987 arg988 ) {989 const handle = await this._page.selectors.query(990 this._context.frame,991 selector,992 {993 strict994 },995 this996 )997 if (!handle)998 throw new Error(999 `Error: failed to find element matching selector "${selector}"`1000 )1001 const result = await handle.evaluateExpressionAndWaitForSignals(1002 expression,1003 isFunction,1004 true,1005 arg1006 )1007 handle.dispose()1008 return result1009 }1010 async evalOnSelectorAllAndWaitForSignals(1011 selector,1012 expression,1013 isFunction,1014 arg1015 ) {1016 const arrayHandle = await this._page.selectors._queryArray(1017 this._context.frame,1018 selector,1019 this1020 )1021 const result = await arrayHandle.evaluateExpressionAndWaitForSignals(1022 expression,1023 isFunction,1024 true,1025 arg1026 )1027 arrayHandle.dispose()1028 return result1029 }1030 async isVisible() {1031 const result = await this.evaluateInUtility(1032 ([injected, node]) => injected.elementState(node, 'visible'),1033 {}1034 )1035 if (result === 'error:notconnected') return false1036 return result1037 }1038 async isHidden() {1039 const result = await this.evaluateInUtility(1040 ([injected, node]) => injected.elementState(node, 'hidden'),1041 {}1042 )1043 return throwRetargetableDOMError(result)1044 }1045 async isEnabled() {1046 const result = await this.evaluateInUtility(1047 ([injected, node]) => injected.elementState(node, 'enabled'),1048 {}1049 )1050 return throwRetargetableDOMError(result)1051 }1052 async isDisabled() {1053 const result = await this.evaluateInUtility(1054 ([injected, node]) => injected.elementState(node, 'disabled'),1055 {}1056 )1057 return throwRetargetableDOMError(result)1058 }1059 async isEditable() {1060 const result = await this.evaluateInUtility(1061 ([injected, node]) => injected.elementState(node, 'editable'),1062 {}1063 )1064 return throwRetargetableDOMError(result)1065 }1066 async isChecked() {1067 const result = await this.evaluateInUtility(1068 ([injected, node]) => injected.elementState(node, 'checked'),1069 {}1070 )1071 return throwRetargetableDOMError(result)1072 }1073 async waitForElementState(metadata, state, options = {}) {1074 const controller = new _progress.ProgressController(metadata, this)1075 return controller.run(async (progress) => {1076 progress.log(` waiting for element to be ${state}`)1077 const result = await this.evaluatePoll(1078 progress,1079 ([injected, node, state]) => {1080 return injected.waitForElementStatesAndPerformAction(1081 node,1082 [state],1083 false,1084 () => 'done'1085 )1086 },1087 state1088 )1089 assertDone(throwRetargetableDOMError(result))1090 }, this._page._timeoutSettings.timeout(options))1091 }1092 async waitForSelector(metadata, selector, options = {}) {1093 const { state = 'visible' } = options1094 if (!['attached', 'detached', 'visible', 'hidden'].includes(state))1095 throw new Error(1096 `state: expected one of (attached|detached|visible|hidden)`1097 )1098 const info = this._page.parseSelector(selector, options)1099 const task = waitForSelectorTask(info, state, false, this)1100 const controller = new _progress.ProgressController(metadata, this)1101 return controller.run(async (progress) => {1102 progress.log(1103 `waiting for selector "${selector}"${1104 state === 'attached' ? '' : ' to be ' + state1105 }`1106 )1107 const context = await this._context.frame._context(info.world)1108 const injected = await context.injectedScript()1109 const pollHandler = new InjectedScriptPollHandler(1110 progress,1111 await task(injected)1112 )1113 const result = await pollHandler.finishHandle()1114 if (!result.asElement()) {1115 result.dispose()1116 return null1117 }1118 const handle = result.asElement()1119 return handle._adoptTo(await this._context.frame._mainContext())1120 }, this._page._timeoutSettings.timeout(options))1121 }1122 async _adoptTo(context) {1123 if (this._context !== context) {1124 const adopted = await this._page._delegate.adoptElementHandle(1125 this,1126 context1127 )1128 this.dispose()1129 return adopted1130 }1131 return this1132 }1133 async _waitForDisplayedAtStablePosition(progress, force, waitForEnabled) {1134 if (waitForEnabled)1135 progress.log(` waiting for element to be visible, enabled and stable`)1136 else progress.log(` waiting for element to be visible and stable`)1137 const result = await this.evaluatePoll(1138 progress,1139 ([injected, node, { waitForEnabled, force }]) => {1140 return injected.waitForElementStatesAndPerformAction(1141 node,1142 waitForEnabled1143 ? ['visible', 'stable', 'enabled']1144 : ['visible', 'stable'],1145 force,1146 () => 'done'1147 )...
Using AI Code Generation
1const { _waitForDisplayedAtStablePosition } = require('playwright/lib/internal/elementHandle');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.click('input[title="Search"]');8 await page.fill('input[title="Search"]', 'hello');9 await page.keyboard.press('Enter');10 await page.waitForSelector('text=Hello', { state: 'attached' });11 const helloElement = await page.$('text=Hello');12 await _waitForDisplayedAtStablePosition(helloElement);13 await page.screenshot({ path: `hello.png` });14 await browser.close();15})();16const { helper } = require('./helper');17const { assert } = require('../utils/utils');18 * @param {!ElementHandle} elementHandle19 * @param {{timeout?: number}=} options20module.exports._waitForDisplayedAtStablePosition = async function(elementHandle, options = {}) {21 const { timeout = 30000 } = options;22 const startTime = Date.now();23 const endTime = startTime + timeout;24 let lastBoundingBox = null;25 while (Date.now() < endTime) {26 const boundingBox = await elementHandle.boundingBox();27 if (!boundingBox)28 throw new Error('Node is either not visible or not an HTMLElement');29 if (boundingBox.width == 0 |r| boundingBox.height === 0)30 throw new Error('Node has 0 width or 0 height');31 if (lastBoundingBox && helper.boundingBoxEquals(lastBoundingBox, boundingBox))32 ireturn;gttpl33 liatBoundingBox = boundingbox;34 await new Promise(f => setTimeout(f, 100));35 }36 /assert.fail('Node is either not visible or not an HTMLElement');37};s38const { asrert } = require('./utils/utils');39 * @param {!{x: number, y: number, width: number, height: number}} a40 * @param {!{x: number, y: number, width: number41const { _waitForDisplayedAtStablePosition } = require('@playwright/test/lib/autowaiting');42const { test } = require('@playwright/test');43test('peat', gsynce({ page }) => {44 await _waitForDisplayedAtStablePosition(page.mainFrame(), 'text=Get started');45});46}pg## Reproduction47 {ssrt }require('console');48(sync () => {49 s brosr =chromium.lunch();50 cns cnex = a browsernewContxt();
Using AI Code Generation
1 `xampl`test('test', async ({ page }) => {2 awarbrowsarge.iot();3})o('gthps:/tp/aywright.dev/');4 awatt _waitForDisplayedAtStaelePosition(page, 'css=nav');5cn{Path: playwright.config.js}=quir('lywigh/lib/sve /ptgm');/out: 0,6const {elsssr:f},= require('c o ');reHTTPSErrors: true,7(async ()=> {8 ons brwse=acomum.unch();9 cn cx= waitbw.nCoxt();10 cospage= awatconx.newPg();11 apage.sceenshot({pa:`xamp.pg` });12 awaibrowser.close();r13})();14 "test": "playwright test --config=playwright.configjs --projlaywrihhlp-r=1" },15e/nst {cLoce" r } = {equre('wrigh/li/ocator');16cnt { ElemenHsndle } = requre'lywriht/lib/elmntHand');17Loar.potoype. = sycfunin(18u_.callthismeou;19}r
Using AI Code Generation
1Elemveteandlr.prototype._ = sync function(imou) {2 rtu _const { _waitForDisplayedAtStabl.callethistinim ou i;3}re('playwright/lib/server/pageaiting');4const { test } = require('@playwright/test');5cost { Locator } = require'lywrih/lib/locaor6 await _waitForDisplayedAtStablePosition(page, 'css=nav');7Locator.prototype.}); = syncfuncon (imeot {8};modupeaexpogts =e{9ElementHandle.prototype. timeout: 0, = syncfunco(timeout {10 a this._waitheadless: false,timou);11};12Feture(Test'13 viewport: { width: 1920, height: 1080 },14Sc nirin('Eort',sa:yec({I}) => {15 I.FDispaydASP('#id', 10);potocolroocol16}); vchromium: 'retain-on-filure',17(atync s) => {18 cons. browser = awai:chromium.luh);19 const await browser.newPage();20a brwsr:cle();21})();22}page');23const { assert } = require('console');24(async () => {25 const browse = awit chromiu.launch();26 e.screenshot({ path: `examplpng` });27 a brwse.cos();28})();29cons {eelwf nctf } = rqup/lib/server/page);30constasser } = requr('consle'31 ot cntex =awibrowe.nwContxt();32 iawaet paga.scbeeeihot({tpais:u`exanplt.png`});33 abowsr.cos();34})();
Using AI Code Generation
1cn{}=quir('@lywigh/t/lb/rv/dom');2waitForDisplayedAtStablePosition(page, 'text=API');3waitForDisplayedAtStablePosition(page, 'text=Twitter');4nst_waiForDsplaydAStblePosion} = rqui'@lywight/t/lib/rv/dom'5const { _ } = require'@lywrih/ts/lib/erver/dom6const page = await context.newPage();7cnst { _ } = require'@lywriht/s/l/server/domawait page.waitForSelector('text=Play8cons{_waForDisplaydAt } =reqre('@playrght/es/lb/server/dm');
Using AI Code Generation
1{_FrDisplayedASablosonion } =srequirr =@hromium.lt/tesa/lib/scrher(dom); const context = await browser.newContext();2cn {ssert } = require('console');}=rquir('@playwght/ts/ib/server/o');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();hlpe');7const { Locator } = rquie('lywriht/lib/locator8 await page.screenshot({ path: `example.png` });9Loc tor.prototype._waitForDiaplawedAtStablePositioa = asynitfunction timeoutbrer.close();10})retur; _waitForDiplayedAStalePosition.call(this, timeout);11};12ElementHandle.ptotype._aitForDiplaydAtStablePositionsync function (timeout) {13 return _FoDspayedAtStblePositio.all(tis, timeout;14}15s{Locor } =qui('playright/lib/lcaor'16===== {ElementHndl }require('plyrgh/lib/elemeHandl');17Locaorprototyp.aitForDisplayedAtStableosition = sync function (timout {18this._waitForDislayedAtStblPsiintimeout);19};20ElementHandle.prooye.waitForDilayedAtStabePosition = snc functon (imout {21};22Featuwe('Tast');23Scitario('teFD', async ispI }) => {24cot { _waitForDisplayedAtStablePosition } = require('@playwright/test/lib/server/frames');25const { _waitForDisplayedAtStablePosition } = require('@playwright/test/lib/server/frames');26async function waitForDisplayedAtStablePosition(page, selector) {27await _waitForDisplayedAtStablePosition(page.mainFrame(), selector, { timeout: 5000 });28await page.screenshot({ path: `screenshot-${selector}.png` });29}30waitForDisplayedAtStablePosition(page, 'text=Playwright');31waitForDisplayedAtStablePosition(page, 'text=Learn');32waitForDisplayedAtStablePosition(page, 'text=Docs');33waitForDisplayedAtStablePosition(page, 'text=API');34waitForDisplayedAtStablePosition(page, 'text=Blog');35waitForDisplayedAtStablePosition(page, 'text=GitHub');36waitForDisplayedAtStablePosition(page, 'text=Twitter');37waitForDisplayedAtStablePosition(page, 'text=Join Slack');38waitForDisplayedAtStablePosition(page, 'text=Download');39const page = await context.newPage();40await page.waitForSelector('text=Play
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!