问题描述
我正在尝试使用与 Laravel Sail 集成的 Laravel Dusk,如下所述:https://laravel.com/docs/8.x/sail#laravel-dusk
我在完成这项工作时遇到了一些问题:
-
如果使用 .env.dusk 或 .env.dusk.local 文件并使用“sail dusk”运行测试,我会收到连接拒绝错误(更多详细信息见下文)
-
例如,如果使用 .env.testing 来设置 ENV 变量并运行“sail dusk --env=testing”,则连接拒绝错误消失,但应用程序继续使用默认的 .env 文件,同时dusk 测试使用 .env.testing,导致很多错误。
docker-compose.yml
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LaraVEL_SAIL: 1
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- MysqL
- redis
- selenium
selenium:
image: 'selenium/standalone-chrome'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
MysqL:
image: 'MysqL:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MysqL_ROOT_PASSWORD: '${DB_PASSWORD}'
MysqL_DATABASE: '${DB_DATABASE}'
MysqL_USER: '${DB_USERNAME}'
MysqL_PASSWORD: '${DB_PASSWORD}'
MysqL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sailMysqL:/var/lib/MysqL'
networks:
- sail
healthcheck:
test: ['CMD','MysqLadmin','ping']
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REdis_PORT:-6379}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
healthcheck:
test: ['CMD','redis-cli','ping']
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sailMysqL:
driver: local
sailredis:
driver: local
.env.dusk
APP_NAME="Plataforma Brasileira SE"
APP_URL="http://plataformabrasileira-se.test"
APP_ENV=testing
APP_KEY=base64:bc0IGvpHb/ymQD7vUTJa60qhG7T2dtozC6urijChcbo=
DB_CONNECTION=dusk
MAIL_MAILER=array
QUEUE_CONNECTION=sync
SESSION_DRIVER=array
TELEScopE_ENABLED=false
database.PHP
...
'dusk' => [
'driver' => 'sqlite','database' => database_path('database.sqlite'),'prefix' => '','foreign_key_constraints' => env('DB_FOREIGN_KEYS',true),],...
DuskTestCase.PHP
<?PHP
namespace Tests;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Laravel\Dusk\TestCase as BaseTestCase;
abstract class DuskTestCase extends BaseTestCase
{
use CreatesApplication;
/**
* Prepare for Dusk test execution.
*
* @beforeClass
* @return void
*/
public static function prepare()
{
if (! static::runningInSail()) {
static::startChromeDriver();
}
}
/**
* Create the RemoteWebDriver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function driver()
{
$options = (new ChromeOptions)->addArguments([
'--disable-gpu','--headless','--window-size=1920,1080',]);
return RemoteWebDriver::create(
$_ENV['DUSK_DRIVER_URL'] ?? 'http://localhost:9515',DesiredCapabilities::chrome()->setCapability(
ChromeOptions::CAPABILITY,$options
)
);
}
}
当我运行 'sail dusk' 时,出现以下错误:
1) Tests\browser\LoginTest::test_user_cannot_login_with_invalid_data
Facebook\WebDriver\Exception\UnkNownErrorException: unkNown error: net::ERR_CONNECTION_REFUSED
(Session info: headless chrome=88.0.4324.96)
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Exception/WebDriverException.PHP:139
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Remote/HttpCommandExecutor.PHP:371
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Remote/RemoteWebDriver.PHP:612
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Remote/RemoteExecuteMethod.PHP:27
/var/www/html/vendor/PHP-webdriver/webdriver/lib/WebDriverNavigation.PHP:41
/var/www/html/vendor/laravel/dusk/src/browser.PHP:153
/var/www/html/tests/browser/LoginTest.PHP:18
/var/www/html/vendor/laravel/dusk/src/Concerns/Providesbrowser.PHP:68
/var/www/html/tests/browser/LoginTest.PHP:28
解决方法
尝试使用
APP_URL=http://laravel.test
由于测试是在 selenium docker 中运行的,这会引用回您的 Laravel docker 容器。