Best JavaScript code snippet using playwright-internal
wkPage.js
Source:wkPage.js  
...109    }));110    promises.push(this._updateViewport());111    promises.push(this.updateHttpCredentials());112    if (this._browserContext._permissions.size) {113      for (const [key, value] of this._browserContext._permissions) promises.push(this._grantPermissions(key, value));114    }115    if (this._browserContext._options.recordVideo) {116      const outputFile = _path.default.join(this._browserContext._options.recordVideo.dir, (0, _utils.createGuid)() + '.webm');117      promises.push(this._browserContext._ensureVideosPath().then(() => {118        return this._startVideo({ // validateBrowserContextOptions ensures correct video size.119          ...this._browserContext._options.recordVideo.size,120          outputFile121        });122      }));123    }124    await Promise.all(promises);125  }126  _setSession(session) {127    _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);128    this._session = session;129    this.rawKeyboard.setSession(session);130    this.rawMouse.setSession(session);131    this._addSessionListeners();132    this._workers.setSession(session);133  } // This method is called for provisional targets as well. The session passed as the parameter134  // may be different from the current session and may be destroyed without becoming current.135  async _initializeSession(session, provisional, resourceTreeHandler) {136    await this._initializeSessionMayThrow(session, resourceTreeHandler).catch(e => {137      // Provisional session can be disposed at any time, for example due to new navigation initiating138      // a new provisional page.139      if (provisional && session.isDisposed()) return; // Swallow initialization errors due to newer target swap in,140      // since we will reinitialize again.141      if (this._session === session) throw e;142    });143  }144  async _initializeSessionMayThrow(session, resourceTreeHandler) {145    const [, frameTree] = await Promise.all([// Page agent must be enabled before Runtime.146    session.send('Page.enable'), session.send('Page.getResourceTree')]);147    resourceTreeHandler(frameTree);148    const promises = [// Resource tree should be received before first execution context.149    session.send('Runtime.enable'), session.send('Page.createUserWorld', {150      name: UTILITY_WORLD_NAME151    }).catch(_ => {}), // Worlds are per-process152    session.send('Console.enable'), session.send('Network.enable'), this._workers.initializeSession(session)];153    if (this._page._needsRequestInterception()) {154      promises.push(session.send('Network.setInterceptionEnabled', {155        enabled: true156      }));157      promises.push(session.send('Network.addInterception', {158        url: '.*',159        stage: 'request',160        isRegex: true161      }));162    }163    const contextOptions = this._browserContext._options;164    if (contextOptions.userAgent) promises.push(session.send('Page.overrideUserAgent', {165      value: contextOptions.userAgent166    }));167    if (this._page._state.mediaType || this._page._state.colorScheme || this._page._state.reducedMotion) promises.push(WKPage._setEmulateMedia(session, this._page._state.mediaType, this._page._state.colorScheme, this._page._state.reducedMotion));168    const bootstrapScript = this._calculateBootstrapScript();169    if (bootstrapScript.length) promises.push(session.send('Page.setBootstrapScript', {170      source: bootstrapScript171    }));172    this._page.frames().map(frame => frame.evaluateExpression(bootstrapScript, false, undefined).catch(e => {}));173    if (contextOptions.bypassCSP) promises.push(session.send('Page.setBypassCSP', {174      enabled: true175    }));176    if (this._page._state.emulatedSize) {177      promises.push(session.send('Page.setScreenSizeOverride', {178        width: this._page._state.emulatedSize.screen.width,179        height: this._page._state.emulatedSize.screen.height180      }));181    }182    promises.push(this.updateEmulateMedia());183    promises.push(session.send('Network.setExtraHTTPHeaders', {184      headers: (0, _utils.headersArrayToObject)(this._calculateExtraHTTPHeaders(), false185      /* lowerCase */186      )187    }));188    if (contextOptions.offline) promises.push(session.send('Network.setEmulateOfflineState', {189      offline: true190    }));191    promises.push(session.send('Page.setTouchEmulationEnabled', {192      enabled: !!contextOptions.hasTouch193    }));194    if (contextOptions.timezoneId) {195      promises.push(session.send('Page.setTimeZone', {196        timeZone: contextOptions.timezoneId197      }).catch(e => {198        throw new Error(`Invalid timezone ID: ${contextOptions.timezoneId}`);199      }));200    }201    promises.push(session.send('Page.overrideSetting', {202      setting: 'DeviceOrientationEventEnabled',203      value: contextOptions.isMobile204    }));205    promises.push(session.send('Page.overrideSetting', {206      setting: 'FullScreenEnabled',207      value: !contextOptions.isMobile208    }));209    promises.push(session.send('Page.overrideSetting', {210      setting: 'NotificationsEnabled',211      value: !contextOptions.isMobile212    }));213    promises.push(session.send('Page.overrideSetting', {214      setting: 'PointerLockEnabled',215      value: !contextOptions.isMobile216    }));217    promises.push(session.send('Page.overrideSetting', {218      setting: 'InputTypeMonthEnabled',219      value: contextOptions.isMobile220    }));221    promises.push(session.send('Page.overrideSetting', {222      setting: 'InputTypeWeekEnabled',223      value: contextOptions.isMobile224    }));225    await Promise.all(promises);226  }227  _onDidCommitProvisionalTarget(event) {228    const {229      oldTargetId,230      newTargetId231    } = event;232    (0, _utils.assert)(this._provisionalPage);233    (0, _utils.assert)(this._provisionalPage._session.sessionId === newTargetId, 'Unknown new target: ' + newTargetId);234    (0, _utils.assert)(this._session.sessionId === oldTargetId, 'Unknown old target: ' + oldTargetId);235    const newSession = this._provisionalPage._session;236    this._provisionalPage.commit();237    this._provisionalPage.dispose();238    this._provisionalPage = null;239    this._setSession(newSession);240  }241  _onTargetDestroyed(event) {242    const {243      targetId,244      crashed245    } = event;246    if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) {247      this._provisionalPage._session.dispose(false);248      this._provisionalPage.dispose();249      this._provisionalPage = null;250    } else if (this._session.sessionId === targetId) {251      this._session.dispose(false);252      _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);253      if (crashed) {254        this._session.markAsCrashed();255        this._page._didCrash();256      }257    }258  }259  didClose() {260    this._page._didClose();261  }262  dispose(disconnected) {263    this._pageProxySession.dispose(disconnected);264    _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);265    _eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);266    if (this._session) this._session.dispose(disconnected);267    if (this._provisionalPage) {268      this._provisionalPage._session.dispose(disconnected);269      this._provisionalPage.dispose();270      this._provisionalPage = null;271    }272    this._page._didDisconnect();273    this._firstNonInitialNavigationCommittedReject(new Error('Page closed'));274  }275  dispatchMessageToSession(message) {276    this._pageProxySession.dispatchMessage(message);277  }278  handleProvisionalLoadFailed(event) {279    if (!this._initializedPage) {280      this._firstNonInitialNavigationCommittedReject(new Error('Initial load failed'));281      return;282    }283    if (!this._provisionalPage) return;284    let errorText = event.error;285    if (errorText.includes('cancelled')) errorText += '; maybe frame was detached?';286    this._page._frameManager.frameAbortedNavigation(this._page.mainFrame()._id, errorText, event.loaderId);287  }288  handleWindowOpen(event) {289    (0, _utils.debugAssert)(!this._nextWindowOpenPopupFeatures);290    this._nextWindowOpenPopupFeatures = event.windowFeatures;291  }292  async pageOrError() {293    return this._pagePromise;294  }295  async _onTargetCreated(event) {296    const {297      targetInfo298    } = event;299    const session = new _wkConnection.WKSession(this._pageProxySession.connection, targetInfo.targetId, `Target closed`, message => {300      this._pageProxySession.send('Target.sendMessageToTarget', {301        message: JSON.stringify(message),302        targetId: targetInfo.targetId303      }).catch(e => {304        session.dispatchMessage({305          id: message.id,306          error: {307            message: e.message308          }309        });310      });311    });312    (0, _utils.assert)(targetInfo.type === 'page', 'Only page targets are expected in WebKit, received: ' + targetInfo.type);313    if (!targetInfo.isProvisional) {314      (0, _utils.assert)(!this._initializedPage);315      let pageOrError;316      try {317        this._setSession(session);318        await Promise.all([this._initializePageProxySession(), this._initializeSession(session, false, ({319          frameTree320        }) => this._handleFrameTree(frameTree))]);321        pageOrError = this._page;322      } catch (e) {323        pageOrError = e;324      }325      if (targetInfo.isPaused) this._pageProxySession.sendMayFail('Target.resume', {326        targetId: targetInfo.targetId327      });328      if (pageOrError instanceof _page.Page && this._page.mainFrame().url() === '') {329        try {330          // Initial empty page has an empty url. We should wait until the first real url has been loaded,331          // even if that url is about:blank. This is especially important for popups, where we need the332          // actual url before interacting with it.333          await this._firstNonInitialNavigationCommittedPromise;334        } catch (e) {335          pageOrError = e;336        }337      } else {338        // Avoid rejection on disconnect.339        this._firstNonInitialNavigationCommittedPromise.catch(() => {});340      }341      await this._page.initOpener(this._opener); // Note: it is important to call |reportAsNew| before resolving pageOrError promise,342      // so that anyone who awaits pageOrError got a ready and reported page.343      this._initializedPage = pageOrError instanceof _page.Page ? pageOrError : null;344      this._page.reportAsNew(pageOrError instanceof _page.Page ? undefined : pageOrError);345      this._pagePromise.resolve(pageOrError);346    } else {347      (0, _utils.assert)(targetInfo.isProvisional);348      (0, _utils.assert)(!this._provisionalPage);349      this._provisionalPage = new _wkProvisionalPage.WKProvisionalPage(session, this);350      if (targetInfo.isPaused) {351        this._provisionalPage.initializationPromise.then(() => {352          this._pageProxySession.sendMayFail('Target.resume', {353            targetId: targetInfo.targetId354          });355        });356      }357    }358  }359  _onDispatchMessageFromTarget(event) {360    const {361      targetId,362      message363    } = event;364    if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) this._provisionalPage._session.dispatchMessage(JSON.parse(message));else if (this._session.sessionId === targetId) this._session.dispatchMessage(JSON.parse(message));else throw new Error('Unknown target: ' + targetId);365  }366  _addSessionListeners() {367    // TODO: remove Page.willRequestOpenWindow and Page.didRequestOpenWindow from the protocol.368    this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameNavigated', event => this._onFrameNavigated(event.frame, false)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.navigatedWithinDocument', event => this._onFrameNavigatedWithinDocument(event.frameId, event.url)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameAttached', event => this._onFrameAttached(event.frameId, event.parentFrameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameDetached', event => this._onFrameDetached(event.frameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameScheduledNavigation', event => this._onFrameScheduledNavigation(event.frameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameStoppedLoading', event => this._onFrameStoppedLoading(event.frameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.loadEventFired', event => this._onLifecycleEvent(event.frameId, 'load')), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.domContentEventFired', event => this._onLifecycleEvent(event.frameId, 'domcontentloaded')), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Console.messageAdded', event => this._onConsoleMessage(event)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Console.messageRepeatCountUpdated', event => this._onConsoleRepeatCountUpdated(event)), _eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Dialog.javascriptDialogOpening', event => this._onDialog(event)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.fileChooserOpened', event => this._onFileChooserOpened(event)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.requestWillBeSent', e => this._onRequestWillBeSent(this._session, e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.requestIntercepted', e => this._onRequestIntercepted(this._session, e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.responseReceived', e => this._onResponseReceived(e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.loadingFinished', e => this._onLoadingFinished(e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.loadingFailed', e => this._onLoadingFailed(e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketCreated', e => this._page._frameManager.onWebSocketCreated(e.requestId, e.url)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketWillSendHandshakeRequest', e => this._page._frameManager.onWebSocketRequest(e.requestId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketHandshakeResponseReceived', e => this._page._frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketFrameSent', e => e.response.payloadData && this._page._frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketFrameReceived', e => e.response.payloadData && this._page._frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketClosed', e => this._page._frameManager.webSocketClosed(e.requestId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketFrameError', e => this._page._frameManager.webSocketError(e.requestId, e.errorMessage))];369  }370  async _updateState(method, params) {371    await this._forAllSessions(session => session.send(method, params).then());372  }373  async _forAllSessions(callback) {374    const sessions = [this._session]; // If the state changes during provisional load, push it to the provisional page375    // as well to always be in sync with the backend.376    if (this._provisionalPage) sessions.push(this._provisionalPage._session);377    await Promise.all(sessions.map(session => callback(session).catch(e => {})));378  }379  _onFrameScheduledNavigation(frameId) {380    this._page._frameManager.frameRequestedNavigation(frameId);381  }382  _onFrameStoppedLoading(frameId) {383    this._page._frameManager.frameStoppedLoading(frameId);384  }385  _onLifecycleEvent(frameId, event) {386    this._page._frameManager.frameLifecycleEvent(frameId, event);387  }388  _handleFrameTree(frameTree) {389    this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null);390    this._onFrameNavigated(frameTree.frame, true);391    this._page._frameManager.frameLifecycleEvent(frameTree.frame.id, 'domcontentloaded');392    this._page._frameManager.frameLifecycleEvent(frameTree.frame.id, 'load');393    if (!frameTree.childFrames) return;394    for (const child of frameTree.childFrames) this._handleFrameTree(child);395  }396  _onFrameAttached(frameId, parentFrameId) {397    return this._page._frameManager.frameAttached(frameId, parentFrameId);398  }399  _onFrameNavigated(framePayload, initial) {400    const frame = this._page._frameManager.frame(framePayload.id);401    (0, _utils.assert)(frame);402    this._removeContextsForFrame(frame, true);403    if (!framePayload.parentId) this._workers.clear();404    this._page._frameManager.frameCommittedNewDocumentNavigation(framePayload.id, framePayload.url, framePayload.name || '', framePayload.loaderId, initial);405    if (!initial) this._firstNonInitialNavigationCommittedFulfill();406  }407  _onFrameNavigatedWithinDocument(frameId, url) {408    this._page._frameManager.frameCommittedSameDocumentNavigation(frameId, url);409  }410  _onFrameDetached(frameId) {411    this._page._frameManager.frameDetached(frameId);412  }413  _removeContextsForFrame(frame, notifyFrame) {414    for (const [contextId, context] of this._contextIdToContext) {415      if (context.frame === frame) {416        this._contextIdToContext.delete(contextId);417        if (notifyFrame) frame._contextDestroyed(context);418      }419    }420  }421  _onExecutionContextCreated(contextPayload) {422    if (this._contextIdToContext.has(contextPayload.id)) return;423    const frame = this._page._frameManager.frame(contextPayload.frameId);424    if (!frame) return;425    const delegate = new _wkExecutionContext.WKExecutionContext(this._session, contextPayload.id);426    let worldName = null;427    if (contextPayload.type === 'normal') worldName = 'main';else if (contextPayload.type === 'user' && contextPayload.name === UTILITY_WORLD_NAME) worldName = 'utility';428    const context = new dom.FrameExecutionContext(delegate, frame, worldName);429    context[contextDelegateSymbol] = delegate;430    if (worldName) frame._contextCreated(worldName, context);431    if (contextPayload.type === 'normal' && frame === this._page.mainFrame()) this._mainFrameContextId = contextPayload.id;432    this._contextIdToContext.set(contextPayload.id, context);433  }434  async navigateFrame(frame, url, referrer) {435    if (this._pageProxySession.isDisposed()) throw new Error('Target closed');436    const pageProxyId = this._pageProxySession.sessionId;437    const result = await this._pageProxySession.connection.browserSession.send('Playwright.navigate', {438      url,439      pageProxyId,440      frameId: frame._id,441      referrer442    });443    return {444      newDocumentId: result.loaderId445    };446  }447  _onConsoleMessage(event) {448    // Note: do no introduce await in this function, otherwise we lose the ordering.449    // For example, frame.setContent relies on this.450    const {451      type,452      level,453      text,454      parameters,455      url,456      line: lineNumber,457      column: columnNumber,458      source459    } = event.message;460    if (level === 'debug' && parameters && parameters[0].value === BINDING_CALL_MESSAGE) {461      const parsedObjectId = JSON.parse(parameters[1].objectId);462      this.pageOrError().then(pageOrError => {463        const context = this._contextIdToContext.get(parsedObjectId.injectedScriptId);464        if (!(pageOrError instanceof Error) && context) this._page._onBindingCalled(parameters[2].value, context);465      });466      return;467    }468    if (level === 'error' && source === 'javascript') {469      const {470        name,471        message472      } = (0, _stackTrace.splitErrorMessage)(text);473      let stack;474      if (event.message.stackTrace) {475        stack = text + '\n' + event.message.stackTrace.map(callFrame => {476          return `    at ${callFrame.functionName || 'unknown'} (${callFrame.url}:${callFrame.lineNumber}:${callFrame.columnNumber})`;477        }).join('\n');478      } else {479        stack = '';480      }481      const error = new Error(message);482      error.stack = stack;483      error.name = name;484      this._page.firePageError(error);485      return;486    }487    let derivedType = type || '';488    if (type === 'log') derivedType = level;else if (type === 'timing') derivedType = 'timeEnd';489    const handles = [];490    for (const p of parameters || []) {491      let context;492      if (p.objectId) {493        const objectId = JSON.parse(p.objectId);494        context = this._contextIdToContext.get(objectId.injectedScriptId);495      } else {496        context = this._contextIdToContext.get(this._mainFrameContextId);497      }498      if (!context) return;499      handles.push(context.createHandle(p));500    }501    this._lastConsoleMessage = {502      derivedType,503      text,504      handles,505      count: 0,506      location: {507        url: url || '',508        lineNumber: (lineNumber || 1) - 1,509        columnNumber: (columnNumber || 1) - 1510      }511    };512    this._onConsoleRepeatCountUpdated({513      count: 1514    });515  }516  _onConsoleRepeatCountUpdated(event) {517    if (this._lastConsoleMessage) {518      const {519        derivedType,520        text,521        handles,522        count,523        location524      } = this._lastConsoleMessage;525      for (let i = count; i < event.count; ++i) this._page._addConsoleMessage(derivedType, handles, location, handles.length ? undefined : text);526      this._lastConsoleMessage.count = event.count;527    }528  }529  _onDialog(event) {530    this._page.emit(_page.Page.Events.Dialog, new dialog.Dialog(this._page, event.type, event.message, async (accept, promptText) => {531      await this._pageProxySession.send('Dialog.handleJavaScriptDialog', {532        accept,533        promptText534      });535    }, event.defaultPrompt));536  }537  async _onFileChooserOpened(event) {538    let handle;539    try {540      const context = await this._page._frameManager.frame(event.frameId)._mainContext();541      handle = context.createHandle(event.element).asElement();542    } catch (e) {543      // During async processing, frame/context may go away. We should not throw.544      return;545    }546    await this._page._onFileChooserOpened(handle);547  }548  static async _setEmulateMedia(session, mediaType, colorScheme, reducedMotion) {549    const promises = [];550    promises.push(session.send('Page.setEmulatedMedia', {551      media: mediaType || ''552    }));553    let appearance = undefined;554    switch (colorScheme) {555      case 'light':556        appearance = 'Light';557        break;558      case 'dark':559        appearance = 'Dark';560        break;561    }562    promises.push(session.send('Page.setForcedAppearance', {563      appearance564    }));565    let reducedMotionWk = undefined;566    switch (reducedMotion) {567      case 'reduce':568        reducedMotionWk = 'Reduce';569        break;570      case 'no-preference':571        reducedMotionWk = 'NoPreference';572        break;573    }574    promises.push(session.send('Page.setForcedReducedMotion', {575      reducedMotion: reducedMotionWk576    }));577    await Promise.all(promises);578  }579  async updateExtraHTTPHeaders() {580    await this._updateState('Network.setExtraHTTPHeaders', {581      headers: (0, _utils.headersArrayToObject)(this._calculateExtraHTTPHeaders(), false582      /* lowerCase */583      )584    });585  }586  _calculateExtraHTTPHeaders() {587    const locale = this._browserContext._options.locale;588    const headers = network.mergeHeaders([this._browserContext._options.extraHTTPHeaders, this._page._state.extraHTTPHeaders, locale ? network.singleHeader('Accept-Language', locale) : undefined]);589    return headers;590  }591  async updateEmulateMedia() {592    const colorScheme = this._page._state.colorScheme;593    const reducedMotion = this._page._state.reducedMotion;594    await this._forAllSessions(session => WKPage._setEmulateMedia(session, this._page._state.mediaType, colorScheme, reducedMotion));595  }596  async setEmulatedSize(emulatedSize) {597    (0, _utils.assert)(this._page._state.emulatedSize === emulatedSize);598    await this._updateViewport();599  }600  async bringToFront() {601    this._pageProxySession.send('Target.activate', {602      targetId: this._session.sessionId603    });604  }605  async _updateViewport() {606    const options = this._browserContext._options;607    const deviceSize = this._page._state.emulatedSize;608    if (deviceSize === null) return;609    const viewportSize = deviceSize.viewport;610    const screenSize = deviceSize.screen;611    const promises = [this._pageProxySession.send('Emulation.setDeviceMetricsOverride', {612      width: viewportSize.width,613      height: viewportSize.height,614      fixedLayout: !!options.isMobile,615      deviceScaleFactor: options.deviceScaleFactor || 1616    }), this._session.send('Page.setScreenSizeOverride', {617      width: screenSize.width,618      height: screenSize.height619    })];620    if (options.isMobile) {621      const angle = viewportSize.width > viewportSize.height ? 90 : 0;622      promises.push(this._session.send('Page.setOrientationOverride', {623        angle624      }));625    }626    await Promise.all(promises);627  }628  async updateRequestInterception() {629    const enabled = this._page._needsRequestInterception();630    await Promise.all([this._updateState('Network.setInterceptionEnabled', {631      enabled632    }), this._updateState('Network.addInterception', {633      url: '.*',634      stage: 'request',635      isRegex: true636    })]);637  }638  async updateOffline() {639    await this._updateState('Network.setEmulateOfflineState', {640      offline: !!this._browserContext._options.offline641    });642  }643  async updateHttpCredentials() {644    const credentials = this._browserContext._options.httpCredentials || {645      username: '',646      password: ''647    };648    await this._pageProxySession.send('Emulation.setAuthCredentials', {649      username: credentials.username,650      password: credentials.password651    });652  }653  async setFileChooserIntercepted(enabled) {654    await this._session.send('Page.setInterceptFileChooserDialog', {655      enabled656    }).catch(e => {}); // target can be closed.657  }658  async reload() {659    await this._session.send('Page.reload');660  }661  goBack() {662    return this._session.send('Page.goBack').then(() => true).catch(error => {663      if (error instanceof Error && error.message.includes(`Protocol error (Page.goBack): Failed to go`)) return false;664      throw error;665    });666  }667  goForward() {668    return this._session.send('Page.goForward').then(() => true).catch(error => {669      if (error instanceof Error && error.message.includes(`Protocol error (Page.goForward): Failed to go`)) return false;670      throw error;671    });672  }673  async exposeBinding(binding) {674    await this._updateBootstrapScript();675    await this._evaluateBindingScript(binding);676  }677  async _evaluateBindingScript(binding) {678    const script = this._bindingToScript(binding);679    await Promise.all(this._page.frames().map(frame => frame.evaluateExpression(script, false, {}).catch(e => {})));680  }681  async evaluateOnNewDocument(script) {682    await this._updateBootstrapScript();683  }684  _bindingToScript(binding) {685    return `self.${binding.name} = (param) => console.debug('${BINDING_CALL_MESSAGE}', {}, param); ${binding.source}`;686  }687  _calculateBootstrapScript() {688    const scripts = [];689    if (!this._page.context()._options.isMobile) {690      scripts.push('delete window.orientation');691      scripts.push('delete window.ondevicemotion');692      scripts.push('delete window.ondeviceorientation');693    }694    for (const binding of this._page.allBindings()) scripts.push(this._bindingToScript(binding));695    scripts.push(...this._browserContext._evaluateOnNewDocumentSources);696    scripts.push(...this._page._evaluateOnNewDocumentSources);697    return scripts.join(';');698  }699  async _updateBootstrapScript() {700    await this._updateState('Page.setBootstrapScript', {701      source: this._calculateBootstrapScript()702    });703  }704  async closePage(runBeforeUnload) {705    await this._stopVideo();706    await this._pageProxySession.sendMayFail('Target.close', {707      targetId: this._session.sessionId,708      runBeforeUnload709    });710  }711  async setBackgroundColor(color) {712    await this._session.send('Page.setDefaultBackgroundColorOverride', {713      color714    });715  }716  _toolbarHeight() {717    var _this$_page$_browserC;718    if ((_this$_page$_browserC = this._page._browserContext._browser) !== null && _this$_page$_browserC !== void 0 && _this$_page$_browserC.options.headful) return _utils.hostPlatform === 'mac10.15' ? 55 : 59;719    return 0;720  }721  async _startVideo(options) {722    (0, _utils.assert)(!this._recordingVideoFile);723    const {724      screencastId725    } = await this._pageProxySession.send('Screencast.startVideo', {726      file: options.outputFile,727      width: options.width,728      height: options.height,729      toolbarHeight: this._toolbarHeight()730    });731    this._recordingVideoFile = options.outputFile;732    this._browserContext._browser._videoStarted(this._browserContext, screencastId, options.outputFile, this.pageOrError());733  }734  async _stopVideo() {735    if (!this._recordingVideoFile) return;736    await this._pageProxySession.sendMayFail('Screencast.stopVideo');737    this._recordingVideoFile = null;738  }739  async takeScreenshot(progress, format, documentRect, viewportRect, quality) {740    const rect = documentRect || viewportRect;741    const result = await this._session.send('Page.snapshotRect', { ...rect,742      coordinateSystem: documentRect ? 'Page' : 'Viewport'743    });744    const prefix = 'data:image/png;base64,';745    let buffer = Buffer.from(result.dataURL.substr(prefix.length), 'base64');746    if (format === 'jpeg') buffer = jpeg.encode(png.PNG.sync.read(buffer), quality).data;747    return buffer;748  }749  async getContentFrame(handle) {750    const nodeInfo = await this._session.send('DOM.describeNode', {751      objectId: handle._objectId752    });753    if (!nodeInfo.contentFrameId) return null;754    return this._page._frameManager.frame(nodeInfo.contentFrameId);755  }756  async getOwnerFrame(handle) {757    if (!handle._objectId) return null;758    const nodeInfo = await this._session.send('DOM.describeNode', {759      objectId: handle._objectId760    });761    return nodeInfo.ownerFrameId || null;762  }763  isElementHandle(remoteObject) {764    return remoteObject.subtype === 'node';765  }766  async getBoundingBox(handle) {767    const quads = await this.getContentQuads(handle);768    if (!quads || !quads.length) return null;769    let minX = Infinity;770    let maxX = -Infinity;771    let minY = Infinity;772    let maxY = -Infinity;773    for (const quad of quads) {774      for (const point of quad) {775        minX = Math.min(minX, point.x);776        maxX = Math.max(maxX, point.x);777        minY = Math.min(minY, point.y);778        maxY = Math.max(maxY, point.y);779      }780    }781    return {782      x: minX,783      y: minY,784      width: maxX - minX,785      height: maxY - minY786    };787  }788  async scrollRectIntoViewIfNeeded(handle, rect) {789    return await this._session.send('DOM.scrollIntoViewIfNeeded', {790      objectId: handle._objectId,791      rect792    }).then(() => 'done').catch(e => {793      if (e instanceof Error && e.message.includes('Node does not have a layout object')) return 'error:notvisible';794      if (e instanceof Error && e.message.includes('Node is detached from document')) return 'error:notconnected';795      throw e;796    });797  }798  async setScreencastOptions(options) {799    if (options) {800      const so = { ...options,801        toolbarHeight: this._toolbarHeight()802      };803      const {804        generation805      } = await this._pageProxySession.send('Screencast.startScreencast', so);806      this._screencastGeneration = generation;807    } else {808      await this._pageProxySession.send('Screencast.stopScreencast');809    }810  }811  _onScreencastFrame(event) {812    const generation = this._screencastGeneration;813    this._page.throttleScreencastFrameAck(() => {814      this._pageProxySession.send('Screencast.screencastFrameAck', {815        generation816      }).catch(e => _debugLogger.debugLogger.log('error', e));817    });818    const buffer = Buffer.from(event.data, 'base64');819    this._page.emit(_page.Page.Events.ScreencastFrame, {820      buffer,821      width: event.deviceWidth,822      height: event.deviceHeight823    });824  }825  rafCountForStablePosition() {826    return process.platform === 'win32' ? 5 : 1;827  }828  async getContentQuads(handle) {829    const result = await this._session.sendMayFail('DOM.getContentQuads', {830      objectId: handle._objectId831    });832    if (!result) return null;833    return result.quads.map(quad => [{834      x: quad[0],835      y: quad[1]836    }, {837      x: quad[2],838      y: quad[3]839    }, {840      x: quad[4],841      y: quad[5]842    }, {843      x: quad[6],844      y: quad[7]845    }]);846  }847  async setInputFiles(handle, files) {848    const objectId = handle._objectId;849    const protocolFiles = files.map(file => ({850      name: file.name,851      type: file.mimeType,852      data: file.buffer853    }));854    await this._session.send('DOM.setInputFiles', {855      objectId,856      files: protocolFiles857    });858  }859  async adoptElementHandle(handle, to) {860    const result = await this._session.sendMayFail('DOM.resolveNode', {861      objectId: handle._objectId,862      executionContextId: to[contextDelegateSymbol]._contextId863    });864    if (!result || result.object.subtype === 'null') throw new Error(dom.kUnableToAdoptErrorMessage);865    return to.createHandle(result.object);866  }867  async getAccessibilityTree(needle) {868    return (0, _wkAccessibility.getAccessibilityTree)(this._session, needle);869  }870  async inputActionEpilogue() {}871  async getFrameElement(frame) {872    const parent = frame.parentFrame();873    if (!parent) throw new Error('Frame has been detached.');874    const info = this._page.parseSelector('frame,iframe');875    const handles = await this._page.selectors._queryAll(parent, info);876    const items = await Promise.all(handles.map(async handle => {877      const frame = await handle.contentFrame().catch(e => null);878      return {879        handle,880        frame881      };882    }));883    const result = items.find(item => item.frame === frame);884    items.map(item => item === result ? Promise.resolve() : item.handle.dispose());885    if (!result) throw new Error('Frame has been detached.');886    return result.handle;887  }888  _onRequestWillBeSent(session, event) {889    if (event.request.url.startsWith('data:')) return;890    let redirectedFrom = null;891    if (event.redirectResponse) {892      const request = this._requestIdToRequest.get(event.requestId); // If we connect late to the target, we could have missed the requestWillBeSent event.893      if (request) {894        this._handleRequestRedirect(request, event.redirectResponse, event.timestamp);895        redirectedFrom = request;896      }897    }898    const frame = redirectedFrom ? redirectedFrom.request.frame() : this._page._frameManager.frame(event.frameId); // sometimes we get stray network events for detached frames899    // TODO(einbinder) why?900    if (!frame) return; // TODO(einbinder) this will fail if we are an XHR document request901    const isNavigationRequest = event.type === 'Document';902    const documentId = isNavigationRequest ? event.loaderId : undefined;903    let route = null; // We do not support intercepting redirects.904    if (this._page._needsRequestInterception() && !redirectedFrom) route = new _wkInterceptableRequest.WKRouteImpl(session, event.requestId);905    const request = new _wkInterceptableRequest.WKInterceptableRequest(session, route, frame, event, redirectedFrom, documentId);906    this._requestIdToRequest.set(event.requestId, request);907    this._page._frameManager.requestStarted(request.request, route || undefined);908  }909  _handleRequestRedirect(request, responsePayload, timestamp) {910    const response = request.createResponse(responsePayload);911    response._securityDetailsFinished();912    response._serverAddrFinished();913    response._requestFinished(responsePayload.timing ? _helper.helper.secondsToRoundishMillis(timestamp - request._timestamp) : -1);914    this._requestIdToRequest.delete(request._requestId);915    this._page._frameManager.requestReceivedResponse(response);916    this._page._frameManager.reportRequestFinished(request.request, response);917  }918  _onRequestIntercepted(session, event) {919    const request = this._requestIdToRequest.get(event.requestId);920    if (!request) {921      session.sendMayFail('Network.interceptRequestWithError', {922        errorType: 'Cancellation',923        requestId: event.requestId924      });925      return;926    }927    if (!request._route) {928      // Intercepted, although we do not intend to allow interception.929      // Just continue.930      session.sendMayFail('Network.interceptWithRequest', {931        requestId: request._requestId932      });933    } else {934      request._route._requestInterceptedPromise.resolve();935    }936  }937  _onResponseReceived(event) {938    const request = this._requestIdToRequest.get(event.requestId); // FileUpload sends a response without a matching request.939    if (!request) return;940    this._requestIdToResponseReceivedPayloadEvent.set(request._requestId, event);941    const response = request.createResponse(event.response);942    if (event.response.requestHeaders && Object.keys(event.response.requestHeaders).length) {943      const headers = { ...event.response.requestHeaders944      };945      if (!headers['host']) headers['Host'] = new URL(request.request.url()).host;946      request.request.setRawRequestHeaders((0, _utils.headersObjectToArray)(headers));947    }948    this._page._frameManager.requestReceivedResponse(response);949    if (response.status() === 204) {950      this._onLoadingFailed({951        requestId: event.requestId,952        errorText: 'Aborted: 204 No Content',953        timestamp: event.timestamp954      });955    }956  }957  _onLoadingFinished(event) {958    const request = this._requestIdToRequest.get(event.requestId); // For certain requestIds we never receive requestWillBeSent event.959    // @see https://crbug.com/750469960    if (!request) return; // Under certain conditions we never get the Network.responseReceived961    // event from protocol. @see https://crbug.com/883475962    const response = request.request._existingResponse();963    if (response) {964      var _event$metrics, _event$metrics2, _event$metrics2$secur, _responseReceivedPayl, _responseReceivedPayl2, _responseReceivedPayl3, _responseReceivedPayl4, _responseReceivedPayl5, _responseReceivedPayl6, _event$metrics3, _event$metrics4, _event$metrics5;965      const responseReceivedPayload = this._requestIdToResponseReceivedPayloadEvent.get(request._requestId);966      response._serverAddrFinished(parseRemoteAddress(event === null || event === void 0 ? void 0 : (_event$metrics = event.metrics) === null || _event$metrics === void 0 ? void 0 : _event$metrics.remoteAddress));967      response._securityDetailsFinished({968        protocol: isLoadedSecurely(response.url(), response.timing()) ? (_event$metrics2 = event.metrics) === null || _event$metrics2 === void 0 ? void 0 : (_event$metrics2$secur = _event$metrics2.securityConnection) === null || _event$metrics2$secur === void 0 ? void 0 : _event$metrics2$secur.protocol : undefined,969        subjectName: responseReceivedPayload === null || responseReceivedPayload === void 0 ? void 0 : (_responseReceivedPayl = responseReceivedPayload.response.security) === null || _responseReceivedPayl === void 0 ? void 0 : (_responseReceivedPayl2 = _responseReceivedPayl.certificate) === null || _responseReceivedPayl2 === void 0 ? void 0 : _responseReceivedPayl2.subject,970        validFrom: responseReceivedPayload === null || responseReceivedPayload === void 0 ? void 0 : (_responseReceivedPayl3 = responseReceivedPayload.response.security) === null || _responseReceivedPayl3 === void 0 ? void 0 : (_responseReceivedPayl4 = _responseReceivedPayl3.certificate) === null || _responseReceivedPayl4 === void 0 ? void 0 : _responseReceivedPayl4.validFrom,971        validTo: responseReceivedPayload === null || responseReceivedPayload === void 0 ? void 0 : (_responseReceivedPayl5 = responseReceivedPayload.response.security) === null || _responseReceivedPayl5 === void 0 ? void 0 : (_responseReceivedPayl6 = _responseReceivedPayl5.certificate) === null || _responseReceivedPayl6 === void 0 ? void 0 : _responseReceivedPayl6.validUntil972      });973      if ((_event$metrics3 = event.metrics) !== null && _event$metrics3 !== void 0 && _event$metrics3.protocol) response._setHttpVersion(event.metrics.protocol);974      if ((_event$metrics4 = event.metrics) !== null && _event$metrics4 !== void 0 && _event$metrics4.responseBodyBytesReceived) request.request.responseSize.encodedBodySize = event.metrics.responseBodyBytesReceived;975      if ((_event$metrics5 = event.metrics) !== null && _event$metrics5 !== void 0 && _event$metrics5.responseHeaderBytesReceived) request.request.responseSize.responseHeadersSize = event.metrics.responseHeaderBytesReceived;976      response._requestFinished(_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));977    }978    this._requestIdToResponseReceivedPayloadEvent.delete(request._requestId);979    this._requestIdToRequest.delete(request._requestId);980    this._page._frameManager.reportRequestFinished(request.request, response);981  }982  _onLoadingFailed(event) {983    const request = this._requestIdToRequest.get(event.requestId); // For certain requestIds we never receive requestWillBeSent event.984    // @see https://crbug.com/750469985    if (!request) return;986    const response = request.request._existingResponse();987    if (response) {988      response._serverAddrFinished();989      response._securityDetailsFinished();990      response._requestFinished(_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));991    }992    this._requestIdToRequest.delete(request._requestId);993    request.request._setFailureText(event.errorText);994    this._page._frameManager.requestFailed(request.request, event.errorText.includes('cancelled'));995  }996  async _grantPermissions(origin, permissions) {997    const webPermissionToProtocol = new Map([['geolocation', 'geolocation']]);998    const filtered = permissions.map(permission => {999      const protocolPermission = webPermissionToProtocol.get(permission);1000      if (!protocolPermission) throw new Error('Unknown permission: ' + permission);1001      return protocolPermission;1002    });1003    await this._pageProxySession.send('Emulation.grantPermissions', {1004      origin,1005      permissions: filtered1006    });1007  }1008  async _clearPermissions() {1009    await this._pageProxySession.send('Emulation.resetPermissions', {});1010  }...wkBrowser.js
Source:wkBrowser.js  
...237      browserContextId: this._browserContextId238    });239  }240  async _doGrantPermissions(origin, permissions) {241    await Promise.all(this.pages().map(page => page._delegate._grantPermissions(origin, permissions)));242  }243  async _doClearPermissions() {244    await Promise.all(this.pages().map(page => page._delegate._clearPermissions()));245  }246  async setGeolocation(geolocation) {247    (0, _browserContext.verifyGeolocation)(geolocation);248    this._options.geolocation = geolocation;249    const payload = geolocation ? { ...geolocation,250      timestamp: Date.now()251    } : undefined;252    await this._browser._browserSession.send('Playwright.setGeolocationOverride', {253      browserContextId: this._browserContextId,254      geolocation: payload255    });...deployer.js
Source:deployer.js  
...122    const { appId, currentTimestamp } = { ...DEFAULT_DISPUTABLE_INITIALIZATION_PARAMS, ...options }123    const receipt = await this.dao.newAppInstance(appId, this.baseDisputable.address, '0x', false, { from: owner })124    const disputable = await this.baseDisputable.constructor.at(getInstalledApp(receipt, appId))125    await this.acl.createPermission(this.agreement.address, disputable.address, SET_AGREEMENT_ROLE, owner, { from: owner })126    await this._grantPermissions(disputable, SUBMIT_ROLE, options.submitters, owner)127    await this._grantPermissions(disputable, CHALLENGE_ROLE, options.challengers, owner)128    if (!options.collateralToken && !this.collateralToken) await this.deployCollateralToken(options)129    await disputable.initialize()130    if (options.activate || options.activate === undefined) {131      const collateralToken = options.collateralToken || this.collateralToken132      const { actionCollateral, challengeCollateral, challengeDuration } = { ...DEFAULT_DISPUTABLE_INITIALIZATION_PARAMS, ...options }133      await this.agreement.activate(disputable.address, collateralToken.address, challengeDuration, actionCollateral, challengeCollateral, { from: owner })134    }135    if (currentTimestamp) await this.mockTime(disputable, currentTimestamp)136    this.previousDeploy = { ...this.previousDeploy, disputable }137    return disputable138  }139  async deployArbitrator(options = {}) {140    let { feeToken, feeAmount } = { ...DEFAULT_AGREEMENT_INITIALIZATION_PARAMS.arbitrator, ...options }141    if (!feeToken.address) feeToken = await this.deployToken(feeToken)142    const Arbitrator = this._getContract('ArbitratorMock')143    const arbitrator = await Arbitrator.new(feeToken.address, feeAmount)144    this.previousDeploy = { ...this.previousDeploy, arbitrator }145    return arbitrator146  }147  async deployStakingFactory() {148    const StakingFactory = this._getContract('StakingFactory')149    const stakingFactory = await StakingFactory.new()150    this.previousDeploy = { ...this.previousDeploy, stakingFactory }151    return stakingFactory152  }153  async deployCollateralToken(options = {}) {154    const collateralToken = await this.deployToken(options)155    this.previousDeploy = { ...this.previousDeploy, collateralToken }156    return collateralToken157  }158  async deployBase() {159    const Agreement = this._getContract('AgreementMock')160    const base = await Agreement.new()161    this.previousDeploy = { ...this.previousDeploy, base }162    return base163  }164  async deployBaseDisputable() {165    const Disputable = this._getContract('DisputableAppMock')166    const baseDisputable = await Disputable.new()167    this.previousDeploy = { ...this.previousDeploy, baseDisputable }168    return baseDisputable169  }170  async deployDAO(owner) {171    const Kernel = this._getContract('Kernel')172    const kernelBase = await Kernel.new(true)173    const ACL = this._getContract('ACL')174    const aclBase = await ACL.new()175    const EVMScriptRegistryFactory = this._getContract('EVMScriptRegistryFactory')176    const regFact = await EVMScriptRegistryFactory.new()177    const DAOFactory = this._getContract('DAOFactory')178    const daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address)179    const kernelReceipt = await daoFact.newDAO(owner)180    const dao = await Kernel.at(getEventArgument(kernelReceipt, 'DeployDAO', 'dao'))181    const acl = await ACL.at(await dao.acl())182    const APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE()183    await acl.createPermission(owner, dao.address, APP_MANAGER_ROLE, owner, { from: owner })184    this.previousDeploy = { ...this.previousDeploy, dao, acl, owner }185    return dao186  }187  async deployToken({ name = 'My Sample Token', decimals = 18, symbol = 'MST' }) {188    const MiniMeToken = this._getContract('MiniMeToken')189    return MiniMeToken.new(ZERO_ADDRESS, ZERO_ADDRESS, 0, name, decimals, symbol, true)190  }191  async mockTime(timeMockable, timestamp) {192    if (!this.clockMock) await this.deployClockMock()193    await timeMockable.setClock(this.clockMock.address)194    return this.clockMock.mockSetTimestamp(timestamp)195  }196  async deployClockMock() {197    const ClockMock = this._getContract('TimeHelpersMock')198    const clockMock = await ClockMock.new()199    this.previousDeploy = { ...this.previousDeploy, clockMock }200    return clockMock201  }202  async _createPermissions(app, permissions, to, manager = to) {203    for (const permission of permissions) {204      const ROLE = await app[permission]()205      await this.acl.createPermission(to, app.address, ROLE, manager, { from: manager })206    }207  }208  async _grantPermissions(app, permission, users, manager) {209    if (!users) users = [ANY_ENTITY]210    for (const user of users) {211      if (users.indexOf(user) === 0) await this.acl.createPermission(user, app.address, permission, manager, { from: manager })212      else await this.acl.grantPermission(user, app.address, permission, { from: manager })213    }214  }215  _getContract(name) {216    return this.artifacts.require(name)217  }218  async _getSender() {219    if (!this.sender) {220      const accounts = await this.web3.eth.getAccounts()221      this.sender = accounts[0]222    }...Using AI Code Generation
1const { webkit } = require('playwright');2(async () => {3  const browser = await webkit.launch({ headless: false });4  const context = await browser.newContext();5  const page = await context.newPage();6  await context._grantPermissions(['geolocation']);7  await page.waitForTimeout(5000);8  await browser.close();9})();Using AI Code Generation
1const { _grantPermissions } = require('playwright/lib/server/browserContext');2const { chromium } = require('playwright');3(async () => {4  const browser = await chromium.launch();5  const context = await browser.newContext();6  await _grantPermissions(context, ['geolocation']);7  const page = await context.newPage();8  await page.click('text="Your location"');9  await page.waitForTimeout(5000);10  await page.close();11  await context.close();12  await browser.close();13})();14[0224/102717.665:ERROR:device_event_log_impl.cc(208)] [10:27:17.665] USB: usb_device_handle_win.cc:1040 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)15[0224/102717.668:ERROR:device_event_log_impl.cc(208)] [10:27:17.668] USB: usb_device_handle_win.cc:1040 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)16[0224/102717.670:ERROR:device_event_log_impl.cc(208)] [10:27:17.670] USB: usb_device_handle_win.cc:1040 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)17[0224/102717.673:ERROR:device_event_log_impl.cc(208)] [10:27:17.673] USB: usb_device_handle_win.cc:1040 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)18[0224/102717.675:ERROR:device_event_log_impl.cc(208)] [10:27:17.675] USB: usb_device_handle_win.cc:1040 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)19[0224/102717.678:ERROR:device_event_log_impl.cc(208)] [10:27:17.678] USB: usb_device_handle_win.cc:1040 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  await browser._grantPermissions(['geolocation']);5  const context = await browser.newContext();6  const page = await context.newPage();7  await page.click('text=Share Location');8  await page.click('text=Always share');9  await page.waitForSelector('text=You are here');10  await browser.close();11})();12{13  "scripts": {14  },15  "dependencies": {16  }17}Using AI Code Generation
1const { chromium } = require('playwright');2const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');3(async () => {4  const browser = await chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  await _grantPermissions(page, ['geolocation']);8  await page.click('text=Try it');9  await page.waitForSelector('text=Latitude:');10  await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14  const browser = await chromium.launch();15  const context = await browser.newContext({16    geolocation: { longitude: 12.492507, latitude: 41.889938 },17  });18  const page = await context.newPage();19  await page.click('text=Try it');20  await page.waitForSelector('text=Latitude:');21  await browser.close();22})();23const { chromium } = require('playwright');24(async () => {25  const browser = await chromium.launch();26  const context = await browser.newContext();27  const page = await context.newPage();28  await page.click('text=Try it');29  await page.waitForSelector('text=Latitude:');30  const latitude = await page.$eval('text=Latitude:', (el) => el.textContent);Using AI Code Generation
1const { _grantPermissions } = require('playwright/lib/server/browserContext.js');2const { chromium } = require('playwright');3(async () => {4  const browser = await chromium.launch({ headless: false });5  const context = await browser.newContext();6  await _grantPermissions(context, ['geolocation']);7  const page = await context.newPage();Using AI Code Generation
1const { _grantPermissions } = require('playwright');2await _grantPermissions(['geolocation']);3const { _grantPermissions } = require('playwright');4await _grantPermissions(['geolocation']);5const { _grantPermissions } = require('playwright');6await _grantPermissions(['geolocation']);7const { _grantPermissions } = require('playwright');8await _grantPermissions(['geolocation']);9const { _grantPermissions } = require('playwright');10await _grantPermissions(['geolocation']);11const { _grantPermissions } = require('playwright');12await _grantPermissions(['geolocation']);13const { _grantPermissions } = require('playwright');14await _grantPermissions(['geolocation']);15const { _grantPermissions } = require('playwright');16await _grantPermissions(['geolocation']);17const { _grantPermissions } = require('playwright');18await _grantPermissions(['geolocation']);19const { _grantPermissions } = require('playwright');20await _grantPermissions(['geolocation']);21const { _grantPermissions } = require('playwright');22await _grantPermissions(['geolocation']);23const { _grantPermissions } = require('playwright');24await _grantPermissions(['geolocation']);25const { _grantPermissions } = require('playwright');26await _grantPermissions(['geolocation']);27const { _grantPermissions } = require('playwright');28await _grantPermissions(['geolocation']);29const { _grantPermissions } = require('playwright');30await _grantPermissions(['geolocation']);Using AI Code Generation
1const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await _grantPermissions(page, ['geolocation']);7})();8const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');9(async () => {10  const browser = await chromium.launch();11  const context = await browser.newContext();12  const page = await context.newPage();13  await _grantPermissions(page, ['geolocation']);14})();15const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');16(async () => {17  const browser = await chromium.launch();18  const context = await browser.newContext();19  const page = await context.newPage();20  await _grantPermissions(page, ['geolocation']);21})();22const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');23(async () => {24  const browser = await chromium.launch();25  const context = await browser.newContext();26  const page = await context.newPage();27  await _grantPermissions(page, ['geolocation']);28})();29const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');30(async () => {31  const browser = await chromium.launch();Using AI Code Generation
1const { _grantPermissions } = require('playwright/lib/server/chromium/crBrowser');2(async () => {3  const browser = await chromium.launch({4      '--use-file-for-fake-video-capture=' + path.join(__dirname, 'test.webm')5  });6  const context = await browser.newContext();7  const page = await context.newPage();8  await _grantPermissions(page, ['camera', 'microphone']);9  await page.click('text=Start Recording');10})();Using AI Code Generation
1const { _grantPermissions } = require('@playwright/test/lib/server/browserContext');2const { chromium, webkit, firefox } = require('playwright');3(async () => {4  const browser = await chromium.launch();5  const context = await browser.newContext();6  await _grantPermissions(context, ['geolocation']);7  const page = await context.newPage();8  await page.click('text=Ask');9  await page.waitForTimeout(5000);10  await browser.close();11})();Using AI Code Generation
1const { InternalAPI } = require('playwright-core/lib/client/api');2const { chromium } = require('playwright-core');3(async () => {4  const browser = await chromium.launch();5  const page = await browser.newPage();6  await InternalAPI.grantPermissions(page, ['geolocation']);7  await page.reload();8  await page.waitForTimeout(10000);9  await browser.close();10})();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!!
