Skip to content

Commit ce02041

Browse files
szuendDevtools-frontend LUCI CQ
authored andcommitted
[e2e] Port console filter resetting test to non hosted mode
Note that since the test is flaky we don't port it 1:1. The 'getConsoleMessages' helper is rather terrible: It also navigates, it has a random 100ms timeout and then just reads the console messages that are there at that point in time. Instead, the new test waits until the expected number of messages have appeared. Filters, waits for the new number of messages, removes the filter and check that we are back to the original number. This should be more robust, and more importantly: no more random timeout. Bug: 416522177 Change-Id: I94e5f0e6657328d568725960f8766a4a68e511cd Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6615239 Reviewed-by: Alex Rudenko <[email protected]> Commit-Queue: Simon Zünd <[email protected]>
1 parent 2593106 commit ce02041

File tree

4 files changed

+49
-45
lines changed

4 files changed

+49
-45
lines changed

test/e2e/console/console-filter_test.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -310,27 +310,6 @@ describe('The Console Tab', () => {
310310
await testMessageFilter(filter, expectedMessageFilter);
311311
});
312312

313-
it('can reset filter', async () => {
314-
let unfilteredMessages: string[];
315-
316-
await step('get unfiltered messages', async () => {
317-
unfilteredMessages = await getConsoleMessages('console-filter');
318-
});
319-
320-
await step('apply message filter', async () => {
321-
await filterConsoleMessages('outer');
322-
});
323-
324-
await step('delete message filter', async () => {
325-
void deleteConsoleMessagesFilter();
326-
});
327-
328-
await step('check if messages are unfiltered', async () => {
329-
const messages = await getCurrentConsoleMessages();
330-
assert.deepEqual(messages, unfilteredMessages);
331-
});
332-
});
333-
334313
it('can exclude CORS error messages', async () => {
335314
const CORS_DETAILED_ERROR_PATTERN =
336315
/Access to fetch at 'https:.*' from origin 'https:.*' has been blocked by CORS policy: .*/;

test/e2e/helpers/console-helpers.ts

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@ import {AsyncScope} from '../../conductor/async-scope.js';
88
import type {DevToolsPage} from '../../e2e_non_hosted/shared/frontend-helper.js';
99
import {
1010
$,
11-
$$,
1211
click,
13-
drainFrontendTaskQueue,
1412
getBrowserAndPages,
1513
goToResource,
16-
pasteText,
1714
timeout,
1815
waitFor,
1916
waitForFunction
@@ -59,56 +56,57 @@ export const Level = {
5956
Error: CONSOLE_ERROR_MESSAGES_SELECTOR,
6057
};
6158

62-
export async function deleteConsoleMessagesFilter() {
63-
const {frontend} = getBrowserAndPages();
64-
const main = await waitFor('.console-main-toolbar');
65-
await frontend.evaluate(toolbar => {
59+
export async function deleteConsoleMessagesFilter(devToolsPage = getBrowserAndPagesWrappers().devToolsPage) {
60+
const main = await devToolsPage.waitFor('.console-main-toolbar');
61+
await devToolsPage.evaluate(toolbar => {
6662
const deleteButton = toolbar.querySelector<HTMLElement>('.toolbar-input-clear-button');
6763
if (deleteButton) {
6864
deleteButton.click();
6965
}
7066
}, main);
71-
await expectVeEvents([veClick('Toolbar > TextField: filter > Action: clear')], await veRoot());
67+
await expectVeEvents(
68+
[veClick('Toolbar > TextField: filter > Action: clear')], await veRoot(devToolsPage), devToolsPage);
7269
}
7370

74-
export async function filterConsoleMessages(filter: string) {
75-
const {frontend} = getBrowserAndPages();
76-
const main = await waitFor('.console-main-toolbar');
77-
await frontend.evaluate(toolbar => {
71+
export async function filterConsoleMessages(filter: string, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) {
72+
const main = await devToolsPage.waitFor('.console-main-toolbar');
73+
await devToolsPage.evaluate(toolbar => {
7874
const prompt = toolbar.querySelector<HTMLElement>('.toolbar-input-prompt.text-prompt');
7975
prompt!.focus();
8076
}, main);
81-
await pasteText(filter);
82-
await drainFrontendTaskQueue();
83-
await frontend.keyboard.press('Tab');
77+
await devToolsPage.pasteText(filter);
78+
await devToolsPage.drainTaskQueue();
79+
await devToolsPage.page.keyboard.press('Tab');
8480
if (filter.length) {
85-
await expectVeEvents([veChange('Toolbar > TextField: filter')], await veRoot());
81+
await expectVeEvents([veChange('Toolbar > TextField: filter')], await veRoot(devToolsPage), devToolsPage);
8682
}
8783
}
8884

89-
export async function waitForConsoleMessagesToBeNonEmpty(numberOfMessages: number) {
90-
await waitForFunction(async () => {
91-
const messages = await $$(CONSOLE_ALL_MESSAGES_SELECTOR);
85+
export async function waitForConsoleMessagesToBeNonEmpty(
86+
numberOfMessages: number, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) {
87+
await devToolsPage.waitForFunction(async () => {
88+
const messages = await devToolsPage.$$(CONSOLE_ALL_MESSAGES_SELECTOR);
9289
if (messages.length < numberOfMessages) {
9390
return false;
9491
}
9592
const textContents =
9693
await Promise.all(messages.map(message => message.evaluate(message => message.textContent || '')));
9794
return textContents.every(text => text !== '');
9895
});
99-
await expectVeEvents([veImpressionForConsoleMessage()], await veRoot());
96+
await expectVeEvents([veImpressionForConsoleMessage()], await veRoot(devToolsPage), devToolsPage);
10097
}
10198

102-
export async function waitForLastConsoleMessageToHaveContent(expectedTextContent: string) {
103-
await waitForFunction(async () => {
104-
const messages = await $$(CONSOLE_ALL_MESSAGES_SELECTOR);
99+
export async function waitForLastConsoleMessageToHaveContent(
100+
expectedTextContent: string, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) {
101+
await devToolsPage.waitForFunction(async () => {
102+
const messages = await devToolsPage.$$(CONSOLE_ALL_MESSAGES_SELECTOR);
105103
if (messages.length === 0) {
106104
return false;
107105
}
108106
const lastMessageContent = await messages[messages.length - 1].evaluate(message => message.textContent);
109107
return lastMessageContent === expectedTextContent;
110108
});
111-
await expectVeEvents([veImpressionForConsoleMessage()], await veRoot());
109+
await expectVeEvents([veImpressionForConsoleMessage()], await veRoot(devToolsPage), devToolsPage);
112110
}
113111

114112
export async function getConsoleMessages(testName: string, withAnchor = false, callback?: () => Promise<void>) {

test/e2e_non_hosted/console/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import("../../../scripts/build/typescript/typescript.gni")
77
ts_e2e_library("console") {
88
sources = [
99
"dom-warnings_test.ts",
10+
"filter_test.ts",
1011
"search_test.ts",
1112
]
1213

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2025 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import {
6+
deleteConsoleMessagesFilter,
7+
filterConsoleMessages,
8+
navigateToConsoleTab,
9+
waitForConsoleMessagesToBeNonEmpty
10+
} from '../../e2e/helpers/console-helpers.js';
11+
12+
describe('The Console Tab', () => {
13+
it('resets the filter', async ({devToolsPage, inspectedPage}) => {
14+
await Promise.all([
15+
inspectedPage.goToResource('console/console-filter.html'),
16+
navigateToConsoleTab(devToolsPage),
17+
waitForConsoleMessagesToBeNonEmpty(17, devToolsPage),
18+
]);
19+
20+
await filterConsoleMessages('outer', devToolsPage);
21+
await waitForConsoleMessagesToBeNonEmpty(2, devToolsPage);
22+
23+
await deleteConsoleMessagesFilter(devToolsPage);
24+
await waitForConsoleMessagesToBeNonEmpty(17, devToolsPage);
25+
});
26+
});

0 commit comments

Comments
 (0)