| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright 2018 Google Inc. All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-09-26 16:05:58 -07:00
										 |  |  | import { it, expect, describe } from '../fixtures'; | 
					
						
							| 
									
										
										
										
											2020-08-28 04:20:29 -07:00
										 |  |  | import type { ChromiumBrowserContext, ChromiumBrowser } from '../../types/types'; | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-26 16:05:58 -07:00
										 |  |  | describe('session', (suite, { browserName }) => { | 
					
						
							|  |  |  |   suite.skip(browserName !== 'chromium'); | 
					
						
							| 
									
										
										
										
											2020-08-28 15:45:09 -07:00
										 |  |  | }, () => { | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should work', async function({page}) { | 
					
						
							|  |  |  |     const client = await (page.context() as ChromiumBrowserContext).newCDPSession(page); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     await Promise.all([ | 
					
						
							|  |  |  |       client.send('Runtime.enable'), | 
					
						
							|  |  |  |       client.send('Runtime.evaluate', { expression: 'window.foo = "bar"' }) | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |     const foo = await page.evaluate(() => window['foo']); | 
					
						
							|  |  |  |     expect(foo).toBe('bar'); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should send events', async function({page, server}) { | 
					
						
							|  |  |  |     const client = await (page.context() as ChromiumBrowserContext).newCDPSession(page); | 
					
						
							|  |  |  |     await client.send('Network.enable'); | 
					
						
							|  |  |  |     const events = []; | 
					
						
							|  |  |  |     client.on('Network.requestWillBeSent', event => events.push(event)); | 
					
						
							|  |  |  |     await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |     expect(events.length).toBe(1); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should only accept a page', async function({page}) { | 
					
						
							| 
									
										
										
										
											2020-09-09 03:06:52 -07:00
										 |  |  |     // @ts-expect-error newCDPSession expects a Page
 | 
					
						
							|  |  |  |     const error = await (page.context() as ChromiumBrowserContext).newCDPSession(page.context()).catch(e => e); | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     expect(error.message).toContain('page: expected Page'); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-07 15:40:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should enable and disable domains independently', async function({page}) { | 
					
						
							|  |  |  |     const client = await (page.context() as ChromiumBrowserContext).newCDPSession(page); | 
					
						
							|  |  |  |     await client.send('Runtime.enable'); | 
					
						
							|  |  |  |     await client.send('Debugger.enable'); | 
					
						
							|  |  |  |     // JS coverage enables and then disables Debugger domain.
 | 
					
						
							|  |  |  |     await page.coverage.startJSCoverage(); | 
					
						
							|  |  |  |     await page.coverage.stopJSCoverage(); | 
					
						
							|  |  |  |     page.on('console', console.log); | 
					
						
							|  |  |  |     // generate a script in page and wait for the event.
 | 
					
						
							|  |  |  |     await Promise.all([ | 
					
						
							|  |  |  |       new Promise(f => client.on('Debugger.scriptParsed', event => { | 
					
						
							|  |  |  |         if (event.url === 'foo.js') | 
					
						
							|  |  |  |           f(); | 
					
						
							|  |  |  |       })), | 
					
						
							|  |  |  |       page.evaluate('//# sourceURL=foo.js') | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should be able to detach session', async function({page}) { | 
					
						
							|  |  |  |     const client = await (page.context() as ChromiumBrowserContext).newCDPSession(page); | 
					
						
							|  |  |  |     await client.send('Runtime.enable'); | 
					
						
							|  |  |  |     const evalResponse = await client.send('Runtime.evaluate', {expression: '1 + 2', returnByValue: true}); | 
					
						
							|  |  |  |     expect(evalResponse.result.value).toBe(3); | 
					
						
							|  |  |  |     await client.detach(); | 
					
						
							|  |  |  |     let error = null; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       await client.send('Runtime.evaluate', {expression: '3 + 1', returnByValue: true}); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       error = e; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-02 13:06:54 -08:00
										 |  |  |     expect(error.message).toContain('Target page, context or browser has been closed'); | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should throw nice errors', async function({page}) { | 
					
						
							|  |  |  |     const client = await (page.context() as ChromiumBrowserContext).newCDPSession(page); | 
					
						
							|  |  |  |     const error = await theSourceOfTheProblems().catch(error => error); | 
					
						
							|  |  |  |     expect(error.stack).toContain('theSourceOfTheProblems'); | 
					
						
							|  |  |  |     expect(error.message).toContain('ThisCommand.DoesNotExist'); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     async function theSourceOfTheProblems() { | 
					
						
							| 
									
										
										
										
											2020-09-09 03:06:52 -07:00
										 |  |  |       // @ts-expect-error invalid command
 | 
					
						
							|  |  |  |       await client.send('ThisCommand.DoesNotExist'); | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should not break page.close()', async function({browser}) { | 
					
						
							|  |  |  |     const context = await browser.newContext(); | 
					
						
							|  |  |  |     const page = await context.newPage(); | 
					
						
							|  |  |  |     const session = await (page.context() as ChromiumBrowserContext).newCDPSession(page); | 
					
						
							|  |  |  |     await session.detach(); | 
					
						
							|  |  |  |     await page.close(); | 
					
						
							|  |  |  |     await context.close(); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |   it('should detach when page closes', async function({browser}) { | 
					
						
							|  |  |  |     const context = await browser.newContext() as ChromiumBrowserContext; | 
					
						
							|  |  |  |     const page = await context.newPage(); | 
					
						
							|  |  |  |     const session = await context.newCDPSession(page); | 
					
						
							|  |  |  |     await page.close(); | 
					
						
							|  |  |  |     let error; | 
					
						
							|  |  |  |     await session.detach().catch(e => error = e); | 
					
						
							|  |  |  |     expect(error).toBeTruthy(); | 
					
						
							|  |  |  |     await context.close(); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-24 18:28:22 -03:00
										 |  |  |   it('should work with newBrowserCDPSession', async function({browser}) { | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     const session = await (browser as ChromiumBrowser).newBrowserCDPSession(); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     const version = await session.send('Browser.getVersion'); | 
					
						
							|  |  |  |     expect(version.userAgent).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     let gotEvent = false; | 
					
						
							|  |  |  |     session.on('Target.targetCreated', () => gotEvent = true); | 
					
						
							|  |  |  |     await session.send('Target.setDiscoverTargets', { discover: true }); | 
					
						
							|  |  |  |     expect(gotEvent).toBe(true); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 13:53:47 -07:00
										 |  |  |     await session.detach(); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-08-04 15:57:25 -07:00
										 |  |  | }); |