Skip to content

Commit a77b72a

Browse files
author
Forest Hoffman
committed
Reduce screenshots to resonable amount
1 parent bb15e38 commit a77b72a

File tree

3 files changed

+45
-24
lines changed

3 files changed

+45
-24
lines changed

test/src/chrome.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ describe("chrome e2e", () => {
4343
afterEach(() => deleteTestFile());
4444

4545
const waitForSidebar = (page: TestPage): Promise<void> => {
46-
return page.rootPage.waitFor(sidebarSelector, { visible: true }).then(() => page.click(sidebarSelector));
46+
return page.rootPage.waitFor(sidebarSelector, { visible: true }).then(() => page.rootPage.click(sidebarSelector));
4747
};
4848

4949
const waitForCommandInput = (page: TestPage): Promise<void> => {
50-
return page.rootPage.waitFor(commandInputSelector, { visible: true }).then(() => page.click(commandInputSelector));
50+
return page.rootPage.waitFor(commandInputSelector, { visible: true }).then(() => page.rootPage.click(commandInputSelector));
5151
};
5252

5353
const workbenchQuickOpen = (page: TestPage): Promise<void> => {

test/src/index.ts

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import * as os from "os";
44
import * as path from "path";
55
import * as puppeteer from "puppeteer";
66
import { ChildProcess, spawn } from "child_process";
7-
import { logger, field } from "@coder/logger";
8-
import { EventEmitter } from 'events';
7+
import { logger, field, Level } from "@coder/logger";
98

109
interface IServerOptions {
1110
host: string;
@@ -142,11 +141,22 @@ export class TestPage {
142141
* Screenshot path will be in the following format:
143142
* `<screenshotDir>/[<page-tag>_]<screenshot-number>_<screenshot-name>.jpg`.
144143
*/
145-
public screenshot(name: string, options?: puppeteer.ScreenshotOptions): Promise<string | Buffer> {
146-
options = Object.assign({ path: path.resolve(TestServer.puppeteerDir, `./${this.tag ? `${this.tag}_` : ""}${this.screenshotCount}_${name}.jpg`), fullPage: true }, options);
147-
const img = this.rootPage.screenshot(options);
144+
public async screenshot(name: string, options?: puppeteer.ScreenshotOptions): Promise<string | Buffer> {
145+
let debugCI = logger.level === Level.Debug && process.env.TRAVIS_BUILD_NUMBER;
146+
let tag = this.tag ? `${this.tag}_` : "";
147+
if (debugCI) {
148+
tag = `TRAVIS-${process.env.TRAVIS_BUILD_NUMBER}_${tag}`;
149+
}
150+
options = Object.assign({ path: path.resolve(TestServer.puppeteerDir, `./${tag}${this.screenshotCount}_${name}.jpg`), fullPage: true }, options);
151+
const img = await this.rootPage.screenshot(options);
148152
this.screenshotCount++;
149153

154+
if (debugCI) {
155+
// TODO: upload to imgur.
156+
const url = "";
157+
logger.debug("captured screenshot", field("path", options.path), field("url", url));
158+
}
159+
150160
return img;
151161
}
152162

@@ -157,9 +167,18 @@ export class TestPage {
157167
*/
158168
// tslint:disable-next-line:no-any
159169
public async recordFunc(fn: Function, ...args: any[]): Promise<any> {
160-
await this.screenshot(`${fn.name}_before`);
170+
let err: Error | undefined;
171+
if (typeof fn !== "function" || fn.name === "") {
172+
err = new Error(JSON.stringify(fn));
173+
logger.debug("cannot record nameless function", field("trace", err.stack));
174+
}
175+
if (!err) {
176+
await this.screenshot(`${fn.name}_before`);
177+
}
161178
const result = await fn.apply(this.rootPage, args);
162-
await this.screenshot(`${fn.name}_after`);
179+
if (!err) {
180+
await this.screenshot(`${fn.name}_after`);
181+
}
163182

164183
return result;
165184
}
@@ -179,10 +198,10 @@ export class TestPage {
179198
*/
180199
public waitFor(durationOrSelector: number | string, options?: puppeteer.WaitForSelectorOptionsHidden | puppeteer.WaitForSelectorOptions): Promise<puppeteer.ElementHandle | null | void> {
181200
if (typeof durationOrSelector === "number") {
182-
return this.recordFunc(this.rootPage.waitFor, durationOrSelector);
201+
return this.rootPage.waitFor(durationOrSelector);
183202
}
184203

185-
return this.recordFunc(this.rootPage.waitFor, durationOrSelector, options);
204+
return this.rootPage.waitFor(durationOrSelector, options);
186205
}
187206

188207
/**
@@ -359,14 +378,17 @@ export class TestServer {
359378
* runner context.
360379
*/
361380
// tslint:disable-next-line:no-any
362-
public async querySelectorAll(page: TestPage, selector: string): Promise<Array<DeserializedNode>> {
381+
public async querySelectorAll(page: puppeteer.Page | TestPage, selector: string): Promise<Array<DeserializedNode>> {
363382
if (!selector) {
364383
throw new Error("selector undefined");
365384
}
366385

367386
// tslint:disable-next-line:no-any
368387
const elements: Array<DeserializedNode> = [];
369-
const serializedElements = await page.rootPage.evaluate((selector) => {
388+
if (page instanceof TestPage) {
389+
page = page.rootPage;
390+
}
391+
const serializedElements = await page.evaluate((selector) => {
370392
// tslint:disable-next-line:no-any
371393
return new Promise<Array<string>>((res, rej): void => {
372394
const elements = Array.from(document.querySelectorAll(selector));
@@ -396,7 +418,7 @@ export class TestServer {
396418
* Get an element on the page. See `TestServer.querySelectorAll`.
397419
*/
398420
// tslint:disable-next-line:no-any
399-
public async querySelector(page: TestPage, selector: string): Promise<DeserializedNode> {
421+
public async querySelector(page: puppeteer.Page | TestPage, selector: string): Promise<DeserializedNode> {
400422
if (!selector) {
401423
throw new Error("selector undefined");
402424
}

test/src/startup.test.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { TestServer, TestPage } from "./index";
1+
import * as puppeteer from "puppeteer";
2+
import { TestServer } from "./index";
23

34
describe("startup e2e", () => {
45
jest.setTimeout(20000);
@@ -24,7 +25,7 @@ describe("startup e2e", () => {
2425
}
2526
});
2627

27-
const expectEditor = async (server: TestServer, page: TestPage): Promise<void> => {
28+
const expectEditor = async (server: TestServer, page: puppeteer.Page): Promise<void> => {
2829
// Editor should be visible.
2930
await page.waitFor("div.part.editor");
3031
const editor = await server.querySelector(page, "div.part.editor");
@@ -39,7 +40,7 @@ describe("startup e2e", () => {
3940
const server = servers["--port"];
4041
await server.start();
4142
const page = await server.newPage()
42-
.then(server.loadPage.bind(server));
43+
await page.goto(server.url);
4344

4445
await expectEditor(server, page);
4546
});
@@ -49,16 +50,14 @@ describe("startup e2e", () => {
4950
await server.start({ ignoreHTTPSErrors: true });
5051
const page = await server.newPage();
5152
await page.goto(server.url);
52-
await page.waitFor(1000);
53-
const testPage = new TestPage(page, "requirePassword");
5453

5554
// Enter password.
5655
expect(server.options.password).toBeTruthy();
57-
await testPage.waitFor("input#password");
58-
await testPage.click("input#password");
59-
await testPage.keyboard.type(server.options.password, { delay: 100 });
60-
await testPage.click("button#submit");
56+
await page.waitFor("input#password");
57+
await page.click("input#password");
58+
await page.keyboard.type(server.options.password, { delay: 100 });
59+
await page.click("button#submit");
6160

62-
await expectEditor(server, testPage);
61+
await expectEditor(server, page);
6362
});
6463
});

0 commit comments

Comments
 (0)