How to use appendExtraHTTPHeaders method in Playwright Internal

Best JavaScript code snippet using playwright-internal

NetworkObserver.js

Source:NetworkObserver.js Github

copy

Full Screen

...131 this._expectingInterception = false;132 this._expectingResumedRequest = undefined; // { method, headers, postData }133 this._sentOnResponse = false;134 if (this._pageNetwork)135 appendExtraHTTPHeaders(httpChannel, this._pageNetwork.combinedExtraHTTPHeaders());136 this._responseBodyChunks = [];137 httpChannel.QueryInterface(Ci.nsITraceableChannel);138 this._originalListener = httpChannel.setNewListener(this);139 if (redirectedFrom) {140 // Listener is inherited for regular redirects, so we'd like to avoid141 // calling into previous NetworkRequest.142 this._originalListener = redirectedFrom._originalListener;143 }144 this._previousCallbacks = httpChannel.notificationCallbacks;145 httpChannel.notificationCallbacks = this;146 this.QueryInterface = ChromeUtils.generateQI([147 Ci.nsIAuthPrompt2,148 Ci.nsIAuthPromptProvider,149 Ci.nsIInterfaceRequestor,150 Ci.nsINetworkInterceptController,151 Ci.nsIStreamListener,152 ]);153 if (this.redirectedFromId) {154 // Redirects are not interceptable.155 this._sendOnRequest(false);156 }157 }158 // Public interception API.159 resume(url, method, headers, postData) {160 this._expectingResumedRequest = { method, headers, postData };161 const newUri = url ? Services.io.newURI(url) : null;162 this._interceptedChannel.resetInterceptionWithURI(newUri);163 this._interceptedChannel = undefined;164 }165 // Public interception API.166 abort(errorCode) {167 const error = errorMap[errorCode] || Cr.NS_ERROR_FAILURE;168 this._interceptedChannel.cancelInterception(error);169 this._interceptedChannel = undefined;170 }171 // Public interception API.172 fulfill(status, statusText, headers, base64body) {173 this._interceptedChannel.synthesizeStatus(status, statusText);174 for (const header of headers) {175 this._interceptedChannel.synthesizeHeader(header.name, header.value);176 if (header.name.toLowerCase() === 'set-cookie') {177 Services.cookies.QueryInterface(Ci.nsICookieService);178 Services.cookies.setCookieStringFromHttp(this.httpChannel.URI, header.value, this.httpChannel);179 }180 }181 const synthesized = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);182 synthesized.data = base64body ? atob(base64body) : '';183 this._interceptedChannel.startSynthesizedResponse(synthesized, null, null, '', false);184 this._interceptedChannel.finishSynthesizedResponse();185 this._interceptedChannel = undefined;186 }187 // Instrumentation called by NetworkObserver.188 _onInternalRedirect(newChannel) {189 // Intercepted requests produce "internal redirects" - this is both for our own190 // interception and service workers.191 // An internal redirect has the same channelId, inherits notificationCallbacks and192 // listener, and should be used instead of an old channel.193 this._networkObserver._channelToRequest.delete(this.httpChannel);194 this.httpChannel = newChannel;195 this._networkObserver._channelToRequest.set(this.httpChannel, this);196 }197 // Instrumentation called by NetworkObserver.198 _onInternalRedirectReady() {199 // Resumed request is first internally redirected to a new request,200 // and then the new request is ready to be updated.201 if (!this._expectingResumedRequest)202 return;203 const { method, headers, postData } = this._expectingResumedRequest;204 this._expectingResumedRequest = undefined;205 if (headers) {206 for (const header of requestHeaders(this.httpChannel))207 this.httpChannel.setRequestHeader(header.name, '', false /* merge */);208 for (const header of headers)209 this.httpChannel.setRequestHeader(header.name, header.value, false /* merge */);210 } else if (this._pageNetwork) {211 appendExtraHTTPHeaders(this.httpChannel, this._pageNetwork.combinedExtraHTTPHeaders());212 }213 if (method)214 this.httpChannel.requestMethod = method;215 if (postData)216 setPostData(this.httpChannel, postData, headers);217 }218 // nsIInterfaceRequestor219 getInterface(iid) {220 if (iid.equals(Ci.nsIAuthPrompt2) || iid.equals(Ci.nsIAuthPromptProvider) || iid.equals(Ci.nsINetworkInterceptController))221 return this;222 if (iid.equals(Ci.nsIAuthPrompt)) // Block nsIAuthPrompt - we want nsIAuthPrompt2 to be used instead.223 throw Cr.NS_ERROR_NO_INTERFACE;224 if (this._previousCallbacks)225 return this._previousCallbacks.getInterface(iid);226 throw Cr.NS_ERROR_NO_INTERFACE;227 }228 // nsIAuthPromptProvider229 getAuthPrompt(aPromptReason, iid) {230 return this;231 }232 // nsIAuthPrompt2233 asyncPromptAuth(aChannel, aCallback, aContext, level, authInfo) {234 let canceled = false;235 Promise.resolve().then(() => {236 if (canceled)237 return;238 const hasAuth = this.promptAuth(aChannel, level, authInfo);239 if (hasAuth)240 aCallback.onAuthAvailable(aContext, authInfo);241 else242 aCallback.onAuthCancelled(aContext, true);243 });244 return {245 QueryInterface: ChromeUtils.generateQI([Ci.nsICancelable]),246 cancel: () => {247 aCallback.onAuthCancelled(aContext, false);248 canceled = true;249 }250 };251 }252 // nsIAuthPrompt2253 promptAuth(aChannel, level, authInfo) {254 if (authInfo.flags & Ci.nsIAuthInformation.PREVIOUS_FAILED)255 return false;256 const pageNetwork = this._pageNetwork;257 if (!pageNetwork)258 return false;259 let credentials = null;260 if (authInfo.flags & Ci.nsIAuthInformation.AUTH_PROXY) {261 const proxy = this._networkObserver._targetRegistry.getProxyInfo(aChannel);262 credentials = proxy ? {username: proxy.username, password: proxy.password} : null;263 } else {264 credentials = pageNetwork._target.browserContext().httpCredentials;265 }266 if (!credentials)267 return false;268 authInfo.username = credentials.username;269 authInfo.password = credentials.password;270 // This will produce a new request with respective auth header set.271 // It will have the same id as ours. We expect it to arrive as new request and272 // will treat it as our own redirect.273 this._networkObserver._expectRedirect(this.httpChannel.channelId + '', this);274 return true;275 }276 // nsINetworkInterceptController277 shouldPrepareForIntercept(aURI, channel) {278 const interceptController = this._fallThroughInterceptController();279 if (interceptController && interceptController.shouldPrepareForIntercept(aURI, channel)) {280 // We assume that interceptController is a service worker if there is one,281 // and yield interception to it. We are not going to intercept ourselves,282 // so we send onRequest now.283 this._sendOnRequest(false);284 return true;285 }286 if (channel !== this.httpChannel) {287 // Not our channel? Just in case this happens, don't do anything.288 return false;289 }290 // We do not want to intercept any redirects, because we are not able291 // to intercept subresource redirects, and it's unreliable for main requests.292 // We do not sendOnRequest here, because redirects do that in constructor.293 if (this.redirectedFromId)294 return false;295 const shouldIntercept = this._shouldIntercept();296 if (!shouldIntercept) {297 // We are not intercepting - ready to issue onRequest.298 this._sendOnRequest(false);299 return false;300 }301 this._expectingInterception = true;302 return true;303 }304 // nsINetworkInterceptController305 channelIntercepted(intercepted) {306 if (!this._expectingInterception) {307 // We are not intercepting, fall-through.308 const interceptController = this._fallThroughInterceptController();309 if (interceptController)310 interceptController.channelIntercepted(intercepted);311 return;312 }313 this._expectingInterception = false;314 this._interceptedChannel = intercepted.QueryInterface(Ci.nsIInterceptedChannel);315 const pageNetwork = this._pageNetwork;316 if (!pageNetwork) {317 // Just in case we disabled instrumentation while intercepting, resume and forget.318 this.resume();319 return;320 }321 const browserContext = pageNetwork._target.browserContext();322 if (browserContext.settings.onlineOverride === 'offline') {323 // Implement offline.324 this.abort(Cr.NS_ERROR_OFFLINE);325 return;326 }327 // Ok, so now we have intercepted the request, let's issue onRequest.328 // If interception has been disabled while we were intercepting, resume and forget.329 const interceptionEnabled = this._shouldIntercept();330 this._sendOnRequest(!!interceptionEnabled);331 if (interceptionEnabled)332 pageNetwork._interceptedRequests.set(this.requestId, this);333 else334 this.resume();335 }336 // nsIStreamListener337 onDataAvailable(aRequest, aInputStream, aOffset, aCount) {338 // Turns out webcompat shims might redirect to339 // SimpleChannel, so we get requests from a different channel.340 // See https://github.com/microsoft/playwright/issues/9418#issuecomment-944836244341 if (aRequest !== this.httpChannel)342 return;343 // For requests with internal redirect (e.g. intercepted by Service Worker),344 // we do not get onResponse normally, but we do get nsIStreamListener notifications.345 this._sendOnResponse(false);346 const iStream = new BinaryInputStream(aInputStream);347 const sStream = new StorageStream(8192, aCount, null);348 const oStream = new BinaryOutputStream(sStream.getOutputStream(0));349 // Copy received data as they come.350 const data = iStream.readBytes(aCount);351 this._responseBodyChunks.push(data);352 oStream.writeBytes(data, aCount);353 try {354 this._originalListener.onDataAvailable(aRequest, sStream.newInputStream(0), aOffset, aCount);355 } catch (e) {356 // Be ready to original listener exceptions.357 }358 }359 // nsIStreamListener360 onStartRequest(aRequest) {361 // Turns out webcompat shims might redirect to362 // SimpleChannel, so we get requests from a different channel.363 // See https://github.com/microsoft/playwright/issues/9418#issuecomment-944836244364 if (aRequest !== this.httpChannel)365 return;366 try {367 this._originalListener.onStartRequest(aRequest);368 } catch (e) {369 // Be ready to original listener exceptions.370 }371 }372 // nsIStreamListener373 onStopRequest(aRequest, aStatusCode) {374 // Turns out webcompat shims might redirect to375 // SimpleChannel, so we get requests from a different channel.376 // See https://github.com/microsoft/playwright/issues/9418#issuecomment-944836244377 if (aRequest !== this.httpChannel)378 return;379 try {380 this._originalListener.onStopRequest(aRequest, aStatusCode);381 } catch (e) {382 // Be ready to original listener exceptions.383 }384 if (aStatusCode === 0) {385 // For requests with internal redirect (e.g. intercepted by Service Worker),386 // we do not get onResponse normally, but we do get nsIRequestObserver notifications.387 this._sendOnResponse(false);388 const body = this._responseBodyChunks.join('');389 const pageNetwork = this._pageNetwork;390 if (pageNetwork)391 pageNetwork._responseStorage.addResponseBody(this, body);392 this._sendOnRequestFinished();393 } else {394 this._sendOnRequestFailed(aStatusCode);395 }396 delete this._responseBodyChunks;397 }398 _shouldIntercept() {399 const pageNetwork = this._pageNetwork;400 if (!pageNetwork)401 return false;402 if (pageNetwork._requestInterceptionEnabled)403 return true;404 const browserContext = pageNetwork._target.browserContext();405 if (browserContext.requestInterceptionEnabled)406 return true;407 if (browserContext.settings.onlineOverride === 'offline')408 return true;409 return false;410 }411 _fallThroughInterceptController() {412 if (!this._previousCallbacks || !(this._previousCallbacks instanceof Ci.nsINetworkInterceptController))413 return undefined;414 return this._previousCallbacks.getInterface(Ci.nsINetworkInterceptController);415 }416 _sendOnRequest(isIntercepted) {417 // Note: we call _sendOnRequest either after we intercepted the request,418 // or at the first moment we know that we are not going to intercept.419 const pageNetwork = this._pageNetwork;420 if (!pageNetwork)421 return;422 const loadInfo = this.httpChannel.loadInfo;423 const causeType = loadInfo?.externalContentPolicyType || Ci.nsIContentPolicy.TYPE_OTHER;424 const internalCauseType = loadInfo?.internalContentPolicyType || Ci.nsIContentPolicy.TYPE_OTHER;425 pageNetwork.emit(PageNetwork.Events.Request, {426 url: this.httpChannel.URI.spec,427 frameId: this._frameId,428 isIntercepted,429 requestId: this.requestId,430 redirectedFrom: this.redirectedFromId,431 postData: readRequestPostData(this.httpChannel),432 headers: requestHeaders(this.httpChannel),433 method: this.httpChannel.requestMethod,434 navigationId: this.navigationId,435 cause: causeTypeToString(causeType),436 internalCause: causeTypeToString(internalCauseType),437 }, this._frameId);438 }439 _sendOnResponse(fromCache, opt_statusCode, opt_statusText) {440 if (this._sentOnResponse) {441 // We can come here twice because of internal redirects, e.g. service workers.442 return;443 }444 this._sentOnResponse = true;445 const pageNetwork = this._pageNetwork;446 if (!pageNetwork)447 return;448 this.httpChannel.QueryInterface(Ci.nsIHttpChannelInternal);449 this.httpChannel.QueryInterface(Ci.nsITimedChannel);450 const timing = {451 startTime: this.httpChannel.channelCreationTime,452 domainLookupStart: this.httpChannel.domainLookupStartTime,453 domainLookupEnd: this.httpChannel.domainLookupEndTime,454 connectStart: this.httpChannel.connectStartTime,455 secureConnectionStart: this.httpChannel.secureConnectionStartTime,456 connectEnd: this.httpChannel.connectEndTime,457 requestStart: this.httpChannel.requestStartTime,458 responseStart: this.httpChannel.responseStartTime,459 };460 const { status, statusText, headers } = responseHead(this.httpChannel, opt_statusCode, opt_statusText);461 let remoteIPAddress = undefined;462 let remotePort = undefined;463 try {464 remoteIPAddress = this.httpChannel.remoteAddress;465 remotePort = this.httpChannel.remotePort;466 } catch (e) {467 // remoteAddress is not defined for cached requests.468 }469 pageNetwork.emit(PageNetwork.Events.Response, {470 requestId: this.requestId,471 securityDetails: getSecurityDetails(this.httpChannel),472 fromCache,473 headers,474 remoteIPAddress,475 remotePort,476 status,477 statusText,478 timing,479 }, this._frameId);480 }481 _sendOnRequestFailed(error) {482 const pageNetwork = this._pageNetwork;483 if (pageNetwork) {484 pageNetwork.emit(PageNetwork.Events.RequestFailed, {485 requestId: this.requestId,486 errorCode: helper.getNetworkErrorStatusText(error),487 }, this._frameId);488 }489 this._networkObserver._channelToRequest.delete(this.httpChannel);490 }491 _sendOnRequestFinished() {492 const pageNetwork = this._pageNetwork;493 if (pageNetwork) {494 let protocolVersion = undefined;495 try {496 protocolVersion = this.httpChannel.protocolVersion;497 } catch (e) {498 // protocolVersion is unavailable in certain cases.499 };500 pageNetwork.emit(PageNetwork.Events.RequestFinished, {501 requestId: this.requestId,502 responseEndTime: this.httpChannel.responseEndTime,503 transferSize: this.httpChannel.transferSize,504 encodedBodySize: this.httpChannel.encodedBodySize,505 protocolVersion,506 }, this._frameId);507 }508 this._networkObserver._channelToRequest.delete(this.httpChannel);509 }510}511class NetworkObserver {512 static instance() {513 return NetworkObserver._instance || null;514 }515 constructor(targetRegistry) {516 EventEmitter.decorate(this);517 NetworkObserver._instance = this;518 this._targetRegistry = targetRegistry;519 this._channelToRequest = new Map(); // http channel -> network request520 this._expectedRedirect = new Map(); // expected redirect channel id (string) -> network request521 const protocolProxyService = Cc['@mozilla.org/network/protocol-proxy-service;1'].getService();522 this._channelProxyFilter = {523 QueryInterface: ChromeUtils.generateQI([Ci.nsIProtocolProxyChannelFilter]),524 applyFilter: (channel, defaultProxyInfo, proxyFilter) => {525 const proxy = this._targetRegistry.getProxyInfo(channel);526 if (!proxy) {527 proxyFilter.onProxyFilterResult(defaultProxyInfo);528 return;529 }530 proxyFilter.onProxyFilterResult(protocolProxyService.newProxyInfo(531 proxy.type,532 proxy.host,533 proxy.port,534 '', /* aProxyAuthorizationHeader */535 '', /* aConnectionIsolationKey */536 Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST, /* aFlags */537 UINT32_MAX, /* aFailoverTimeout */538 null, /* failover proxy */539 ));540 },541 };542 protocolProxyService.registerChannelFilter(this._channelProxyFilter, 0 /* position */);543 this._channelSink = {544 QueryInterface: ChromeUtils.generateQI([Ci.nsIChannelEventSink]),545 asyncOnChannelRedirect: (oldChannel, newChannel, flags, callback) => {546 this._onRedirect(oldChannel, newChannel, flags);547 callback.onRedirectVerifyCallback(Cr.NS_OK);548 },549 };550 this._channelSinkFactory = {551 QueryInterface: ChromeUtils.generateQI([Ci.nsIFactory]),552 createInstance: (aOuter, aIID) => this._channelSink.QueryInterface(aIID),553 };554 // Register self as ChannelEventSink to track redirects.555 const registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);556 registrar.registerFactory(SINK_CLASS_ID, SINK_CLASS_DESCRIPTION, SINK_CONTRACT_ID, this._channelSinkFactory);557 Services.catMan.addCategoryEntry(SINK_CATEGORY_NAME, SINK_CONTRACT_ID, SINK_CONTRACT_ID, false, true);558 this._eventListeners = [559 helper.addObserver(this._onRequest.bind(this), 'http-on-modify-request'),560 helper.addObserver(this._onResponse.bind(this, false /* fromCache */), 'http-on-examine-response'),561 helper.addObserver(this._onResponse.bind(this, true /* fromCache */), 'http-on-examine-cached-response'),562 helper.addObserver(this._onResponse.bind(this, true /* fromCache */), 'http-on-examine-merged-response'),563 ];564 }565 _expectRedirect(channelId, previous) {566 this._expectedRedirect.set(channelId, previous);567 }568 _onRedirect(oldChannel, newChannel, flags) {569 if (!(oldChannel instanceof Ci.nsIHttpChannel) || !(newChannel instanceof Ci.nsIHttpChannel))570 return;571 const oldHttpChannel = oldChannel.QueryInterface(Ci.nsIHttpChannel);572 const newHttpChannel = newChannel.QueryInterface(Ci.nsIHttpChannel);573 const request = this._channelToRequest.get(oldHttpChannel);574 if (flags & Ci.nsIChannelEventSink.REDIRECT_INTERNAL) {575 if (request)576 request._onInternalRedirect(newHttpChannel);577 } else if (flags & Ci.nsIChannelEventSink.REDIRECT_STS_UPGRADE) {578 if (request) {579 // This is an internal HSTS upgrade. The original http request is canceled, and a new580 // equivalent https request is sent. We forge 307 redirect to follow Chromium here:581 // https://source.chromium.org/chromium/chromium/src/+/main:net/url_request/url_request_http_job.cc;l=211582 request._sendOnResponse(false, 307, 'Temporary Redirect');583 this._expectRedirect(newHttpChannel.channelId + '', request);584 }585 } else {586 if (request)587 this._expectRedirect(newHttpChannel.channelId + '', request);588 }589 }590 _findPageNetwork(httpChannel) {591 let loadContext = helper.getLoadContext(httpChannel);592 if (!loadContext)593 return;594 const target = this._targetRegistry.targetForBrowser(loadContext.topFrameElement);595 if (!target)596 return;597 return PageNetwork.forPageTarget(target);598 }599 _onRequest(channel, topic) {600 if (!(channel instanceof Ci.nsIHttpChannel))601 return;602 const httpChannel = channel.QueryInterface(Ci.nsIHttpChannel);603 const channelId = httpChannel.channelId + '';604 const redirectedFrom = this._expectedRedirect.get(channelId);605 if (redirectedFrom) {606 this._expectedRedirect.delete(channelId);607 new NetworkRequest(this, httpChannel, redirectedFrom);608 } else {609 const redirectedRequest = this._channelToRequest.get(httpChannel);610 if (redirectedRequest)611 redirectedRequest._onInternalRedirectReady();612 else613 new NetworkRequest(this, httpChannel);614 }615 }616 _onResponse(fromCache, httpChannel, topic) {617 const request = this._channelToRequest.get(httpChannel);618 if (request)619 request._sendOnResponse(fromCache);620 }621 dispose() {622 this._activityDistributor.removeObserver(this);623 const registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);624 registrar.unregisterFactory(SINK_CLASS_ID, this._channelSinkFactory);625 Services.catMan.deleteCategoryEntry(SINK_CATEGORY_NAME, SINK_CONTRACT_ID, false);626 helper.removeListeners(this._eventListeners);627 }628}629const protocolVersionNames = {630 [Ci.nsITransportSecurityInfo.TLS_VERSION_1]: 'TLS 1',631 [Ci.nsITransportSecurityInfo.TLS_VERSION_1_1]: 'TLS 1.1',632 [Ci.nsITransportSecurityInfo.TLS_VERSION_1_2]: 'TLS 1.2',633 [Ci.nsITransportSecurityInfo.TLS_VERSION_1_3]: 'TLS 1.3',634};635function getSecurityDetails(httpChannel) {636 const securityInfo = httpChannel.securityInfo;637 if (!securityInfo)638 return null;639 securityInfo.QueryInterface(Ci.nsITransportSecurityInfo);640 if (!securityInfo.serverCert)641 return null;642 return {643 protocol: protocolVersionNames[securityInfo.protocolVersion] || '<unknown>',644 subjectName: securityInfo.serverCert.commonName,645 issuer: securityInfo.serverCert.issuerCommonName,646 // Convert to seconds.647 validFrom: securityInfo.serverCert.validity.notBefore / 1000 / 1000,648 validTo: securityInfo.serverCert.validity.notAfter / 1000 / 1000,649 };650}651function readRequestPostData(httpChannel) {652 if (!(httpChannel instanceof Ci.nsIUploadChannel))653 return undefined;654 let iStream = httpChannel.uploadStream;655 if (!iStream)656 return undefined;657 const isSeekableStream = iStream instanceof Ci.nsISeekableStream;658 // For some reason, we cannot rewind back big streams,659 // so instead we should clone them.660 const isCloneable = iStream instanceof Ci.nsICloneableInputStream;661 if (isCloneable)662 iStream = iStream.clone();663 let prevOffset;664 if (isSeekableStream) {665 prevOffset = iStream.tell();666 iStream.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);667 }668 // Read data from the stream.669 let result = undefined;670 try {671 const buffer = NetUtil.readInputStream(iStream, iStream.available());672 const bytes = new Uint8Array(buffer);673 let binary = '';674 for (let i = 0; i < bytes.byteLength; i++)675 binary += String.fromCharCode(bytes[i]);676 result = btoa(binary);677 } catch (err) {678 result = '';679 }680 // Seek locks the file, so seek to the beginning only if necko hasn't681 // read it yet, since necko doesn't seek to 0 before reading (at lest682 // not till 459384 is fixed).683 if (isSeekableStream && prevOffset == 0 && !isCloneable)684 iStream.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);685 return result;686}687function requestHeaders(httpChannel) {688 const headers = [];689 httpChannel.visitRequestHeaders({690 visitHeader: (name, value) => headers.push({name, value}),691 });692 return headers;693}694function causeTypeToString(causeType) {695 for (let key in Ci.nsIContentPolicy) {696 if (Ci.nsIContentPolicy[key] === causeType)697 return key;698 }699 return 'TYPE_OTHER';700}701function appendExtraHTTPHeaders(httpChannel, headers) {702 if (!headers)703 return;704 for (const header of headers)705 httpChannel.setRequestHeader(header.name, header.value, false /* merge */);706}707class ResponseStorage {708 constructor(maxTotalSize, maxResponseSize) {709 this._totalSize = 0;710 this._maxResponseSize = maxResponseSize;711 this._maxTotalSize = maxTotalSize;712 this._responses = new Map();713 }714 addResponseBody(request, body) {715 if (body.length > this._maxResponseSize) {...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1const playwright = require('playwright');2(async () => {3 for (const browserType of ['chromium', 'firefox', 'webkit']) {4 const browser = await playwright[browserType].launch();5 const context = await browser.newContext();6 await context.addInitScript(() => {7 window.playwright = {8 appendExtraHTTPHeaders: (headers) => {9 window.__extraHeaders = headers;10 },11 };12 });13 const page = await context.newPage();14 await page.evaluate(() => {15 window.playwright.appendExtraHTTPHeaders({16 });17 });18 await browser.close();19 }20})();21{22 "headers": {23 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",24 "Accept-Language": "en-US,en;q=0.9",25 "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/85.0.4183.0 Safari/537.36",26 }27}28{29 "headers": {30 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",31 "Accept-Language": "en-US,en;q=0.5",

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const page = await browser.newPage();5 await page.route('**', route => {6 route.continue({7 headers: {8 },9 });10 });11 await browser.close();12})();13User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4298.0 Safari/537.3614Accept-Language: en-US,en;q=0.9,es;q=0.8

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext({5 extraHTTPHeaders: {6 },7 });8 const page = await context.newPage();9 await page.screenshot({ path: `example.png` });10 await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14 const browser = await chromium.launch();15 const context = await browser.newContext();16 await context.appendExtraHTTPHeaders({17 });18 const page = await context.newPage();19 await page.screenshot({ path: `example.png` });20 await browser.close();21})();22const { chromium } = require('playwright');23(async () => {24 const browser = await chromium.launch();25 const context = await browser.newContext();26 await context.appendExtraHTTPHeaders({27 });28 const page = await context.newPage();29 await page.screenshot({ path: `example.png` });30 await browser.close();31})();32const { chromium } = require('playwright');33(async () => {34 const browser = await chromium.launch();35 const context = await browser.newContext();36 await context.appendExtraHTTPHeaders({37 });38 const page = await context.newPage();39 await page.screenshot({ path: `example.png` });40 await browser.close();41})();42const { chromium } = require('playwright');43(async () => {44 const browser = await chromium.launch();45 const context = await browser.newContext();46 await context.appendExtraHTTPHeaders({47 });48 const page = await context.newPage();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 context._browser._connection.send('Network.setExtraHTTPHeaders', {6 headers: { 'X-Test': 'test' }7 });8 const page = await context.newPage();9 await page.screenshot({ path: 'headers.png' });10 await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14 const browser = await chromium.launch();15 const context = await browser.newContext();16 context._browser._connection.send('Network.setExtraHTTPHeaders', {17 headers: { 'X-Test': 'test' }18 });19 const page = await context.newPage();20 await page.screenshot({ path: 'headers2.png' });21 await browser.close();22})();23const { chromium } = require('playwright');24(async () => {25 const browser = await chromium.launch();26 const context = await browser.newContext();27 context._browser._connection.send('Network.setExtraHTTPHeaders', {28 headers: { 'X-Test': 'test' }29 });30 const page = await context.newPage();31 await page.screenshot({ path: 'headers3.png' });32 await browser.close();33})();34const { chromium } = require('playwright');35(async () => {36 const browser = await chromium.launch();37 const context = await browser.newContext();38 context._browser._connection.send('Network.setExtraHTTPHeaders', {39 headers: { 'X-Test': 'test' }40 });41 const page = await context.newPage();42 await page.screenshot({ path: 'headers4.png' });43 await browser.close();44})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({4 extraHTTPHeaders: {5 },6 });7 const context = await browser.newContext();8 await context.appendExtraHTTPHeaders({9 });10 const page = await context.newPage();11 await page.close();12 await context.close();13 await browser.close();14})();15{16 "headers": {17 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36",18 }19}

Full Screen

Using AI Code Generation

copy

Full Screen

1const playwright = require('playwright');2(async () => {3const context = await browser.newContext({ ignoreHTTPSErrors: true });4await context['setExtraHTTPHeaders']({ 'x-custom-header': 'value' });5const page = await context.newPage();6await browser.close();7})();8const playwright = require('playwright');9(async () => {10const context = await browser.newContext({ ignoreHTTPSErrors: true });11await context.addInitScript(() => {12window['playwright'] = {13setExtraHTTPHeaders: (headers) => {14window['playwrightState'].extraHTTPHeaders = headers;15}16};17});18await context.addInitScript(() => {19window['playwright'].setExtraHTTPHeaders({ 'x-custom-header': 'value' });20});21const page = await context.newPage();22await browser.close();23})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2const { InternalRequest } = require('playwright/lib/server/network');3const { URL } = require('url');4(async () => {5 const browser = await chromium.launch();6 const context = await browser.newContext();7 const page = await context.newPage();8 const request = new InternalRequest(page, url, 'GET', null, null);9 request.appendExtraHTTPHeaders({ 'X-Test-Header': 'test' });10 console.log(request.headers());11 await browser.close();12})();13import { chromium } from 'playwright';14import { InternalRequest } from 'playwright/lib/server/network';15import { URL } from 'url';16(async () => {17 const browser = await chromium.launch();18 const context = await browser.newContext();19 const page = await context.newPage();20 const request = new InternalRequest(page, url, 'GET', null, null);21 request.appendExtraHTTPHeaders({ 'X-Test-Header': 'test' });22 console.log(request.headers());23 await browser.close();24})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({4 extraHTTPHeaders: {5 }6 });7 const context = await browser.newContext();8 const page = await context.newPage();9 await browser.close();10})();11const { chromium } = require('playwright');12(async () => {13 const browser = await chromium.launch({14 });15 const context = await browser.newContext({16 extraHTTPHeaders: {17 }18 });19 const page = await context.newPage();20 await browser.close();21})();22const { chromium } = require('playwright');23(async () => {24 const browser = await chromium.launch({25 });26 const context = await browser.newContext();27 const page = await context.newPage({28 extraHTTPHeaders: {29 }30 });31 await browser.close();32})();33const { chromium } = require('playwright');34(async () => {35 const browser = await chromium.launch({36 });37 const context = await browser.newContext({38 extraHTTPHeaders: {39 }40 });41 const page = await context.newPage();42 await browser.close();43})();44const { chromium } = require('playwright');45(async () => {46 const browser = await chromium.launch({47 });48 const context = await browser.newContext({49 extraHTTPHeaders: {50 }51 });52 const page = await context.newPage({53 extraHTTPHeaders: {

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({ headless: false });4 const page = await browser.newPage();5 await page.route('**/*', route => {6 route.continue({7 headers: {8 }9 });10 });11 await browser.close();12})();13const { chromium } = require('playwright');14(async () => {15 const browser = await chromium.launch({ headless: false });16 const page = await browser.newPage();17 await page.route('**/*', route => {18 route.continue({19 headers: {20 }21 });22 });23 await browser.close();24})();25const { chromium } = require('playwright');26(async () => {27 const browser = await chromium.launch({ headless: false });28 const page = await browser.newPage();29 await page.route('**/*', route => {30 route.continue({31 headers: {32 }33 });34 });35 await browser.close();36})();37const { chromium } = require('playwright');38(async () => {39 const browser = await chromium.launch({ headless: false });40 const page = await browser.newPage();41 await page.route('**/*', route => {42 route.continue({43 headers: {44 }45 });46 });47 await browser.close();48})();

Full Screen

Playwright tutorial

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.

Chapters:

  1. What is Playwright : Playwright is comparatively new but has gained good popularity. Get to know some history of the Playwright with some interesting facts connected with it.
  2. How To Install Playwright : Learn in detail about what basic configuration and dependencies are required for installing Playwright and run a test. Get a step-by-step direction for installing the Playwright automation framework.
  3. Playwright Futuristic Features: Launched in 2020, Playwright gained huge popularity quickly because of some obliging features such as Playwright Test Generator and Inspector, Playwright Reporter, Playwright auto-waiting mechanism and etc. Read up on those features to master Playwright testing.
  4. What is Component Testing: Component testing in Playwright is a unique feature that allows a tester to test a single component of a web application without integrating them with other elements. Learn how to perform Component testing on the Playwright automation framework.
  5. Inputs And Buttons In Playwright: Every website has Input boxes and buttons; learn about testing inputs and buttons with different scenarios and examples.
  6. Functions and Selectors in Playwright: Learn how to launch the Chromium browser with Playwright. Also, gain a better understanding of some important functions like “BrowserContext,” which allows you to run multiple browser sessions, and “newPage” which interacts with a page.
  7. Handling Alerts and Dropdowns in Playwright : Playwright interact with different types of alerts and pop-ups, such as simple, confirmation, and prompt, and different types of dropdowns, such as single selector and multi-selector get your hands-on with handling alerts and dropdown in Playright testing.
  8. Playwright vs Puppeteer: Get to know about the difference between two testing frameworks and how they are different than one another, which browsers they support, and what features they provide.
  9. Run Playwright Tests on LambdaTest: Playwright testing with LambdaTest leverages test performance to the utmost. You can run multiple Playwright tests in Parallel with the LammbdaTest test cloud. Get a step-by-step guide to run your Playwright test on the LambdaTest platform.
  10. Playwright Python Tutorial: Playwright automation framework support all major languages such as Python, JavaScript, TypeScript, .NET and etc. However, there are various advantages to Python end-to-end testing with Playwright because of its versatile utility. Get the hang of Playwright python testing with this chapter.
  11. Playwright End To End Testing Tutorial: Get your hands on with Playwright end-to-end testing and learn to use some exciting features such as TraceViewer, Debugging, Networking, Component testing, Visual testing, and many more.
  12. Playwright Video Tutorial: Watch the video tutorials on Playwright testing from experts and get a consecutive in-depth explanation of Playwright automation testing.

Run Playwright Internal automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful