在Laravel Dusk中记录Javascript控制台输出

Don*_*nic 5 laravel laravel-dusk laravel-5.6

我正在使用Laravel 5.6和Laravel Dusk 3.0.9。

黄昏非常方便,但是当在具有某些Javascript功能的页面上测试失败时,很难找出问题所在。Dusk会生成一个屏幕截图,这很有帮助,但是我真正需要的是查看Javascript控制台的输出。

显然,这是可能的-Dusk tests/Browser/console在安装过程中会创建一个目录,并且此PR建议JS控制台输出已记录,或者至少是可记录的

尽管没有文档(我可以找到)有关如何实际执行操作。 浏览该PR中的差异时,我看到了一个新方法logConsole()(后来storeConsoleLog()在注释中重命名为@Jonas指出),但是我似乎无法使其执行任何操作,例如:

$browser->visit('/somewhere')
        ->select('#foo', '2')
        ->value('#date', '2018-07-29')
        ->storeConsoleLog('bar')
        ->assertEnabled('button[type=submit]');
Run Code Online (Sandbox Code Playgroud)

该测试失败,并生成了一个漂亮的屏幕截图,但是没有任何日志文件的迹象。我尝试过移动->storeConsoleLog('bar')链条中的位置,例如第一个或最后一个,并在链条之前或之后作为单独的一行:

$browser->visit('/somewhere')
->...full chain here;
$browser->storeConsoleLog('bar');
Run Code Online (Sandbox Code Playgroud)

但是它们都没有任何区别。我的JS有一系列,console.log()当在浏览器中测试自己时会用到这些,它们会确切告诉我出了什么问题。我期望此功能记录这些消息。

我是否误解了公关,这有可能吗?如果是这样,怎么办?

更新

通过调试中的storeConsoleLog()方法,vendor/laravel/dusk/src/Browser.php我可以看到该方法已正确调用,但是没有控制台内容可记录。如果我手动重复测试在Chrome中执行的步骤,则会有行写入Chrome devtools控制台,实际上3是在页面加载时写入的。为什么黄昏看不到那些?

更新2

我发现,如果'--headless'从中的driver()方法中删除DuskTestCase,则在测试期间将显示浏览器。然后,您可以显示该浏览器的开发工具,并在测试运行时实时观看控制台输出。太快了,无法真正发挥作用,如果出现错误,浏览器将关闭,并且无论如何您都会丢失控制台上的所有内容(除非有办法让浏览器在发生故障时保持打开状态?),但请在此处添加此内容,以防万一。对某人有用!

Jon*_*eir 5

显然没有办法从浏览器获得非错误控制台输出。

还有其他日志类型,但 Chrome 仅支持browser(由 Dusk 使用)和driver.

您可能必须使用警报。但是屏幕截图不包含警报,因此您必须获取文本:

$browser->driver->switchTo()->alert()->getText()
Run Code Online (Sandbox Code Playgroud)

您也可以使用类似的方法document.write()并检查屏幕截图上的输出。