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

Диалоги

Введение​

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

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

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

Page.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
await Page.GetByRole(AriaRole.Button).ClickAsync();
примечание

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

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

warning

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

page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.GetByRole(AriaRole.Button).ClickAsync(); // Зависнет здесь
примечание

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

Диалог beforeunload​

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

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

Page.Dialog += async (_, dialog) =>
{
Assert.AreEqual("beforeunload", dialog.Type);
await dialog.DismissAsync();
};
await Page.CloseAsync(new() { RunBeforeUnload = true });

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

await Page.GotoAsync("<url>");

await Page.EvaluateAsync("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
await Page.GetByText("Print it!").ClickAsync();

await Page.WaitForFunctionAsync("window.waitForPrintDialog");

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