Записать вывод консоли Javascript в Laravel Dusk

Я использую Laravel 5.6 и Laravel Dusk 3.0.9.

Сумерки довольно удобны, но когда тест не проходит на странице, где есть некоторая функциональность Javascript, может быть довольно сложно понять, что пошло не так. Dusk создает снимок экрана, который помогает, но мне действительно нужно увидеть вывод из консоли Javascript.

Видимо, это возможно - Сумерки создает 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]');

Этот тест не пройден и создает хороший скриншот, но нет никаких признаков файла журнала. Я пытался изменить положение ->storeConsoleLog('bar') вокруг в цепочке, например, первая или последняя, ​​и отдельной строкой до или после цепочки:

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

Но ни один из них не имеет никакого значения. Мой JS имеет серию console.log()s, которые я использую при тестировании себя в браузере, и который точно скажет мне, что пошло не так. Я ожидал, что эта функция будет регистрировать эти сообщения.

Я неправильно понимаю, что пиар, это вообще возможно? Если так, то как?

ОБНОВИТЬ

Отладкой storeConsoleLog() метод в vendor/laravel/dusk/src/Browser.php Я вижу, что метод вызывается правильно, но нет консольного контента для регистрации. Если я вручную повторю шаги, которые выполняет тест в Chrome, в консоли разработчика Chrome будут записаны строки, фактически 3 записываются при загрузке страницы. Почему Сумерки не видят их?

ОБНОВЛЕНИЕ 2

Я обнаружил, что если вы удалите '--headless' от driver() метод в DuskTestCase, браузер будет отображаться во время тестов. Затем вы можете отобразить инструменты разработки для этого браузера и наблюдать за выводом консоли в реальном времени во время выполнения тестов. Это слишком быстро, чтобы действительно быть полезным, и если возникает ошибка, браузер закрывается, и вы теряете все, что было на консоли в любом случае (если нет способа оставить браузер открытым при сбое?), Но добавьте это здесь, если это так. кому-то пригодится!

2 ответа

Решение

По-видимому, нет способа получить консольный вывод без ошибок из браузера.

Существуют и другие типы журналов, но Chrome поддерживает только browser (используется Dusk) и driver,

Вам, вероятно, придется использовать оповещения. Но на скриншотах нет предупреждений, поэтому вы должны получить текст:

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

Вы также можете использовать что-то вроде document.write() и проверьте вывод на скриншоте.

Это возможно. Здесь есть ответ, написанный на Python с 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
    );
}
Другие вопросы по тегам