【问题标题】:Laravel Sail + Dusk + Selenium: Connection refusedLaravel Sail + Dusk + Selenium:连接被拒绝
【发布时间】:2021-04-10 15:04:18
【问题描述】:

我有一个带有 Sail 的 Laravel,我想用 Laravel Dusk 进行自动化测试。我按照Dusk DocumentationSail + Dusk Installation 中的所有说明进行操作,但是当我运行默认测试时,我收到以下错误消息:

Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"capabilities":{"firstMatch":[{"browserName":"chrome","goog:chromeOptions":{"args":["--disable-gpu","--headless","--no-sandbox","--window-size=1920,1080"]},"acceptInsecureCerts":true}]},"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"args":["--disable-gpu","--headless","--no-sandbox","--window-size=1920,1080"]},"acceptInsecureCerts":true}}

Failed to connect to localhost port 4444: Connection refused

/var/www/html/vendor/php-webdriver/webdriver/lib/Remote/HttpCommandExecutor.php:333
/var/www/html/vendor/php-webdriver/webdriver/lib/Remote/RemoteWebDriver.php:136
/var/www/html/tests/DuskTestCase.php:69
/var/www/html/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:218
/var/www/html/vendor/laravel/framework/src/Illuminate/Support/helpers.php:234
/var/www/html/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:219
/var/www/html/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:97
/var/www/html/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:65
/var/www/html/tests/Browser/ExampleTest.php:21

但是如果在 Insomnia 中执行请求,它运行没有任何问题:

Insomnia request

这是我的 docker-compose:

# 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
    ports:
      - 4444:4444
    #depends_on:
    #  - laravel.test
  mysql:
    image: 'mysql:8.0'
    ports:
      - '${DB_PORT}: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
  redis:
    image: 'redis:alpine'
    ports:
      - '${REDIS_PORT}:6379'
    volumes:
      - 'sailredis:/data'
    networks:
      - sail
  # memcached:
  #     image: 'memcached:alpine'
  #     ports:
  #         - '11211:11211'
  #     networks:
  #         - sail
  mailhog:
    image: 'mailhog/mailhog:latest'
    ports:
      - 1025:1025
      - 8025:8025
    networks:
      - sail
networks:
  sail:
    driver: bridge
volumes:
  sailmysql:
    driver: local
  sailredis:
    driver: local

还有我的 DuskTestCase

<?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',
            '--no-sandbox',
            '--window-size=1920,1080',
        ]);

        return RemoteWebDriver::create(
            'http://localhost:4444/wd/hub', DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY, $options
        )->setCapability('acceptInsecureCerts', TRUE)
        );
    }
}

我真的不知道我做错了什么。对不起我的英语,我是巴西人。

【问题讨论】:

  • 在你的 docker-compose 中取消注释 #depends_on 行有什么作用吗?
  • 它返回一个错误:错误:laravel.test 和 selenium 和 redis 之间的循环依赖错误:selenium 和 redis 和 laravel.test 之间的循环依赖错误:redis 和 selenium 和 laravel.test 之间的循环依赖

标签: laravel docker selenium laravel-dusk laravel-sail


【解决方案1】:

经过很多天,我终于设法解决了我的问题。看了Docker documentation,发现可以使用图片名作为URL,于是切换到http://selenium:4444,测试完美!

这是我的新代码:

<?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',
            '--no-sandbox',
            '--window-size=1920,1080',
        ]);

        return RemoteWebDriver::create(
            'http://selenium:4444/wd/hub', DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY, $options
        )->setCapability('acceptInsecureCerts', TRUE)
        );
    }
}

希望能帮助遇到同样问题的人!

【讨论】:

  • 感谢您提供有关端口的提示,但硬编码该值似乎不是一个好方法。我检查了DuskTestCase.php 的代码,并确定它默认使用DUSK_DRIVER_URL,并回退到一些硬编码值。我已将该变量设置为http://selenium:4444,并将APP_URL 变量设置为http://web:80。请注意,存储库有一个特殊的 .env.dusk.local 文件。
  • 上一条评论使用的 APP_URL 值不符合 Laravel Sail 生成的 docker-compose.yml 文件的默认值。我的将 laravel.test 替换为 web,这会改变 APP_SERVICE 的值,从而改变 URL。短版 - 默认 APP_URL 值应为 http://laravel.test:80
【解决方案2】:

我会告诉你什么对我有用:

1 - 帆作曲家更新

2 - docker system prune -a(删除)

3- .env 文件中的 APP_URL=http://localhost:80

4-扬帆出海

我不知道为什么,但是在我这样做之后它起作用了

【讨论】:

    【解决方案3】:

    Dusk 使用的 WebDriver 正在端口 4444 上寻找 selenium docker 映像。

    请务必添加到.env 文件中:

    DUSK_DRIVER_URL='http://selenium:4444'
    

    还有一个APP_URL,它以端口80上的本地主机为目标:

    APP_URL="http://laravel.test:80"
    

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2021-04-11
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2018-08-14
      • 2018-03-18
      • 1970-01-01
      相关资源
      最近更新 更多