Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 08.12.2017 22:07:48

Laravel Dusk: Failed to connect; Operation timed out

Версия Laravel: Laravel Framework 5.5.24
Версия PHP: 7.1.12 (cli) (built: Dec  1 2017 01:47:06) ( NTS )
Операционная система и её версия: Linux 21a604dfc470 4.10.0-40-generic #44~16.04.1-Ubuntu SMP Thu Nov 9 15:37:44 UTC 2017 x86_64 GNU/Linux
Вендор и версия сервера БД: Server version: 5.7.18 MySQL Community Server (GPL)
Вендор и версия Веб-сервера: PHP (в контейнере Docker), artisan serve

Задача: Необходимо запустить интеграционные тесты (Laravel Dusk)

Что произошло:
Сперва я запустил ExampleTest "из коробки", на что получил следующее сообщение:

$ docker-compose exec web ./artisan dusk
PHPUnit 6.5.3 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 4.02 seconds, Memory: 10.00MB

There was 1 error:

1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"binary":"","args":["--disable-gpu","--headless"]}}}

Failed to connect to localhost port 3000: Connection refused

/app/vendor/facebook/webdriver/lib/Remote/HttpCommandExecutor.php:287
/app/vendor/facebook/webdriver/lib/Remote/RemoteWebDriver.php:121
/app/tests/DuskTestCase.php:39
/app/vendor/laravel/dusk/src/TestCase.php:209
/app/vendor/laravel/framework/src/Illuminate/Support/helpers.php:762
/app/vendor/laravel/dusk/src/TestCase.php:210
/app/vendor/laravel/dusk/src/TestCase.php:116
/app/vendor/laravel/dusk/src/TestCase.php:88
/app/tests/Browser/ExampleTest.php:21

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Тогда я запустил Chrome драйвер вручную:

$ docker-compose exec web ./vendor/laravel/dusk/bin/chromedriver-linux --port=3000
Starting ChromeDriver 2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8) on port 3000
Only local connections are allowed.

И попробовал ещё раз выполнить тест:

$ docker-compose exec web ./artisan dusk
PHPUnit 6.5.3 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 2.51 minutes, Memory: 10.00MB

There was 1 error:

1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"binary":"","args":["--disable-gpu","--headless"]}}}

Operation timed out after 30000 milliseconds with 0 bytes received

/app/vendor/facebook/webdriver/lib/Remote/HttpCommandExecutor.php:287
/app/vendor/facebook/webdriver/lib/Remote/RemoteWebDriver.php:121
/app/tests/DuskTestCase.php:39
/app/vendor/laravel/dusk/src/TestCase.php:209
/app/vendor/laravel/framework/src/Illuminate/Support/helpers.php:762
/app/vendor/laravel/dusk/src/TestCase.php:210
/app/vendor/laravel/dusk/src/TestCase.php:116
/app/vendor/laravel/dusk/src/TestCase.php:88
/app/tests/Browser/ExampleTest.php:21

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

В итоге, он просто завершился по таймауту.

Я ожидал: корректного выполнения теста.

Мои варианты / догадки, почему это произошло:
Возможно, необходимо указать путь к Chrome драйверу, т.к. при предыдущем запуске терминал отображал сообщение, что он не может найти бинарь.

Код:
tests\DuskTestCase.php:

<?php

namespace Tests;

use Laravel\Dusk\TestCase as BaseTestCase;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;

abstract class DuskTestCase extends BaseTestCase
{
    use CreatesApplication;

    /**
     * Prepare for Dusk test execution.
     *
     * @beforeClass
     * @return void
     */
    public static function prepare()
    {
        static::startChromeDriver();
    }

    /**
     * Create the RemoteWebDriver instance.
     *
     * @return \Facebook\WebDriver\Remote\RemoteWebDriver
     */
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless'
        ]);

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

tests\Browser\ExampleTest.php

<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends DuskTestCase
{
    /**
     * A basic browser test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/')
                    ->assertSee('Laravel');
        });
    }
}

.env (частично)

APP_ENV=local
APP_URL=http://localhost:3000

routes\web.php (частично)

Route::get('/', 'ForumsController@index');

Изменено Subb98 (08.12.2017 22:14:41)

Не в сети

#2 10.12.2017 14:34:27

Re: Laravel Dusk: Failed to connect; Operation timed out

Благодарю всех, кто уделил внимание моему вопросу. Я таки решил проблему (дошло до жирафа на третьи сутки).

WnefJtj.png

Помогла мне вот эта статья: Testing a live site with Laravel Dusk using Docker Compose, как раз мой кейс. Также ознакомился со статьёй Что такое Selenium? для лучшего понимания собственных действий.

Не в сети

Подвал раздела