Перейти к основному содержимому

Диалоги

Введение​

Playwright может взаимодействовать с диалогами веб-страниц, такими как alert, confirm, prompt, а также с подтверждением beforeunload. Для диалогов печати см. Печать.

Диалоги alert(), confirm(), prompt()​

По умолчанию диалоги автоматически отклоняются Playwright, поэтому вам не нужно их обрабатывать. Однако вы можете зарегистрировать обработчик диалогов перед действием, которое вызывает диалог, чтобы либо Dialog.accept(), либо Dialog.dismiss() его.

page.onDialog(dialog -> dialog.accept());
page.getByRole(AriaRole.BUTTON).click();
примечание

Слушатель Page.onDialog(handler) должен обработать диалог. В противном случае ваше действие будет приостановлено, будь то Locator.click() или что-то еще. Это потому, что диалоги в вебе являются модальными и, следовательно, блокируют дальнейшее выполнение страницы, пока они не будут обработаны.

В результате следующий фрагмент никогда не разрешится:

warning

НЕПРАВИЛЬНО!

page.onDialog(dialog -> System.out.println(dialog.message()));
page.getByRole(AriaRole.BUTTON).click(); // Здесь произойдет зависание
примечание

Если нет слушателя для Page.onDialog(handler), все диалоги автоматически отклоняются.

Диалог beforeunload​

Когда Page.close() вызывается с истинным значением setRunBeforeUnload, страница запускает свои обработчики выгрузки. Это единственный случай, когда Page.close() не ждет фактического закрытия страницы, потому что может случиться так, что страница останется открытой в конце операции.

Вы можете зарегистрировать обработчик диалогов, чтобы самостоятельно обработать диалог beforeunload:

page.onDialog(dialog -> {
assertEquals("beforeunload", dialog.type());
dialog.dismiss();
});
page.close(new Page.CloseOptions().setRunBeforeUnload(true));

Чтобы убедиться, что диалог печати через window.print был вызван, вы можете использовать следующий фрагмент:

page.navigate("<url>");

page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
page.getByText("Print it!").click();

page.waitForFunction("window.waitForPrintDialog");

Это будет ожидать открытия диалога печати после нажатия кнопки. Убедитесь, что вы оценили скрипт перед нажатием кнопки / после загрузки страницы.