PAYATHON 2026

Playwright Java 如何判断点击按钮后是否弹出 Dialog?

数据小许

结论

可以用 onDialog() 监听弹窗,再通过带超时的 CompletableFuture 等待回调。收到事件后,先记录结果,再调用 dialog.accept()。如果等待超时,说明 Dialog 没有在设定的时间内出现。

原代码中的 assertTrue(true) 只会在 Dialog 回调执行时运行。没有弹窗时,回调不会触发,因此这条断言无法检查是否没有弹窗。

示例:断言点击后没有弹窗

下面的示例使用 JUnit 5。等待时间应根据页面实际触发弹窗的时机设置:

import com.microsoft.playwright.Dialog;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;
import org.junit.jupiter.api.Assertions;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;

CompletableFuture<Boolean> dialogSeen = new CompletableFuture<>();
Consumer<Dialog> handler = dialog -> {
    dialogSeen.complete(true);
    dialog.accept();
};

page.onDialog(handler);
try {
    page.getByRole(
        AriaRole.BUTTON,
        new Page.GetByRoleOptions().setName("Open Dialog")
    ).click();

    boolean appeared;
    try {
        appeared = dialogSeen.get(1, TimeUnit.SECONDS);
    } catch (TimeoutException e) {
        appeared = false;
    }

    Assertions.assertFalse(appeared, "点击按钮后不应出现 Dialog");
} finally {
    page.offDialog(handler);
}

如果测试要求弹窗出现,将最后的断言改为:

Assertions.assertTrue(appeared, "点击按钮后应出现 Dialog");

注意事项

  • 注册 Playwright 的 Dialog 监听器后,需要在回调中接受或关闭弹窗。示例调用 dialog.accept();如果不处理,触发弹窗的操作可能无法继续。
  • offDialog() 需要传入注册时使用的同一个处理器。示例将 handler 保存在变量中,并在 finally 中移除监听器。
  • 超时只表示 Dialog 没有在这段等待时间内出现,不能证明之后不会弹窗。如果弹窗由延迟任务触发,可以根据应用行为调整等待时间,或改为等待更具体的页面状态。
  • 不要只在 Dialog 回调里写断言来检查弹窗是否必须出现。没有事件时,这条断言不会执行。

备注:内容仅供参考。