ページが読み込まれたときにイベントが1回だけ送信されるかどうかを確認するために、jestとpuppeteerを使用してコードを作成しています。
同じイベントが再度送信された場合にメッセージを返すために、puppeteerを使用してコードを作成する際に問題が発生します。
const eventTest = async (viewEndpoint) => {
await Promise.race([
page.goto(url),
await page.waitForResponse(viewEndpoint)
.then(await page.waitForResponse(viewEndpoint, 10000))
.then(console.log("Event loaded more than once"))
])
}
上記のコードは私が今まで試したものです。viewEndPoit
指定されたURLのイベントエンドポイントです。最初にページに移動し、次にpage.waitForResponse
イベントエンドポイントで使用し、すべてが正しければthen
、もう一度実行するために使用します。そして、イベントが再び発生した場合は、メッセージをロードします。
console.log
イベントが1回しか読み込まれなくても、機能せず、常に戻ります。
たとえば、ホームページが読み込まれると、homeというイベントが送信されます。devtoolsネットワークタブで確認できます。私の目標は、イベントが[ネットワーク]タブに2回表示された場合に、console.logを返すことです。
最も明白な方法は、単に関数をpage.waitForResponse
2回使用し、Promise.race
その後で関数を内部で使用することです。
コードサンプル
const waitForEventTwice = async () => {
try {
await page.waitForResponse(viewEndpoint, { timeout: 10000 });
await page.waitForResponse(viewEndpoint, { timeout: 10000 });
console.log('Yes it happened twice.');
} catch (err) {
console.log('No, it didn't, a timeout error happened instead');
// You might want to "throw err" here depending on your use case
}
}
await Promise.race([
page.goto(url),
waitForEventTwice(),
]);
より洗練されたアプローチは、イベントが発生した回数をカウントアップすることresolve
です。これにより、一瞬イベントをリッスンしないためにイベントを見逃すことはありません。
const waitForEventTwice = () => new Promise((resolve, reject) => {
let counter = 0;
page.on('response', function listener(response) {
if (response.url() === '...') { // test if the response is the response you are looking for
counter += 1;
if (counter === 2) {
// ...
resolve(); // it happened
}
}
});
setTimeout(() => {
server.removeListener('response', listener);
// it did not happen
// ...
reject(); // or resolve() alternatively depending on your use case
}, 2000);
});
await Promise.race([
page.goto(url),
waitForEventTwice(),
]);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加