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



我使用的是Laravel 5.6和Laravel Dusk 3.0.9。

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

显然,这是可能的——Dusk在安装过程中创建了一个tests/Browser/console目录,这个PR表明JS控制台的输出是记录的,或者至少是可记录的。

不过,我找不到关于如何实际做到这一点的文档。浏览PR中的diffs,我看到了一个新方法logConsole()(后来被重命名为storeConsoleLog(),正如@Jonas在评论中指出的那样(,但我似乎无法让它做任何事情,例如:

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

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

$browser->visit('/somewhere')
->...full chain here;
$browser->storeConsoleLog('bar');

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

我是不是误解了公关,这可能吗?如果是,如何?

更新

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

更新2

我发现,如果从DuskTestCase中的driver()方法中删除'--headless',则在测试期间会显示浏览器。然后,您可以显示该浏览器的开发工具,并在测试运行时实时查看控制台输出。它太快了,不可能真正有用,如果出现错误,浏览器会关闭,你会丢失控制台上的任何东西(除非有办法在失败时保持浏览器打开?(,但在这里添加它,以防对某人有用!

显然无法从浏览器获得无错误控制台输出。

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

您可能需要使用警报。但是屏幕截图不包含警报,所以你必须得到文本:

$browser->driver->switchTo()->alert()->getText()

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

这是可能的。这里有一个2014年用Python编写的答案,表明它至少在这么长时间后就有了可能。

覆盖LaravelDuskTestCase::driver:

protected function driver()
{
$desired_capabilities = new DesiredCapabilities([
'browserName' => 'chrome',
'platform' => 'ANY',
]);
// the proper capability to set to get ALL logs stored
$desired_capabilities->setCapability('loggingPrefs', [
'browser' => 'ALL',
'driver' => 'ALL',
]);
// return the driver
return RemoteWebDriver::create(
'http://localhost:9515',
$desired_capabilities
);
}

最新更新