在 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
    );
}