| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-26 10:59:27 -07:00
										 |  |  | import { it, expect } from './fixtures'; | 
					
						
							| 
									
										
										
										
											2021-01-13 17:02:53 -08:00
										 |  |  | import type * as trace from '../src/trace/traceTypes'; | 
					
						
							| 
									
										
										
										
											2021-02-11 06:36:15 -08:00
										 |  |  | import path from 'path'; | 
					
						
							|  |  |  | import fs from 'fs'; | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 00:38:36 -08:00
										 |  |  | it('should record trace', (test, { browserName, platform }) => { | 
					
						
							|  |  |  |   test.fixme(); | 
					
						
							|  |  |  | }, async ({browser, testInfo, server}) => { | 
					
						
							| 
									
										
										
										
											2021-01-20 19:16:23 -08:00
										 |  |  |   const traceDir = testInfo.outputPath('trace'); | 
					
						
							|  |  |  |   const context = await browser.newContext({ _traceDir: traceDir } as any); | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  |   const page = await context.newPage(); | 
					
						
							|  |  |  |   const url = server.PREFIX + '/snapshot/snapshot-with-css.html'; | 
					
						
							|  |  |  |   await page.goto(url); | 
					
						
							| 
									
										
										
										
											2021-01-25 18:44:46 -08:00
										 |  |  |   await page.click('textarea'); | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  |   await context.close(); | 
					
						
							| 
									
										
										
										
											2021-01-20 19:16:23 -08:00
										 |  |  |   const tracePath = path.join(traceDir, fs.readdirSync(traceDir).find(n => n.endsWith('.trace'))); | 
					
						
							| 
									
										
										
										
											2020-10-01 11:06:19 -07:00
										 |  |  |   const traceFileContent = await fs.promises.readFile(tracePath, 'utf8'); | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  |   const traceEvents = traceFileContent.split('\n').filter(line => !!line).map(line => JSON.parse(line)) as trace.TraceEvent[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const contextEvent = traceEvents.find(event => event.type === 'context-created') as trace.ContextCreatedTraceEvent; | 
					
						
							|  |  |  |   expect(contextEvent).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2021-01-28 19:50:57 +01:00
										 |  |  |   expect(contextEvent.debugName).toBeUndefined(); | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  |   const contextId = contextEvent.contextId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const pageEvent = traceEvents.find(event => event.type === 'page-created') as trace.PageCreatedTraceEvent; | 
					
						
							|  |  |  |   expect(pageEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(pageEvent.contextId).toBe(contextId); | 
					
						
							|  |  |  |   const pageId = pageEvent.pageId; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 14:44:48 -08:00
										 |  |  |   const gotoEvent = traceEvents.find(event => event.type === 'action' && event.method === 'goto') as trace.ActionTraceEvent; | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  |   expect(gotoEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(gotoEvent.contextId).toBe(contextId); | 
					
						
							|  |  |  |   expect(gotoEvent.pageId).toBe(pageId); | 
					
						
							| 
									
										
										
										
											2021-02-09 14:44:48 -08:00
										 |  |  |   expect(gotoEvent.params.url).toBe(url); | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 20:06:05 +01:00
										 |  |  |   const resourceEvent = traceEvents.find(event => event.type === 'resource' && event.url.endsWith('/frames/style.css')) as trace.NetworkResourceTraceEvent; | 
					
						
							|  |  |  |   expect(resourceEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(resourceEvent.contextId).toBe(contextId); | 
					
						
							|  |  |  |   expect(resourceEvent.pageId).toBe(pageId); | 
					
						
							|  |  |  |   expect(resourceEvent.method).toBe('GET'); | 
					
						
							|  |  |  |   expect(resourceEvent.status).toBe(200); | 
					
						
							|  |  |  |   expect(resourceEvent.requestHeaders).toBeTruthy(); | 
					
						
							|  |  |  |   expect(resourceEvent.requestHeaders.length).toBeGreaterThan(0); | 
					
						
							|  |  |  |   expect(resourceEvent.requestSha1).toBe('none'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 14:44:48 -08:00
										 |  |  |   const clickEvent = traceEvents.find(event => event.type === 'action' && event.method === 'click') as trace.ActionTraceEvent; | 
					
						
							| 
									
										
										
										
											2021-01-25 18:44:46 -08:00
										 |  |  |   expect(clickEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(clickEvent.snapshots.length).toBe(2); | 
					
						
							|  |  |  |   const snapshotId = clickEvent.snapshots[0].snapshotId; | 
					
						
							|  |  |  |   const snapshotEvent = traceEvents.find(event => event.type === 'snapshot' && event.snapshotId === snapshotId) as trace.FrameSnapshotTraceEvent; | 
					
						
							| 
									
										
										
										
											2021-01-27 19:42:51 -08:00
										 |  |  |   expect(snapshotEvent).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2020-09-18 11:54:00 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-01-26 20:06:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-27 22:31:46 -08:00
										 |  |  | it('should record trace with POST', (test, { browserName, platform }) => { | 
					
						
							|  |  |  |   test.fixme(); | 
					
						
							|  |  |  | }, async ({browser, testInfo, server}) => { | 
					
						
							| 
									
										
										
										
											2021-01-26 20:06:05 +01:00
										 |  |  |   const traceDir = testInfo.outputPath('trace'); | 
					
						
							|  |  |  |   const context = await browser.newContext({ _traceDir: traceDir } as any); | 
					
						
							|  |  |  |   const page = await context.newPage(); | 
					
						
							|  |  |  |   const url = server.PREFIX + '/trace-resources.html'; | 
					
						
							|  |  |  |   await page.goto(url); | 
					
						
							|  |  |  |   await page.click('text=Download'); | 
					
						
							|  |  |  |   await page.waitForSelector(`#response-status:text("404")`); | 
					
						
							|  |  |  |   await context.close(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const tracePath = path.join(traceDir, fs.readdirSync(traceDir).find(n => n.endsWith('.trace'))); | 
					
						
							|  |  |  |   const traceFileContent = await fs.promises.readFile(tracePath, 'utf8'); | 
					
						
							|  |  |  |   const traceEvents = traceFileContent.split('\n').filter(line => !!line).map(line => JSON.parse(line)) as trace.TraceEvent[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const contextEvent = traceEvents.find(event => event.type === 'context-created') as trace.ContextCreatedTraceEvent; | 
					
						
							|  |  |  |   expect(contextEvent).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2021-01-28 19:50:57 +01:00
										 |  |  |   expect(contextEvent.debugName).toBeUndefined(); | 
					
						
							| 
									
										
										
										
											2021-01-26 20:06:05 +01:00
										 |  |  |   const contextId = contextEvent.contextId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const pageEvent = traceEvents.find(event => event.type === 'page-created') as trace.PageCreatedTraceEvent; | 
					
						
							|  |  |  |   expect(pageEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(pageEvent.contextId).toBe(contextId); | 
					
						
							|  |  |  |   const pageId = pageEvent.pageId; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 14:44:48 -08:00
										 |  |  |   const gotoEvent = traceEvents.find(event => event.type === 'action' && event.method === 'goto') as trace.ActionTraceEvent; | 
					
						
							| 
									
										
										
										
											2021-01-26 20:06:05 +01:00
										 |  |  |   expect(gotoEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(gotoEvent.contextId).toBe(contextId); | 
					
						
							|  |  |  |   expect(gotoEvent.pageId).toBe(pageId); | 
					
						
							| 
									
										
										
										
											2021-02-09 14:44:48 -08:00
										 |  |  |   expect(gotoEvent.params.url).toBe(url); | 
					
						
							| 
									
										
										
										
											2021-01-26 20:06:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const resourceEvent = traceEvents.find(event => event.type === 'resource' && event.url.endsWith('/file.json')) as trace.NetworkResourceTraceEvent; | 
					
						
							|  |  |  |   expect(resourceEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(resourceEvent.contextId).toBe(contextId); | 
					
						
							|  |  |  |   expect(resourceEvent.pageId).toBe(pageId); | 
					
						
							|  |  |  |   expect(resourceEvent.method).toBe('POST'); | 
					
						
							|  |  |  |   expect(resourceEvent.status).toBe(404); | 
					
						
							|  |  |  |   expect(resourceEvent.requestHeaders).toBeTruthy(); | 
					
						
							|  |  |  |   expect(resourceEvent.requestHeaders.length).toBeGreaterThan(0); | 
					
						
							|  |  |  |   expect(resourceEvent.requestSha1).toBeTruthy(); | 
					
						
							|  |  |  |   expect(resourceEvent.responseSha1).toBeTruthy(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(fs.existsSync(path.join(traceDir, 'resources', resourceEvent.requestSha1))).toBe(true); | 
					
						
							|  |  |  |   expect(fs.existsSync(path.join(traceDir, 'resources', resourceEvent.responseSha1))).toBe(true); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-01-28 19:50:57 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | it('should record trace with a debugName', (test, { browserName, platform }) => { | 
					
						
							|  |  |  |   test.fixme(); | 
					
						
							|  |  |  | }, async ({browser, testInfo, server}) => { | 
					
						
							|  |  |  |   const traceDir = testInfo.outputPath('trace'); | 
					
						
							|  |  |  |   const debugName = 'Custom testcase name'; | 
					
						
							|  |  |  |   const context = await browser.newContext({ _traceDir: traceDir, _debugName: debugName } as any); | 
					
						
							|  |  |  |   await context.close(); | 
					
						
							|  |  |  |   const tracePath = path.join(traceDir, fs.readdirSync(traceDir).find(n => n.endsWith('.trace'))); | 
					
						
							|  |  |  |   const traceFileContent = await fs.promises.readFile(tracePath, 'utf8'); | 
					
						
							|  |  |  |   const traceEvents = traceFileContent.split('\n').filter(line => !!line).map(line => JSON.parse(line)) as trace.TraceEvent[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const contextEvent = traceEvents.find(event => event.type === 'context-created') as trace.ContextCreatedTraceEvent; | 
					
						
							|  |  |  |   expect(contextEvent).toBeTruthy(); | 
					
						
							|  |  |  |   expect(contextEvent.debugName).toBe(debugName); | 
					
						
							| 
									
										
										
										
											2021-02-11 06:36:15 -08:00
										 |  |  | }); |