如何使用Laravel Dusk断言打印对话框已成功打开
Laravel Dusk 测试window.print()是否执行的方法
首先明确:浏览器的打印对话框属于原生系统级控件,不属于DOM范畴,也不属于alert/confirm/prompt这类标准JS对话框,Dusk内置的对话框断言方法无法直接检测打印弹窗的打开状态,我们可以通过Mock window.print 方法的方式验证它是否被调用。
具体实现步骤
- 第一步:在触发打印操作前,向页面注入监听代码,临时重写
window.print方法,添加调用标记 - 第二步:执行触发打印的业务操作(比如点击打印按钮)
- 第三步:读取页面上的调用标记,断言
window.print已被执行
如果不需要实际弹出打印对话框干扰测试运行,可以直接在Mock方法里省略原有打印逻辑,只保留标记更新逻辑即可。
完整测试代码示例
public function test_print_function_is_called() { $this->browse(function ($browser) { $browser->visit('/your-target-page') // 注入打印监听逻辑 ->script(" window.printCalled = false; // 不需要实际弹出打印框可以注释掉下两行相关代码 // window.originalPrint = window.print; window.print = function() { window.printCalled = true; // window.originalPrint(); } "); // 执行业务侧触发打印的操作 $browser->click('#print-button') // 适配异步触发打印的场景,最多等待5秒 ->waitUntil('window.printCalled === true', 5000); // 最终断言 $this->assertTrue($browser->script('return window.printCalled')[0]); }); }
注意事项
如果你的打印逻辑是在异步请求、定时器回调等场景下触发的,必须添加waitUntil等待逻辑,避免同步断言时标记还未更新导致测试失败。
内容的提问来源于stack exchange,提问作者Magmatic
相关产品推荐
相关产品推荐

