在 Laravel Dusk 中记录 Javascript 控制台输出
Log Javascript console output in Laravel Dusk
我正在使用 Laravel 5.6 和 Laravel Dusk 3.0.9.
Dusk 非常方便,但是当在具有某些 Javascript 功能的页面上测试失败时,很难找出问题所在。 Dusk 生成一个屏幕截图,这很有帮助,但我真正需要的是查看 Javascript 控制台的输出。
显然这是可能的 - Dusk 创建一个 tests/Browser/console
目录作为其安装的一部分,并且 this PR suggests the JS console output is logged,或者至少是可记录的。
虽然没有关于如何实际执行此操作的文档(我可以找到)。 Browsing the diffs in that PR,我看到一个新方法 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');
但是其中 none 有什么不同。我的 JS 有一系列 console.log()
s,我在浏览器中测试自己时会使用它们,它们会告诉我到底出了什么问题。我期待此功能记录这些消息。
我是否误解了 PR,这甚至可能吗?如果是,怎么做?
更新
通过调试vendor/laravel/dusk/src/Browser.php
中的storeConsoleLog()
方法,我可以看到该方法被正确调用,但没有控制台内容可记录。如果我手动重复测试在 Chrome 中执行的步骤,则有行被写入 Chrome devtools 控制台,实际上有 3 行是在页面加载时写入的。为什么 Dusk 看不到这些?
更新 2
我发现如果在DuskTestCase
中的driver()
方法中去掉'--headless'
,测试时会显示浏览器。然后您可以显示该浏览器的开发工具,并在测试时实时观看控制台输出 运行。它实在是太快了,没有什么用处,如果出现错误,浏览器会关闭,你会丢失控制台上的所有内容(除非有办法让浏览器在失败时保持打开状态?),但在这里添加它以防万一对某人有用!
显然没有办法从浏览器获得非错误控制台输出。
有other log types,但是Chrome只支持browser
(Dusk使用)和driver
。
您可能必须使用警报。但是屏幕截图不包含警报,因此您必须获取文本:
$browser->driver->switchTo()->alert()->getText()
您也可以使用 document.write()
之类的东西并检查屏幕截图上的输出。
有可能。有 an answer here written in Python from 2014 表明至少从那么久以来就有可能。
覆盖 \Laravel\Dusk\TestCase::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
);
}
我正在使用 Laravel 5.6 和 Laravel Dusk 3.0.9.
Dusk 非常方便,但是当在具有某些 Javascript 功能的页面上测试失败时,很难找出问题所在。 Dusk 生成一个屏幕截图,这很有帮助,但我真正需要的是查看 Javascript 控制台的输出。
显然这是可能的 - Dusk 创建一个 tests/Browser/console
目录作为其安装的一部分,并且 this PR suggests the JS console output is logged,或者至少是可记录的。
虽然没有关于如何实际执行此操作的文档(我可以找到)。 Browsing the diffs in that PR,我看到一个新方法 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');
但是其中 none 有什么不同。我的 JS 有一系列 console.log()
s,我在浏览器中测试自己时会使用它们,它们会告诉我到底出了什么问题。我期待此功能记录这些消息。
我是否误解了 PR,这甚至可能吗?如果是,怎么做?
更新
通过调试vendor/laravel/dusk/src/Browser.php
中的storeConsoleLog()
方法,我可以看到该方法被正确调用,但没有控制台内容可记录。如果我手动重复测试在 Chrome 中执行的步骤,则有行被写入 Chrome devtools 控制台,实际上有 3 行是在页面加载时写入的。为什么 Dusk 看不到这些?
更新 2
我发现如果在DuskTestCase
中的driver()
方法中去掉'--headless'
,测试时会显示浏览器。然后您可以显示该浏览器的开发工具,并在测试时实时观看控制台输出 运行。它实在是太快了,没有什么用处,如果出现错误,浏览器会关闭,你会丢失控制台上的所有内容(除非有办法让浏览器在失败时保持打开状态?),但在这里添加它以防万一对某人有用!
显然没有办法从浏览器获得非错误控制台输出。
有other log types,但是Chrome只支持browser
(Dusk使用)和driver
。
您可能必须使用警报。但是屏幕截图不包含警报,因此您必须获取文本:
$browser->driver->switchTo()->alert()->getText()
您也可以使用 document.write()
之类的东西并检查屏幕截图上的输出。
有可能。有 an answer here written in Python from 2014 表明至少从那么久以来就有可能。
覆盖 \Laravel\Dusk\TestCase::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
);
}