From 595af0779dbfbdf9a241199f325232aab5443302 Mon Sep 17 00:00:00 2001 From: Adnan RIHAN Date: Wed, 23 Apr 2025 02:42:25 +0200 Subject: [PATCH] Allows Chrome driver's path to be configured Allows to customize Chrome driver path using the configuration file. Can be useful when building a phar standalone app. Implements laravel/dusk#1006 See laravel/dusk#1171 --- config/laravel-console-dusk.php | 14 ++++++++ src/Chrome/ChromeProcess.php | 44 +++++++++++++++++++++++ src/Chrome/SupportsChrome.php | 30 ++++++++++++++++ src/Console/ChromeDriverCommand.php | 36 +++++++++++++++++++ src/Drivers/Chrome.php | 2 +- src/LaravelConsoleDuskServiceProvider.php | 3 +- 6 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/Chrome/ChromeProcess.php create mode 100644 src/Chrome/SupportsChrome.php create mode 100644 src/Console/ChromeDriverCommand.php diff --git a/config/laravel-console-dusk.php b/config/laravel-console-dusk.php index 4d5ff24..a47ad2f 100644 --- a/config/laravel-console-dusk.php +++ b/config/laravel-console-dusk.php @@ -15,6 +15,20 @@ 'source' => storage_path('laravel-console-dusk/source'), ], + /* + |-------------------------------------------------------------------------- + | Laravel Dusk Chrome Driver Path + |-------------------------------------------------------------------------- + | + | You may override chrome driver path, for instance if you are using + | laravel dusk while building a standalone application. If you don't set + | (or set to null) this config, the default path will be used. + | + | In your .env file, you can set this value to "auto" to install the chrome + | driver alongside your phar file (if any), or else to the default path. + */ + 'chrome_driver_path' => env('CONSOLE_DUSK_DRIVER_PATH'), + /* | -------------------------------------------------------------------------- | Headless Mode diff --git a/src/Chrome/ChromeProcess.php b/src/Chrome/ChromeProcess.php new file mode 100644 index 0000000..2b15d5a --- /dev/null +++ b/src/Chrome/ChromeProcess.php @@ -0,0 +1,44 @@ +driver && isset($chromeDriverPath)) { + if ($chromeDriverPath === 'auto') { + // Set the driver directory to the phar's directory + // Or else, don't do anything + if (($pharPath = Phar::running(false)) !== '') { + $chromeDriverPath = dirname($pharPath); + } else { + $chromeDriverPath = null; + } + } + + if ($chromeDriverPath !== null) { + $filenames = [ + 'linux' => 'chromedriver-linux', + 'mac' => 'chromedriver-mac', + 'mac-intel' => 'chromedriver-mac-intel', + 'mac-arm' => 'chromedriver-mac-arm', + 'win' => 'chromedriver-win.exe', + ]; + + $this->driver = $chromeDriverPath.DIRECTORY_SEPARATOR.$filenames[$this->operatingSystemId()]; + } + } + + return parent::toProcess($arguments); + } +} diff --git a/src/Chrome/SupportsChrome.php b/src/Chrome/SupportsChrome.php new file mode 100644 index 0000000..266d569 --- /dev/null +++ b/src/Chrome/SupportsChrome.php @@ -0,0 +1,30 @@ +toProcess($arguments); + } +} diff --git a/src/Console/ChromeDriverCommand.php b/src/Console/ChromeDriverCommand.php new file mode 100644 index 0000000..8aa75d1 --- /dev/null +++ b/src/Console/ChromeDriverCommand.php @@ -0,0 +1,36 @@ +directory = $chromeDriverPath.DIRECTORY_SEPARATOR; + } + } + + parent::__construct(); + } +} diff --git a/src/Drivers/Chrome.php b/src/Drivers/Chrome.php index 5f5982d..3412fb7 100644 --- a/src/Drivers/Chrome.php +++ b/src/Drivers/Chrome.php @@ -8,7 +8,7 @@ use Facebook\WebDriver\Chrome\ChromeOptions; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; -use Laravel\Dusk\Chrome\SupportsChrome; +use NunoMaduro\LaravelConsoleDusk\Chrome\SupportsChrome; use NunoMaduro\LaravelConsoleDusk\Contracts\Drivers\DriverContract; class Chrome implements DriverContract diff --git a/src/LaravelConsoleDuskServiceProvider.php b/src/LaravelConsoleDuskServiceProvider.php index 0e824d5..e80e352 100644 --- a/src/LaravelConsoleDuskServiceProvider.php +++ b/src/LaravelConsoleDuskServiceProvider.php @@ -9,7 +9,7 @@ use Illuminate\Support\Facades\File; use Illuminate\Support\ServiceProvider; use Laravel\Dusk\Browser; -use Laravel\Dusk\Console\ChromeDriverCommand; +use NunoMaduro\LaravelConsoleDusk\Console\ChromeDriverCommand; use NunoMaduro\LaravelConsoleDusk\Contracts\ManagerContract; class LaravelConsoleDuskServiceProvider extends ServiceProvider implements DeferrableProvider @@ -17,6 +17,7 @@ class LaravelConsoleDuskServiceProvider extends ServiceProvider implements Defer public function boot(): void { if ($this->app->runningInConsole()) { + $this->publishes([ __DIR__.'/../config/laravel-console-dusk.php' => config_path('laravel-console-dusk.php'), ], 'config');