> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Test del browser (Dusk)

> Come eseguire test E2E del browser basati su ChromeDriver usando Laravel Dusk

## Cos'è Laravel Dusk

Laravel Dusk è uno strumento di test E2E che opera realmente sul browser per verificare l'intera schermata.\
Per impostazione predefinita, puoi eseguire i test con ChromeDriver senza dover preparare a parte un server Selenium.

<Warning>
  Nella documentazione ufficiale, per i nuovi progetti sono consigliati anche i browser test di Pest 4. Usa questa pagina se stai usando Dusk in un progetto esistente o se vuoi utilizzare l'API di Dusk.
</Warning>

## Installazione

Per prima cosa installa Google Chrome e aggiungi Dusk come dipendenza di sviluppo.

```shell theme={null}
composer require laravel/dusk --dev
php artisan dusk:install
```

Se vuoi allineare la versione di ChromeDriver usa il comando `dusk:chrome-driver`.

```shell theme={null}
# Rileva e installa la versione compatibile con il Chrome locale
php artisan dusk:chrome-driver --detect
```

## Configurazione dell'ambiente (`.env.dusk.local`)

Per usare variabili d'ambiente dedicate a Dusk, crea `.env.dusk.{environment}` nella root del progetto.\
Per l'ambiente locale usa `.env.dusk.local`.

```ini theme={null}
APP_URL=http://127.0.0.1:8000
DB_CONNECTION=mysql
DB_DATABASE=app_testing
DB_USERNAME=root
DB_PASSWORD=root
```

Durante l'esecuzione di Dusk `.env` viene salvato come backup e il contenuto di `.env.dusk.local` viene applicato temporaneamente.

## Test di base del browser

Genera un test ed eseguilo con `php artisan dusk`.

```shell theme={null}
php artisan dusk:make LoginTest
php artisan dusk
```

Per rieseguire solo i test falliti:

```shell theme={null}
php artisan dusk:fails
```

### Esempio di operazioni di base

```php theme={null}
<?php

namespace Tests\Browser;

use App\Models\User;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class LoginTest extends DuskTestCase
{
    public function test_user_can_login(): void
    {
        $user = User::factory()->create([
            'email' => 'taylor@laravel.com',
        ]);

        $this->browse(function (Browser $browser) use ($user) {
            $browser->visit('/login')
                ->type('email', $user->email)
                ->type('password', 'password')
                ->press('Login')
                ->assertPathIs('/dashboard')
                ->assertSee('Dashboard');
        });
    }
}
```

`visit()`, `type()`, `press()` e `assertSee()` sono le operazioni più usate in Dusk.

<Warning>
  Nei test Dusk non si usa `RefreshDatabase`. Come indica la documentazione ufficiale, inizializza i dati tra i test con `DatabaseMigrations` o `DatabaseTruncation`.
</Warning>

## Pattern Page Object

Quando testi schermate complesse, creare un page object con `dusk:page` facilita la manutenzione.

```shell theme={null}
php artisan dusk:page Login
```

In `tests/Browser/Pages/Login.php` definisci `url()` ed `elements()` e riutilizzali lato test.

```php theme={null}
use Tests\Browser\Pages\Login;

$browser->visit(new Login)
    ->type('@email', 'taylor@laravel.com')
    ->type('@password', 'password')
    ->click('@submit')
    ->assertSee('Dashboard');
```

## Screenshot e debug

Per indagare i fallimenti è utile salvare screenshot e log della console.

```php theme={null}
$browser->screenshot('login-failed');
$browser->responsiveScreenshots('login-page');
$browser->screenshotElement('#login-form', 'login-form');
$browser->storeConsoleLog('login-console');
```

* Screenshot: `tests/Browser/screenshots`
* Log della console: `tests/Browser/console`

## Esecuzione in CI (GitHub Actions)

In GitHub Actions avvia ChromeDriver e il server incluso di Laravel e poi esegui `php artisan dusk`.

```yaml theme={null}
name: Dusk tests

on: [push, pull_request]

jobs:
  dusk:
    runs-on: ubuntu-latest
    env:
      APP_URL: http://127.0.0.1:8000
      DB_USERNAME: root
      DB_PASSWORD: root
      MAIL_MAILER: log
    steps:
      - uses: actions/checkout@v5
      - run: cp .env.example .env
      - run: composer install --no-progress --prefer-dist --optimize-autoloader
      - run: php artisan key:generate
      - run: php artisan dusk:chrome-driver --detect
      - run: ./vendor/laravel/dusk/bin/chromedriver-linux --port=9515 &
      - run: php artisan serve --no-reload &
      - run: php artisan dusk
```

## Flusso di esecuzione di Dusk

```mermaid theme={null}
flowchart TD
    A["php artisan dusk"] --> B["Backup di .env"]
    B --> C["Applica .env.dusk.local"]
    C --> D["Avvia ChromeDriver"]
    D --> E["Esegue il test Browser<br>visit / type / click / assertSee"]
    E --> F{"Fallito?"}
    F -->|Yes| G["Salva screenshot e log"]
    F -->|No| H["Test completato"]
    G --> I["Ripristina .env"]
    H --> I
```

## Documentazione ufficiale

<Card title="Laravel Dusk — Documentazione ufficiale" icon="arrow-right" href="https://laravel.com/docs/dusk">
  Consulta la documentazione ufficiale per tutte le API di Dusk (attese, asserzioni, operazioni da tastiera, operazioni su iframe, ecc.).
</Card>


## Related topics

- [Laravel Sail](/it/sail.md)
- [Laravel Maestro — l'orchestratore per lo sviluppo degli starter kit](/it/blog/maestro-introduction.md)
- [Sessioni](/it/session.md)
- [Test del database](/it/database-testing.md)
- [Laravel Passkeys — indagine iniziale (passkeys-server + @laravel/passkeys)](/it/blog/passkeys-introduction.md)
