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 回调里写断言来检查弹窗是否必须出现。没有事件时,这条断言不会执行。
备注:内容仅供参考。
