Puppeteer 等待特定的控制台事件
Puppeteer wait for specific console event
我正在尝试实现一个等待特定控制台事件发送的功能。
例如。有几个 console.endTime 调用正在完成(用于性能调试),我想等到最后一个(由特定消息文本标识)完成。
我的代码可以正常工作,但问题是 page.on 每次调用 waitForEvent 函数时都会添加新的事件侦听器。我明白为什么会这样,但还没有找到避免这种情况的解决方案。
代码如下所示:
function waitForEndEvent() {
return new Promise((res, rej) => {
registerConsoleEvent(page, res, rej);
});
}
function filterMessage() {
return (msg) => {
try {
if (msg.type() == 'timeEnd') {
if (msg.text().includes("final time")) {
console.log('timeEnd:', msg.text());
res();
}
}
} catch (e) {
rej(e);
}
};
}
function registerConsoleEvent(page, res, rej) {
page.on('console', filterMessage(res,rej));
}
有什么提示可以解决这个问题吗?
您可以在收到消息后移除事件监听器。您可以使用 page.removeListener(...)
方法删除事件侦听器。所以代码会像这样
function waitForEndEvent() {
return new Promise((res, rej) => {
registerConsoleEvent(page, res, rej);
});
}
function registerConsoleEvent(page, res, rej) {
page.on('console', function consoleListener(msg) {
try {
if (msg.type() == 'timeEnd') {
if (msg.text().includes('final time')) {
console.log('timeEnd:', msg.text());
page.removeListener('console', consoleListener);
res();
}
}
} catch (e) {
rej(e);
}
});
}
我正在尝试实现一个等待特定控制台事件发送的功能。 例如。有几个 console.endTime 调用正在完成(用于性能调试),我想等到最后一个(由特定消息文本标识)完成。 我的代码可以正常工作,但问题是 page.on 每次调用 waitForEvent 函数时都会添加新的事件侦听器。我明白为什么会这样,但还没有找到避免这种情况的解决方案。
代码如下所示:
function waitForEndEvent() {
return new Promise((res, rej) => {
registerConsoleEvent(page, res, rej);
});
}
function filterMessage() {
return (msg) => {
try {
if (msg.type() == 'timeEnd') {
if (msg.text().includes("final time")) {
console.log('timeEnd:', msg.text());
res();
}
}
} catch (e) {
rej(e);
}
};
}
function registerConsoleEvent(page, res, rej) {
page.on('console', filterMessage(res,rej));
}
有什么提示可以解决这个问题吗?
您可以在收到消息后移除事件监听器。您可以使用 page.removeListener(...)
方法删除事件侦听器。所以代码会像这样
function waitForEndEvent() {
return new Promise((res, rej) => {
registerConsoleEvent(page, res, rej);
});
}
function registerConsoleEvent(page, res, rej) {
page.on('console', function consoleListener(msg) {
try {
if (msg.type() == 'timeEnd') {
if (msg.text().includes('final time')) {
console.log('timeEnd:', msg.text());
page.removeListener('console', consoleListener);
res();
}
}
} catch (e) {
rej(e);
}
});
}