From 34d7a3bd3b67d8c2395c8b7225be9e502f653d56 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 27 Nov 2018 10:57:00 -0700 Subject: [PATCH] [Reporting] Better logging for waitForSelector failure (#25762) * [Reporting] Better logging for waitForSelector failure * break waitForSelector * experimental changes * cleanup/consistency * fix some test report title strings * test disable chromium * roll back test code * take out non-working phantom changes * roll back disable chromium test * allow logger to use curried tags * temporarily re-do report failure-causing change for test * replace newline with escaped for single log line * undo test change * remove obsolete test --- .../export_types/common/lib/screenshots.js | 2 +- .../chromium/driver/chromium_driver.ts | 35 ++++++++++++++++--- x-pack/plugins/reporting/types.d.ts | 1 + x-pack/test/reporting/api/chromium_tests.js | 2 ++ x-pack/test/reporting/api/usage.js | 4 --- x-pack/test/reporting/configs/chromium_api.js | 1 + 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/reporting/export_types/common/lib/screenshots.js b/x-pack/plugins/reporting/export_types/common/lib/screenshots.js index abce45bbe27e37..7e8db794078e2d 100644 --- a/x-pack/plugins/reporting/export_types/common/lib/screenshots.js +++ b/x-pack/plugins/reporting/export_types/common/lib/screenshots.js @@ -60,7 +60,7 @@ export function screenshotsObservableFactory(server) { }; const checkForToastMessage = async (browser, layout) => { - await browser.waitForSelector(layout.selectors.toastHeader); + await browser.waitForSelector(layout.selectors.toastHeader, { silent: true }); const toastHeaderText = await browser.evaluate({ fn: function (selector) { const nodeList = document.querySelectorAll(selector); diff --git a/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts b/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts index b379352ac338e7..fd312140e094fd 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts @@ -21,6 +21,10 @@ export interface ChromiumDriverOptions { logger: Logger; } +interface WaitForSelectorOpts { + silent?: boolean; +} + const WAIT_FOR_DELAY_MS: number = 100; export class HeadlessChromiumDriver { @@ -29,7 +33,7 @@ export class HeadlessChromiumDriver { constructor(page: Chrome.Page, { logger }: ChromiumDriverOptions) { this.page = page; - this.logger = logger; + this.logger = logger.clone(['headless-chromium-driver']); } public async open( @@ -39,7 +43,7 @@ export class HeadlessChromiumDriver { waitForSelector, }: { conditionalHeaders: ConditionalHeaders; waitForSelector: string } ) { - this.logger.debug(`HeadlessChromiumDriver:opening url ${url}`); + this.logger.debug(`opening url ${url}`); await this.page.setRequestInterception(true); this.page.on('request', (interceptedRequest: any) => { if (this._shouldUseCustomHeaders(conditionalHeaders.conditions, interceptedRequest.url())) { @@ -57,7 +61,7 @@ export class HeadlessChromiumDriver { }); await this.page.goto(url, { waitUntil: 'domcontentloaded' }); - await this.page.waitFor(waitForSelector); + await this.waitForSelector(waitForSelector); } public async screenshot(elementPosition: ElementPosition) { @@ -84,8 +88,29 @@ export class HeadlessChromiumDriver { return result; } - public waitForSelector(selector: string) { - return this.page.waitFor(selector); + public async waitForSelector(selector: string, opts: WaitForSelectorOpts = {}) { + const { silent = false } = opts; + this.logger.debug(`waitForSelector ${selector}`); + + let resp; + try { + resp = await this.page.waitFor(selector); + } catch (err) { + if (!silent) { + // Provide some troubleshooting info to see if we're on the login page, + // "Kibana could not load correctly", etc + this.logger.error(`waitForSelector ${selector} failed on ${this.page.url()}`); + const pageText = await this.evaluate({ + fn: () => document.querySelector('body')!.innerText, + args: [], + }); + this.logger.debug(`Page plain text: ${pageText.replace(/\n/g, '\\n')}`); // replace newline with escaped for single log line + } + throw err; + } + + this.logger.debug(`waitForSelector ${selector} resolved`); + return resp; } public async waitFor({ fn, args, toEqual }: { fn: EvalFn; args: EvalArgs; toEqual: T }) { diff --git a/x-pack/plugins/reporting/types.d.ts b/x-pack/plugins/reporting/types.d.ts index c12d03dc2990eb..84d0aad5589109 100644 --- a/x-pack/plugins/reporting/types.d.ts +++ b/x-pack/plugins/reporting/types.d.ts @@ -37,6 +37,7 @@ export interface Logger { debug: (message: string) => void; error: (message: string) => void; warning: (message: string) => void; + clone: (tags: string[]) => Logger; } export interface ViewZoomWidthHeight { diff --git a/x-pack/test/reporting/api/chromium_tests.js b/x-pack/test/reporting/api/chromium_tests.js index c9282eda4f0cc2..b983f290eb085b 100644 --- a/x-pack/test/reporting/api/chromium_tests.js +++ b/x-pack/test/reporting/api/chromium_tests.js @@ -28,6 +28,8 @@ export default function ({ loadTestFile, getService }) { await esArchiver.unload(OSS_DATA_ARCHIVE_PATH); }); + loadTestFile(require.resolve('./bwc_existing_indexes')); loadTestFile(require.resolve('./bwc_generation_urls')); + loadTestFile(require.resolve('./usage')); }); } diff --git a/x-pack/test/reporting/api/usage.js b/x-pack/test/reporting/api/usage.js index a2c207c76f63ad..53f292b7bf7061 100644 --- a/x-pack/test/reporting/api/usage.js +++ b/x-pack/test/reporting/api/usage.js @@ -29,10 +29,6 @@ export default function ({ getService }) { expect(usage.reporting.enabled).to.be(true); }); - it('is using phantom browser', async () => { - expect(usage.reporting.browser_type).to.be('phantom'); - }); - it('all counts are 0', async () => { reportingAPI.expectRecentPdfAppStats(usage, 'visualization', 0); reportingAPI.expectAllTimePdfAppStats(usage, 'visualization', 0); diff --git a/x-pack/test/reporting/configs/chromium_api.js b/x-pack/test/reporting/configs/chromium_api.js index 461c6c0df5271b..1d643c4d359df5 100644 --- a/x-pack/test/reporting/configs/chromium_api.js +++ b/x-pack/test/reporting/configs/chromium_api.js @@ -22,6 +22,7 @@ export default async function ({ readConfigFile }) { ...reportingApiConfig.kbnTestServer.serverArgs, `--xpack.reporting.capture.browser.type=chromium`, `--xpack.spaces.enabled=false`, + `--logging.verbose=true`, ], }, };