Best JavaScript code snippet using playwright-internal
dom.js
Source:dom.js  
...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        )1148      },1149      {1150        waitForEnabled,1151        force1152      }1153    )1154    if (result === 'error:notconnected') return result1155    if (waitForEnabled) progress.log('  element is visible, enabled and stable')1156    else progress.log('  element is visible and stable')1157    return result1158  }1159  async _checkHitTargetAt(point) {1160    const frame = await this.ownerFrame()1161    if (frame && frame.parentFrame()) {1162      const element = await frame.frameElement()1163      const box = await element.boundingBox()1164      if (!box) return 'error:notconnected' // Translate from viewport coordinates to frame coordinates.1165      point = {1166        x: point.x - box.x,1167        y: point.y - box.y1168      }1169    }1170    return this.evaluateInUtility(1171      ([injected, node, point]) => injected.checkHitTargetAt(node, point),1172      point1173    )1174  }1175} // Handles an InjectedScriptPoll running in injected script:1176// - streams logs into progress;1177// - cancels the poll when progress cancels.1178exports.ElementHandle = ElementHandle1179class InjectedScriptPollHandler {1180  constructor(progress, poll) {1181    this._progress = void 01182    this._poll = void 01183    this._progress = progress1184    this._poll = poll // Ensure we cancel the poll before progress aborts and returns:1185    //   - no unnecessary work in the page;1186    //   - no possible side effects after progress promsie rejects.1187    this._progress.cleanupWhenAborted(() => this.cancel())1188    this._streamLogs()1189  }1190  async _streamLogs() {1191    while (this._poll && this._progress.isRunning()) {1192      const log = await this._poll1193        .evaluate((poll) => poll.takeNextLogs())1194        .catch((e) => [])1195      if (!this._poll || !this._progress.isRunning()) return1196      for (const entry of log) this._progress.logEntry(entry)1197    }1198  }1199  async finishHandle() {1200    try {1201      const result = await this._poll.evaluateHandle((poll) => poll.run())1202      await this._finishInternal()1203      return result1204    } finally {1205      await this.cancel()1206    }1207  }1208  async finish() {1209    try {1210      const result = await this._poll.evaluate((poll) => poll.run())1211      await this._finishInternal()1212      return result1213    } finally {1214      await this.cancel()1215    }1216  }1217  async _finishInternal() {1218    if (!this._poll) return // Retrieve all the logs before continuing.1219    const log = await this._poll1220      .evaluate((poll) => poll.takeLastLogs())1221      .catch((e) => [])1222    for (const entry of log) this._progress.logEntry(entry)1223  }1224  async cancel() {1225    if (!this._poll) return1226    const copy = this._poll1227    this._poll = null1228    await copy.evaluate((p) => p.cancel()).catch((e) => {})1229    copy.dispose()1230  }1231}1232exports.InjectedScriptPollHandler = InjectedScriptPollHandler1233function throwRetargetableDOMError(result) {1234  if (result === 'error:notconnected')1235    throw new Error('Element is not attached to the DOM')1236  return result1237}1238function assertDone(result) {1239  // This function converts 'done' to void and ensures typescript catches unhandled errors.1240}1241function roundPoint(point) {1242  return {1243    x: ((point.x * 100) | 0) / 100,1244    y: ((point.y * 100) | 0) / 1001245  }1246}1247function compensateHalfIntegerRoundingError(point) {1248  // Firefox internally uses integer coordinates, so 8.5 is converted to 9 when clicking.1249  //1250  // This does not work nicely for small elements. For example, 1x1 square with corners1251  // (8;8) and (9;9) is targeted when clicking at (8;8) but not when clicking at (9;9).1252  // So, clicking at (8.5;8.5) will effectively click at (9;9) and miss the target.1253  //1254  // Therefore, we skew half-integer values from the interval (8.49, 8.51) towards1255  // (8.47, 8.49) that is rounded towards 8. This means clicking at (8.5;8.5) will1256  // be replaced with (8.48;8.48) and will effectively click at (8;8).1257  //1258  // Other browsers use float coordinates, so this change should not matter.1259  const remainderX = point.x - Math.floor(point.x)1260  if (remainderX > 0.49 && remainderX < 0.51) point.x -= 0.021261  const remainderY = point.y - Math.floor(point.y)...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.screenshot({ path: `example.png` });6  await browser.close();7})();8const { chromium } = require('playwright');9(async () => {10  const browser = await chromium.launch();11  const page = await browser.newPage();12  await page._client.send('Emulation.setDeviceMetricsOverride', {13  });14  await page.screenshot({ path: `example.png` });15  await browser.close();16})();Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.screenshot({ path: 'google.png' });6  await browser.close();7})();8const {chromium} = require('playwright');9(async () => {10  const browser = await chromium.launch();11  const page = await browser.newPage();12  await page.screenshot({ path: 'google.png' });13  await browser.close();14})();15at Object.error (/home/ajay/Downloads/playwright-test/node_modules/playwright/lib/utils/transport.js:185:15)16at Transport._dispatchMessage (/home/ajay/Downloads/playwright-test/node_modules/playwright/lib/utils/transport.js:122:25)17at WebSocketTransport._dispatchBuffer (/home/ajay/Downloads/playwright-test/node_modules/playwright/lib/utils/transport.js:407:17)18at WebSocketTransport._onWebSocketMessage (/home/ajay/Downloads/playwright-test/node_modules/playwright/lib/utils/transport.js:358:14)19at WebSocket.onMessage (/home/ajay/Downloads/playwright-test/node_modules/ws/lib/event-target.js:120:16)20at WebSocket.emit (events.js:315:20)21at Receiver.receiverOnMessage (/home/ajay/Downloads/playwright-test/node_modules/ws/lib/websocket.js:789:20)22at Receiver.emit (events.js:315:20)23at Receiver.dataMessage (/home/ajay/Downloads/playwright-test/node_modules/ws/lib/receiver.js:422:14)24at Receiver.getData (/home/ajay/Downloads/playwright-test/node_modules/ws/lib/receiver.js:352:17)Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  await context.addInitScript(() => {6    window.compensateHalfIntegerRoundingError = (x, y) => {7      return { x: Math.round(x), y: Math.round(y) };8    };9  });10  const page = await context.newPage();11  await page.screenshot({ path: 'example.png' });12  await browser.close();13})();14const puppeteer = require('puppeteer');15(async () => {16  const browser = await puppeteer.launch();17  const page = await browser.newPage();18  await page.screenshot({ path: 'example.png' });19  await browser.close();20})();Using AI Code Generation
1const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');2const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');3const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');4const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');5const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');6const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');7const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');8const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');9const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');10const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');11const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');12const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');13const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');14const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');15const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');Using AI Code Generation
1const playwright = require('playwright');2const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils');3(async () => {4  const browser = await playwright.chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  await page.click('text=Images');8  const element = await page.$('text=Images');9  const boundingBox = await element.boundingBox();10  const {x, y, width, height} = compensateHalfIntegerRoundingError(boundingBox);11  await page.mouse.move(x + width / 2, y + height / 2);12  await page.mouse.down();13  await page.mouse.move(x + width / 2, y + height / 2 + 100);14  await page.mouse.up();15  await browser.close();16})();17[Playwright] Compensating for half-integer rounding error in bounding box: {"x":0,"y":0,"width":0.5,"height":0.5}18[Playwright] Compensating for half-integer rounding error in bounding box: {"x":0,"y":0,"width":0.5,"height":0.5}Using AI Code Generation
1import {compensateHalfIntegerRoundingError} from 'playwright';2const {x, y} = compensateHalfIntegerRoundingError(50.5, 50.5);3console.log(x, y);4const {x, y} = compensateHalfIntegerRoundingError(50.4, 50.4);5console.log(x, y);6const {x, y} = compensateHalfIntegerRoundingError(50.1, 50.1);7console.log(x, y);8const {x, y} = compensateHalfIntegerRoundingError(50.6, 50.6);9console.log(x, y);10const {x, y} = compensateHalfIntegerRoundingError(50.9, 50.9);11console.log(x, y);12const {x, y} = compensateHalfIntegerRoundingError(0.5, 0.5);13console.log(x, y);14const {x, y} = compensateHalfIntegerRoundingError(0.4, 0.4);15console.log(x, y);16const {x, y} = compensateHalfIntegerRoundingError(0.1, 0.1);17console.log(x, y);18const {x, y} = compensateHalfIntegerRoundingError(0.6, 0.6);19console.log(x, y);20const {x, y} = compensateHalfIntegerRoundingError(0.9, 0.9);21console.log(x, y);22const {x, y} = compensateHalfIntegerRoundingError(-0.5, -0.5);23console.log(x, y);24const {x, y} = compensateHalfIntegerRoundingError(-0.4, -0.4);25console.log(x, y);Using AI Code Generation
1const {chromium} = require('playwright-chromium');2const path = require('path');3const fs = require('fs');4const {compensateHalfIntegerRoundingError} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');5(async () => {6  const browser = await chromium.launch();7  const context = await browser.newContext();8  const page = await context.newPage();9  const element = await page.$('input[name="q"]');10  const boundingBox = await element.boundingBox();11  const {x, y} = compensateHalfIntegerRoundingError(boundingBox);12  await page.mouse.move(x, y);13  await page.mouse.down();14  await page.mouse.up();15  await browser.close();16})();Using AI Code Generation
1const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');2const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');3const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');4const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');5const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');6const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');7const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');8const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');9const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');10const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');11const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');12const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');13const {compensateHalfIntegerRoundingError} = require('playwright/lib/utils/math');14const {compensateHalfIntegerRoundingError} = require('playwrightUsing AI Code Generation
1const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');2const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');3const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');4const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');5const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');6const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');7const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');8const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');9const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');10const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');11const { compensateHalfIntegerRoundingError } = require('playwright/lib/internal/utils');12const { compensateHalfIntegerRoundingError } = require('playwright/lib/internalLambdaTest’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!!
