Диалоги
Введение
Playwright может взаимодействовать с диалогами веб-страниц, такими как alert
, confirm
, prompt
, а также с подтверждением beforeunload
. Для диалогов печати см. Печать.
Диалоги alert(), confirm(), prompt()
По умолчанию диалоги автоматически отклоняются Playwright, поэтому вам не нужно их обрабатывать. Однако вы можете зарегистрировать обработчик диалогов перед действием, которое вызывает диалог, чтобы либо dialog.accept(), либо dialog.dismiss() его.
page.on('dialog', dialog => dialog.accept());
await page.getByRole('button').click();
Слушатель page.on('dialog') должен обрабатывать диалог. В противном случае ваше действие будет приостановлено, будь то locator.click() или что-то еще. Это связано с тем, что диалоги в вебе являются модальными и, следовательно, блокируют дальнейшее выполнение страницы, пока они не будут обработаны.
В результате следующий фрагмент никогда не разрешится:
НЕПРАВИЛЬНО!
page.on('dialog', dialog => console.log(dialog.message()));
await page.getByRole('button').click(); // Зависнет здесь
Если нет слушателя для page.on('dialog'), все диалоги автоматически отклоняются.
Диалог beforeunload
Когда page.close() вызывается с истинным значением runBeforeUnload, страница выполняет свои обработчики выгрузки. Это единственный случай, когда page.close() не ждет фактического закрытия страницы, потому что может случиться так, что страница останется открытой в конце операции.
Вы можете зарегистрировать обработчик диалогов, чтобы самостоятельно обработать диалог beforeunload
:
page.on('dialog', async dialog => {
assert(dialog.type() === 'beforeunload');
await dialog.dismiss();
});
await page.close({ runBeforeUnload: true });
Диалоги печати
Чтобы убедиться, что диалог печати через window.print
был вызван, вы можете использовать следующий фрагмент:
await page.goto('<url>');
await page.evaluate('(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()');
await page.getByText('Print it!').click();
await page.waitForFunction('window.waitForPrintDialog');
Это будет ожидать открытия диалога печати после нажатия кнопки. Убедитесь, что вы оценили скрипт перед нажатием кнопки / после загрузки страницы.