How do you disable Chrome's headless mode for Dusk using Laravel 5.5?

2.4k views Asked by At

I'd like to be able to see the browser when running my Browser tests using Dusk 2.0 in Laravel 5.5 (specifically so I can use $browser-tinker() and give it some manual commands for debugging purposes).

Does anyone know how to do this? I was hoping some something as simple as:

php artisan dusk --noheadless
2

There are 2 answers

1
Numline1 On BEST ANSWER

Installing Dusk should create a DuskTestCase.php file in /tests/ directory in your app. DuskTestCase class within this file contains a driver() method, which is easy to override (since this is within your app, you can make changes in it directly as it's not part of the package anymore).

Disabling the headless mode is now as simple as just removing the '--headless' argument from the $options variable in it's addArguments() method on ChromeOptions instance.

As of Laravel 5.5, the $options variable will look something like this:

$options = (new ChromeOptions)->addArguments([
    '--disable-gpu',
    //'--headless'
]);
0
Dmitry Ulyanov On

I wrote a bash script to toggle --headless option from the terminal.

Usage:
Browser is visible: ./run_tests -in-browser
No browser: ./run_tests

The process is as follows:

  1. Modify the DuskTestCase.php to read the environment variable, let's call it DISABLE_HEADLESS_TEST. Whenever it is set to true show the test as it goes in the browser.
  2. Make a shell script which copies the content of your existing .env file into the .env.dusk.local file appends DISABLE_HEADLESS_TEST to the end of the .env.dusk.local and runs artisan dusk for us. Then deletes .env.dusk.local when the test is done.

DuskTestCase.php

protected function driver()
{
    $driver_args = env("DISABLE_HEADLESS_TEST") ? ['--disable-gpu'] : 
                                                  ['--disable-gpu','--headless'];
    $options = (new ChromeOptions)->addArguments($driver_args);

    return RemoteWebDriver::create(
        'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY, $options
        )
    );
}

run_tests script
Make it executable sudo chmod +x run_tests

#! /bin/bash

function make_env_file_copy {
    if cp .env .env.dusk.local; then
        return 0;
    else
        echo "Error. Can't copy .env file to .env.dusk.local";
        return 1;
    fi
}

function add_line_to_env_file {
    if echo $'\r\n'"DISABLE_HEADLESS_TEST=true" >> .env.dusk.local; then
        return 0;
    else
        echo "Error. Can't write to .env.dusk.local";
        return 1;
    fi
}

#------------ MAIN --------------

if [[ $1 = "-in-browser" ]]; then

    echo "Running Dusk tests in the browser.";

    make_env_file_copy &&
    add_line_to_env_file && 
    php artisan dusk;

else
    echo "Running tests";
    php artisan dusk;
fi

echo "Cleaning up";
rm .env.dusk.local;