| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright 2018 Google Inc. All rights reserved. | 
					
						
							|  |  |  |  * Modifications copyright (c) Microsoft Corporation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-07 09:00:51 -07:00
										 |  |  | import type { Route, Request } from 'playwright-core'; | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | import { expect, test as base } from './pageTest'; | 
					
						
							| 
									
										
										
										
											2021-11-13 00:29:51 -08:00
										 |  |  | import fs from 'fs'; | 
					
						
							|  |  |  | import path from 'path'; | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-30 17:26:19 -08:00
										 |  |  | // We access test servers at 10.0.2.2 from inside the browser on Android,
 | 
					
						
							|  |  |  | // which is actually forwarded to the desktop localhost.
 | 
					
						
							|  |  |  | // To use request such an url with apiRequestContext on the desktop, we need to change it back to localhost.
 | 
					
						
							|  |  |  | const it = base.extend<{ rewriteAndroidLoopbackURL(url: string): string }>({ | 
					
						
							|  |  |  |   rewriteAndroidLoopbackURL: ({ isAndroid }, use) => use(givenURL => { | 
					
						
							|  |  |  |     if (!isAndroid) | 
					
						
							|  |  |  |       return givenURL; | 
					
						
							|  |  |  |     const requestURL = new URL(givenURL); | 
					
						
							|  |  |  |     requestURL.hostname = 'localhost'; | 
					
						
							|  |  |  |     return requestURL.toString(); | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | it('should fulfill intercepted response', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							| 
									
										
										
										
											2021-11-04 13:36:04 -07:00
										 |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   await page.route('**/*', async route => { | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |     const response = await page.request.fetch(route.request()); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |     await route.fulfill({ | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |       response, | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |       status: 201, | 
					
						
							|  |  |  |       headers: { | 
					
						
							|  |  |  |         foo: 'bar' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       contentType: 'text/plain', | 
					
						
							|  |  |  |       body: 'Yo, page!' | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/empty.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(response.headers().foo).toBe('bar'); | 
					
						
							|  |  |  |   expect(response.headers()['content-type']).toBe('text/plain'); | 
					
						
							|  |  |  |   expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-28 15:41:32 +02:00
										 |  |  | it('should fulfill response with empty body', async ({ page, server, isAndroid, isElectron, browserName, browserMajorVersion }) => { | 
					
						
							| 
									
										
										
										
											2022-02-26 00:17:37 +01:00
										 |  |  |   it.skip(browserName === 'chromium' && browserMajorVersion <= 91, 'Fails in Electron that uses old Chromium'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							| 
									
										
										
										
											2022-07-28 15:41:32 +02:00
										 |  |  |   it.skip(isElectron, 'Protocol error (Storage.getCookies): Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2021-08-11 14:47:05 -07:00
										 |  |  |   await page.route('**/*', async route => { | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |     const response = await page.request.fetch(route.request()); | 
					
						
							| 
									
										
										
										
											2021-08-11 14:47:05 -07:00
										 |  |  |     await route.fulfill({ | 
					
						
							| 
									
										
										
										
											2021-08-27 00:44:20 +02:00
										 |  |  |       response, | 
					
						
							| 
									
										
										
										
											2022-06-16 21:07:43 -08:00
										 |  |  |       headers: { 'content-length': '0' }, | 
					
						
							| 
									
										
										
										
											2021-08-11 14:47:05 -07:00
										 |  |  |       status: 201, | 
					
						
							|  |  |  |       body: '' | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/title.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(await response.text()).toBe(''); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | it('should override with defaults when intercepted response not provided', async ({ page, server, browserName, isElectron, isAndroid }) => { | 
					
						
							| 
									
										
										
										
											2021-11-04 13:36:04 -07:00
										 |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  |   server.setRoute('/empty.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('foo', 'bar'); | 
					
						
							|  |  |  |     res.end('my content'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |     await page.request.fetch(route.request()); | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  |     await route.fulfill({ | 
					
						
							|  |  |  |       status: 201, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(await response.text()).toBe(''); | 
					
						
							|  |  |  |   if (browserName === 'webkit') | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  |     expect(response.headers()).toEqual({ 'content-type': 'text/plain' }); | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  |   else | 
					
						
							|  |  |  |     expect(response.headers()).toEqual({ }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | it('should fulfill with any response', async ({ page, server, isElectron, rewriteAndroidLoopbackURL }) => { | 
					
						
							| 
									
										
										
										
											2021-11-04 13:36:04 -07:00
										 |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   server.setRoute('/sample', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('foo', 'bar'); | 
					
						
							|  |  |  |     res.end('Woo-hoo'); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   const sampleResponse = await page.request.get(rewriteAndroidLoopbackURL(`${server.PREFIX}/sample`)); | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     await route.fulfill({ | 
					
						
							| 
									
										
										
										
											2021-08-27 00:44:20 +02:00
										 |  |  |       response: sampleResponse, | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  |       status: 201, | 
					
						
							| 
									
										
										
										
											2021-08-24 17:34:29 -07:00
										 |  |  |       contentType: 'text/plain' | 
					
						
							| 
									
										
										
										
											2021-08-24 11:07:54 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(await response.text()).toBe('Woo-hoo'); | 
					
						
							|  |  |  |   expect(response.headers()['foo']).toBe('bar'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | it('should support fulfill after intercept', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							| 
									
										
										
										
											2021-11-04 13:36:04 -07:00
										 |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							| 
									
										
										
										
											2021-08-03 15:29:51 -07:00
										 |  |  |   const requestPromise = server.waitForRequest('/title.html'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   await page.route('**', async route => { | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |     const response = await page.request.fetch(route.request()); | 
					
						
							| 
									
										
										
										
											2021-08-27 00:44:20 +02:00
										 |  |  |     await route.fulfill({ response }); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2021-08-03 15:29:51 -07:00
										 |  |  |   const response = await page.goto(server.PREFIX + '/title.html'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   const request = await requestPromise; | 
					
						
							| 
									
										
										
										
											2021-08-03 15:29:51 -07:00
										 |  |  |   expect(request.url).toBe('/title.html'); | 
					
						
							| 
									
										
										
										
											2021-11-13 00:29:51 -08:00
										 |  |  |   const original = await fs.promises.readFile(path.join(__dirname, '..', 'assets', 'title.html'), 'utf8'); | 
					
						
							|  |  |  |   expect(await response.text()).toBe(original); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | it('should give access to the intercepted response', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							| 
									
										
										
										
											2021-11-04 13:36:04 -07:00
										 |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let routeCallback; | 
					
						
							|  |  |  |   const routePromise = new Promise<Route>(f => routeCallback = f); | 
					
						
							|  |  |  |   await page.route('**/title.html', routeCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 16:28:42 -07:00
										 |  |  |   const evalPromise = page.evaluate(url => fetch(url), server.PREFIX + '/title.html'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const route = await routePromise; | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |   const response = await page.request.fetch(route.request()); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   expect(response.status()).toBe(200); | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |   expect(response.statusText()).toBe('OK'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   expect(response.ok()).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   expect(response.url().endsWith('/title.html')).toBe(true); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   expect(response.headers()['content-type']).toBe('text/html; charset=utf-8'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   expect(response.headersArray().filter(({ name }) => name.toLowerCase() === 'content-type')).toEqual([{ name: 'Content-Type', value: 'text/html; charset=utf-8' }]); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 00:44:20 +02:00
										 |  |  |   await Promise.all([route.fulfill({ response }), evalPromise]); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  | it('should give access to the intercepted response body', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							| 
									
										
										
										
											2021-11-04 13:36:04 -07:00
										 |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let routeCallback; | 
					
						
							|  |  |  |   const routePromise = new Promise<Route>(f => routeCallback = f); | 
					
						
							|  |  |  |   await page.route('**/simple.json', routeCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 07:28:53 -08:00
										 |  |  |   const evalPromise = page.evaluate(url => fetch(url), server.PREFIX + '/simple.json').catch(() => {}); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const route = await routePromise; | 
					
						
							| 
									
										
										
										
											2021-11-02 17:48:38 -07:00
										 |  |  |   const response = await page.request.fetch(route.request()); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 22:56:51 +01:00
										 |  |  |   expect(await response.text()).toBe('{"foo": "bar"}\n'); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 00:44:20 +02:00
										 |  |  |   await Promise.all([route.fulfill({ response }), evalPromise]); | 
					
						
							| 
									
										
										
										
											2021-06-18 11:04:48 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-06-07 09:00:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | it('should intercept multipart/form-data request body', async ({ page, server, asset, browserName }) => { | 
					
						
							|  |  |  |   it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/14624' }); | 
					
						
							|  |  |  |   it.fail(browserName !== 'firefox'); | 
					
						
							|  |  |  |   await page.goto(server.PREFIX + '/input/fileupload.html'); | 
					
						
							|  |  |  |   const filePath = path.relative(process.cwd(), asset('file-to-upload.txt')); | 
					
						
							|  |  |  |   await page.locator('input[type=file]').setInputFiles(filePath); | 
					
						
							|  |  |  |   const requestPromise = new Promise<Request>(async fulfill => { | 
					
						
							|  |  |  |     await page.route('**/upload', route => { | 
					
						
							|  |  |  |       fulfill(route.request()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const [request] = await Promise.all([ | 
					
						
							|  |  |  |     requestPromise, | 
					
						
							|  |  |  |     page.click('input[type=submit]', { noWaitAfter: true }) | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  |   expect(request.method()).toBe('POST'); | 
					
						
							|  |  |  |   expect(request.postData()).toContain(fs.readFileSync(filePath, 'utf8')); | 
					
						
							| 
									
										
										
										
											2022-11-30 17:26:19 -08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | it('should fulfill intercepted response using alias', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							|  |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							|  |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     const response = await route.fetch(); | 
					
						
							|  |  |  |     await route.fulfill({ response }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/empty.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(200); | 
					
						
							|  |  |  |   expect(response.headers()['content-type']).toContain('text/html'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-21 01:41:33 +10:00
										 |  |  | it('should support timeout option in route.fetch', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							|  |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							|  |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   server.setRoute('/slow', (req, res) => { | 
					
						
							|  |  |  |     res.writeHead(200, { | 
					
						
							|  |  |  |       'content-length': 4096, | 
					
						
							|  |  |  |       'content-type': 'text/html', | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     const error = await route.fetch({ timeout: 1000 }).catch(e => e); | 
					
						
							|  |  |  |     expect(error.message).toContain(`Request timed out after 1000ms`); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const error = await page.goto(server.PREFIX + '/slow', { timeout: 2000 }).catch(e => e); | 
					
						
							|  |  |  |   expect(error.message).toContain(`Timeout 2000ms exceeded`); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-01 14:43:21 -08:00
										 |  |  | it('should not follow redirects when maxRedirects is set to 0 in route.fetch', async ({ page, server, isAndroid, isElectron }) => { | 
					
						
							|  |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							|  |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   server.setRedirect('/foo', '/empty.html'); | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     const response = await route.fetch({ maxRedirects: 0 }); | 
					
						
							|  |  |  |     expect(response.headers()['location']).toBe('/empty.html'); | 
					
						
							|  |  |  |     expect(response.status()).toBe(302); | 
					
						
							|  |  |  |     await route.fulfill({ body: 'hello' }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.PREFIX + '/foo'); | 
					
						
							|  |  |  |   expect(await page.content()).toContain('hello'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-30 17:26:19 -08:00
										 |  |  | it('should intercept with url override', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							|  |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							|  |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							|  |  |  |   await page.route('**/*.html', async route => { | 
					
						
							|  |  |  |     const response = await route.fetch({ url: server.PREFIX + '/one-style.html' }); | 
					
						
							|  |  |  |     await route.fulfill({ response }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/empty.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(200); | 
					
						
							|  |  |  |   expect((await response.body()).toString()).toContain('one-style.css'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | it('should intercept with post data override', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							|  |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							|  |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							|  |  |  |   const requestPromise = server.waitForRequest('/empty.html'); | 
					
						
							|  |  |  |   await page.route('**/*.html', async route => { | 
					
						
							|  |  |  |     const response = await route.fetch({ | 
					
						
							| 
									
										
										
										
											2022-12-13 14:01:39 -08:00
										 |  |  |       postData: { 'foo': 'bar' }, | 
					
						
							| 
									
										
										
										
											2022-11-30 17:26:19 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  |     await route.fulfill({ response }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.PREFIX + '/empty.html'); | 
					
						
							|  |  |  |   const request = await requestPromise; | 
					
						
							|  |  |  |   expect((await request.postBody).toString()).toBe(JSON.stringify({ 'foo': 'bar' })); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-08-21 16:48:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | it('should fulfill popup main request using alias', async ({ page, server, isElectron, isAndroid }) => { | 
					
						
							|  |  |  |   it.fixme(isElectron, 'error: Browser context management is not supported.'); | 
					
						
							|  |  |  |   it.skip(isAndroid, 'The internal Android localhost (10.0.0.2) != the localhost on the host'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.context().route('**/*', async route => { | 
					
						
							|  |  |  |     const response = await route.fetch(); | 
					
						
							|  |  |  |     await route.fulfill({ response, body: 'hello' }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.setContent(`<a target=_blank href="${server.EMPTY_PAGE}">click me</a>`); | 
					
						
							|  |  |  |   const [popup] = await Promise.all([ | 
					
						
							|  |  |  |     page.waitForEvent('popup'), | 
					
						
							|  |  |  |     page.getByText('click me').click(), | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  |   await expect(popup.locator('body')).toHaveText('hello'); | 
					
						
							|  |  |  | }); |