Laravel Dusk v7.x与Github Actions(Linux)常见错误及解决方法
Dusk版本:7.x
PHP版本:8.0
问题1:执行php artisan dusk提示Chromedriver路径无效
RuntimeException: Invalid path to Chromedriver [/var/www/path/vendor/laravel/dusk/src/Chrome/../../bin/chromedriver-linux]. Make sure to install the Chromedriver first by running the dusk:chrome-driver command
解决方法:
方法一:修复文件权限
- 进入项目目录,执行命令:
chmod -R 0755 vendor/laravel/dusk/bin/
方法二:重命名Chromedriver文件
- 进入
vendor/laravel/dusk/bin/目录 - 将
chromedriver-linux64重命名为chromedriver-linux
若问题仍存在,尝试以下补充操作:
补充方法一:指定Chromedriver端口
在DuskTestCase.php的driver方法中,为RemoteWebDriver指定端口(默认9515),示例代码如下:
return RemoteWebDriver::create( env('DUSK_URL') && env('DUSK_PORT') ? env('DUSK_URL').':'.env('DUSK_PORT') : 'http://127.0.0.1:9515', // 其余代码保持不变 );
补充方法二:添加--no-sandbox参数
在DuskTestCase.php的driver方法中,为ChromeOptions添加--no-sandbox参数:
protected function driver(): RemoteWebDriver { $options = (new ChromeOptions)->addArguments(collect([ $this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080', ])->unless($this->hasHeadlessDisabled(), function (Collection $items) { return $items->merge([ '--disable-gpu', '--headless=new', '--no-sandbox' // 新增该参数 ]); })->all()); return RemoteWebDriver::create( env('DUSK_URL') && env('DUSK_PORT') ? env('DUSK_URL').':'.env('DUSK_PORT') : 'http://127.0.0.1:9515', DesiredCapabilities::chrome()->setCapability( ChromeOptions::CAPABILITY, $options ) ); }
问题2:执行php artisan dusk提示Curl会话请求失败
Facebook\WebDriver\Exception\Internal\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"capabilities":{"firstMatch":[{"browserName":"chrome","goog:chromeOptions":{"args":["--window-size=1920,1080"]}}]},"desiredCapabilities":{"browserName":"chrome","platform":"ANY","goog:chromeOptions":{"args":["--window-size=1920,1080"]}}}}
解决方法:
该错误是因为Chrome Driver未启动,按以下步骤处理:
步骤1:启动项目内的Chrome Driver
- 进入项目根目录,执行命令:
./vendor/laravel/dusk/bin/chromedriver-linux/chromedriver --port=9515
执行后终端会显示Chrome Driver启动成功的信息,保持该终端窗口开启。
步骤2:手动安装Chrome Driver(若步骤1无效)
执行以下命令安装适配Linux的Chrome Driver:
LATEST_CHROMEDRIVER_VERSION=$(curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE) wget -O chromedriver.zip https://chromedriver.storage.googleapis.com/$LATEST_CHROMEDRIVER_VERSION/chromedriver_linux64.zip unzip chromedriver.zip sudo mv chromedriver /usr/local/bin/ sudo chmod +x /usr/local/bin/chromedriver rm chromedriver.zip
安装完成后,执行以下命令启动:
chromedriver --port=9515
注意:需安装Linux版Chrome浏览器,且Chrome与ChromeDriver版本需保持兼容。
步骤3:启动Laravel服务并配置.env
保持Chrome Driver终端开启,新建终端执行:
php artisan serve
确保.env文件包含以下关键配置:
APP_ENV=local APP_URL=http://localhost:8000 SESSION_DRIVER=file SESSION_LIFETIME=120
注意:使用
->loginAs($user)时,SESSION_DRIVER配置至关重要,可通过->assertAuthenticated()验证登录状态;若使用file驱动,需确保应用对存储目录有合适的读写权限。
Github Actions 流水线配置示例
以下是可成功运行Dusk测试的Github Actions配置代码:
- name: Run Tests env: DB_DATABASE: db_test DB_USERNAME: root DB_PASSWORD: root run: | php artisan key:generate --force php artisan test - name: Install Dusk run: | php artisan dusk:install && rm tests/Browser/ExampleTest.php - name: Permissions for Chrome Driver run: | chmod -R 0755 vendor/laravel/dusk/bin/ - name: Renaming Chrome chromedriver-linux64 to chromedriver-linux run: | mv vendor/laravel/dusk/bin/chromedriver-linux64 vendor/laravel/dusk/bin/chromedriver-linux - name: Detect Chrome Driver run: | php artisan dusk:chrome-driver --detect - name: Start Chrome Driver run: ./vendor/laravel/dusk/bin/chromedriver-linux/chromedriver --port=9515 & - name: Run Laravel Server run: | php artisan serve --no-reload & - name: Wait for Server run: sleep 5 - name: Run Dusk Tests env: APP_URL: http://127.0.0.1:8000 run: | php artisan dusk --testdox --without-tty --ansi
流水线调试步骤
在Run Dusk Tests步骤前添加日志清理:
- name: Clear Laravel Logs run: | echo "" > storage/logs/laravel.log cat storage/logs/laravel.log
在Run Dusk Tests步骤后添加失败日志捕获:
- name: Capture Logs if Tests Fail if: failure() run: cat storage/logs/laravel.log
内容的提问来源于stack exchange,提问作者Sublan Mustafa

