Browsertest Dusk


Browsertests (Laravel Dämmerung)

Einführung

Laravel Dusk Bietet eine ausdrucksstarke, benutzerfreundliche Browser-Automatisierungs- und Test-API. Standardmäßig erfordert Dusk nicht, dass JDK oder Selenium auf Ihrem Computer installiert ist. Stattdessen müssen Sie für die Installation einen separaten ChromeDriver verwenden. Natürlich können Sie auch andere Selenium-kompatible Treiber verwenden.

Installation

Sie sollten zuerst die laravel/dusk-Abhängigkeit zu Ihrem Composer hinzufügen:

composer require --dev laravel/dusk

{note} Wenn Sie den Dusk-Dienstanbieter manuell registrieren, achten Sie darauf, Es kann nicht in Ihrer Produktionsumgebung registriert werden, da dies dazu führen könnte, dass einige unkontrollierte Benutzer die Kontrolle über Ihre Anwendung erlangen.

Nach der Installation des Dusk-Pakets führen Sie den Befehl dusk:install aus:

php artisan dusk:install

Browser Das Verzeichnis wird im Verzeichnis tests erstellt und enthält einen Testfall. Als nächstes legen Sie die Variable .env in Ihrer Datei APP_URL fest. Dieser Wert sollte mit der URL übereinstimmen, die die App in Ihrem Browser öffnet.

Um Tests auszuführen, verwenden Sie den Befehl dusk. Der Befehl dusk kann dieselben Argumente wie der Befehl phpunit annehmen:

php artisan dusk

Wenn ein Test beim letzten Ausführen des Befehls dusk fehlgeschlagen ist, können Sie Zeit sparen, indem Sie den fehlgeschlagenen Test mit dem erneut ausführen dusk:failsBefehl:

php artisan dusk:fails

{Hinweis} Dämmerungsanforderungen ChromeDriver Die Binärdatei ist ausführbar. Wenn beim Ausführen von Dusk Probleme auftreten, können Sie mit dem folgenden Befehl sicherstellen, dass die Binärdatei ausführbar ist: chmod -R 0755 vendor/laravel/dusk/bin.

Anderen Browser verwenden

Standardmäßig verwendet Dusk den Google Chrome-Browser und eine separate Installation ChromeDriver zum Ausführen Ihrer Browsertests. Natürlich können Sie Ihren eigenen Selenium-Dienst ausführen und ihn mit jedem beliebigen Browser testen.

Öffnen Sie dazu die Datei tests/DuskTestCase.php, die die Basisklasse für Anwendungstestfälle darstellt. In dieser Datei können Sie den Aufruf der Methode startChromeDriver entfernen. Auf diese Weise startet Dusk ChromeDriver nicht automatisch.

/**
 * 准备执行 Dusk 测试。
 *
 * @beforeClass
 * @return void
 */
 public static function prepare(){ 
    // static::startChromeDriver();
   }

Sie können dann die driver-Methode ändern, um eine Verbindung mit der URL und dem Port Ihrer Wahl herzustellen. Darüber hinaus können Sie die „gewünschten Fähigkeiten“ (Desired Capabilities) ändern, an die übergeben wird WebDriver:

/**
 * 创建 RemoteWebDriver 实例。
 *
 * @return \Facebook\WebDriver\Remote\RemoteWebDriver
 */
 protected function driver(){
     return RemoteWebDriver::create(   
          'http://localhost:4444/wd/hub', DesiredCapabilities::phantomjs()    
       );
    }

on Beginnen Sie mit

, um einen Test zu erstellen.

Um einen zu erstellen Dämmerungstest, verwenden Sie den Befehl dusk:make. Die erstellten Tests werden im tests/Browser-Verzeichnis abgelegt:

php artisan dusk:make LoginTest

Tests ausführen

Verwenden Sie den Befehl dusk, um Ihre Browsertests auszuführen:

php artisan dusk

Wenn der Test beim letzten Ausführen des Befehls dusk fehlgeschlagen ist, können Sie ihn mit ausführen Mit dem dusk:fails führt der Befehl fehlgeschlagene Tests erneut aus, um Zeit zu sparen:

php artisan dusk:fails

dusk Der Befehl akzeptiert alle Parameter für den normalen Betrieb von PHPUnit. Dies ermöglicht es Ihnen beispielsweise, Tests in einer bestimmten Gruppe auszuführen:

php artisan dusk --group=foo

ChromeDriver manuell ausführen

Standardmäßig versucht Dusk, es auszuführen ChromeDriver automatisch. Wenn es auf Ihrem speziellen System nicht funktioniert, können Sie ChromeDriver manuell ausführen, bevor Sie den Befehl dusk ausführen. Wenn Sie ChromeDriver manuell ausführen möchten, müssen Sie die folgende Zeile in Ihrer tests/DuskTestCase.php-Datei auskommentieren:

/**
 * 为 Dusk 测试做准备。
 *
 * @beforeClass
 * @return void
 */
 public static function prepare(){ 
    // static::startChromeDriver();
 }

Wenn Ihr ChromeDriver außerdem auf einem Nicht-9515-Port ausgeführt wird, müssen Sie den < ändern 🎜> Methode: driver

/**
 * 创建 RemoteWebDriver 实例。
 *
 * @return \Facebook\WebDriver\Remote\RemoteWebDriver
 */
 protected function driver(){ 
    return RemoteWebDriver::create( 
           'http://localhost:9515', DesiredCapabilities::chrome()   
       );
   }

Umgebungsverarbeitung

Damit Dusk seine eigene Umgebungsdatei zum Ausführen von Tests verwenden kann, müssen Sie Sie müssen eine

-Datei im Projektstammverzeichnis erstellen. Einfach ausgedrückt: Wenn Sie die .env.dusk.{environment}-Umgebung zum Ausführen von local-Befehlen verwenden möchten, müssen Sie eine dusk-Datei erstellen. .env.dusk.local

Beim Ausführen von Tests sichert Dusk Ihre

-Dateien und benennt Ihre Dusk-Umgebungsdateien in .env um. Wenn der Test abgeschlossen ist, werden Ihre .env-Dateien wiederhergestellt. .env

Browser erstellen

Lassen Sie uns zunächst einen Testfall schreiben, um zu überprüfen, ob wir uns im System anmelden können . Nachdem wir das Testbeispiel generiert haben, können wir es ändern und zur Anmeldeoberfläche springen lassen. Klicken Sie nach Eingabe der Anmeldeinformationen auf die Schaltfläche „Anmelden“. Wir erstellen eine Browserinstanz über die

-Methode: browse

<?php
    namespace Tests\Browser;
    use App\User;use Tests\DuskTestCase;
    use Laravel\Dusk\Chrome;
    use Illuminate\Foundation\Testing\DatabaseMigrations;
    class ExampleTest extends DuskTestCase{ 
       use DatabaseMigrations;    
      /**
     * 一个基本的浏览器测试例子。
     *
     * @return void
     */   
      public function testBasicExample()  
        {     
           $user = factory(User::class)->create([          
             'email' => 'taylor@laravel.com',      
           ]);        
           $this->browse(function ($browser) use ($user) {      
                 $browser->visit('/login')               
                      ->type('email', $user->email)                    
                      ->type('password', 'secret')                    
                      ->press('Login')                    
                      ->assertPathIs('/home');      
                    });   
           }
       }

Im obigen Beispiel erhält die

-Methode einen Callback-Parameter. Dusk fügt diese Browser-Instanz automatisch in den Rückrufprozess ein und diese Browser-Instanz kann mit Ihrer Anwendung interagieren und behaupten. browse

{tip} Dieses Testbeispiel kann verwendet werden, um die durch den Befehl

generierte Anmeldeschnittstelle zu testen. make:auth

Erstellen Sie mehrere Browser

Manchmal benötigen Sie möglicherweise mehrere Browser, um korrekt zu testen. Verwenden Sie beispielsweise mehrere Browser, um eine Online-Chat-Seite zu testen, die über Websockets kommuniziert. Wenn Sie mehrere Browser erstellen möchten, müssen Sie Namen verwenden, um Browserinstanzen im Rückruf der

-Methode zu unterscheiden, und diese dann an den Rückruf übergeben, um für mehrere Browserinstanzen „anzuwenden“: browse

$this->browse(function ($first, $second) {
    $first->loginAs(User::find(1))        
      ->visit('/home')          
      ->waitForText('Message');    
    $second->loginAs(User::find(2))       
         ->visit('/home')          
         ->waitForText('Message')           
         ->type('message', 'Hey Taylor')           
         ->press('Send');   
    $first->waitForText('Hey Taylor')          
          ->assertSee('Jeffrey Way');
        });

Browserfenstergröße ändern

Sie können die resize-Methode verwenden, um die Browserfenstergröße anzupassen:

$browser->resize(1920, 1080);

maximize Methode zum Maximieren des Browserfensters:

$browser->maximize();

Browser-Makro

Wenn Sie eines definieren möchten, können Sie einen benutzerdefinierten Browser verwenden Methoden, die in verschiedenen Tests wiederverwendet werden, können die Methode Browser in der Klasse macro verwenden. Normalerweise sollten Sie es über die boot-Methode des Dienstanbieters aufrufen: Die

<?php
    namespace App\Providers;
    use Laravel\Dusk\Browser;
    use Illuminate\Support\ServiceProvider;
    class DuskServiceProvider extends ServiceProvider{  
      /**
     * 注册Dusk的浏览器宏
     *
     * @return void
     */   
     public function boot()  
       {       
          Browser::macro('scrollToElement', function ($element = null) { 
                     $this->script("$('html, body').animate({ scrollTop: $('$element').offset().top }, 0);");
                     return $this;       
                 });    
          }
     }

macro-Methode erhält einen Namen als ersten Parameter und einen Abschluss als zweiten Parameter. Wenn ein Browser-Makro als Methode einer Implementierung von Browser aufgerufen wird, wird der Abschluss des Browser-Makros ausgeführt:

$this->browse(function ($browser) use ($user) { 
   $browser->visit('/pay')         
      ->scrollToElement('#credit-card-details')            
      ->assertSee('Enter Credit Card Details');
   });

Authentifizierung

Sie testen möglicherweise häufig einige Seiten, die eine Authentifizierung erfordern. Sie können die loginAs-Methode von Dusk verwenden, um zu vermeiden, dass Sie sich für jeden Test einmal auf der Anmeldeseite anmelden müssen. loginAs Sie können die Benutzer-ID oder die Benutzermodellinstanz verwenden:

$this->browse(function ($first, $second) { 
   $first->loginAs(User::find(1))         
         ->visit('/home');
       });

{note} Nach Verwendung der loginAs-Methode wird die Sitzung des Benutzers für die Verwendung durch andere Testfälle beibehalten.

Datenbankmigration

Genau wie das Zertifizierungsbeispiel oben, wenn Ihre Testfälle migriert werden müssen , sollten Sie das Merkmal RefreshDatabase nicht verwenden. RefreshDatabase Das Merkmal verwendet eine Datenbanktransaktion, die nicht auf HTTP-Anfragen anwendbar ist. Stattdessen verwenden wir DatabaseMigrations Eigenschaft:

<?php
    namespace Tests\Browser;
    use App\User;
    use Tests\DuskTestCase;
    use Laravel\Dusk\Chrome;
    use Illuminate\Foundation\Testing\DatabaseMigrations;
    class ExampleTest extends DuskTestCase{
        use DatabaseMigrations;
    }

Interagiert mit Elementen

Dämmerung Selektoren

Die Auswahl eines guten CSS-Selektors für die Elementinteraktion ist einer der schwierigsten Teile beim Schreiben von Dush-Tests. Im Laufe der Zeit können Änderungen am Frontend dazu führen, dass CSS-Selektoren wie die folgenden Tests abbrechen:

// HTML...
<button>Login</button>
// Test...
$browser->click('.login-page .container div > button');

Dusk-Selektoren ermöglichen es Ihnen, sich auf das Schreiben effektiver Tests zu konzentrieren, anstatt sich CSS-Selektoren zu merken. Um einen Selektor zu definieren, fügen Sie einfach ein dusk-Attribut zu Ihrem HTML-Element hinzu. Fügen Sie dann @ vor dem Selektor hinzu, um zusätzliche Elemente im Dämmerungstest zu bedienen:

// HTML...
<button dusk="login-button">Login</button>
// Test...
$browser->click('@login-button');

Klicken Sie auf den Link

Um auf einen Link zu klicken, können Sie die Methode clickLink in der Browserinstanz verwenden. Die clickLink-Methode klickt auf den Link, der den angezeigten Text angibt:

$browser->clickLink($linkText);

{Hinweis} Diese Methode kann mit jQuery interagieren. Wenn auf der Seite kein jQuery vorhanden ist, fügt Dusk es automatisch in die Seite ein, um sicherzustellen, dass es während des Tests verfügbar ist.

Text, Werte und Eigenschaften

Werte abrufen und festlegen

Dusk bietet mehrere Möglichkeiten, mit den aktuell angezeigten Texten, Werten und Eigenschaften zu interagieren. Um beispielsweise den „Wert“ eines Elements abzurufen, das einem angegebenen Selektor entspricht, verwenden Sie die Methode value:

// 检索值...
$value = $browser->value('selector');
// 设置值...
$browser->value('selector', 'value');

Text abrufen

text Diese Methode kann verwendet werden, um den angezeigten Text des Elements im angegebenen Selektor abzugleichen:

$text = $browser->text('selector');

Attribut abrufen

Abschließend attribute diese Methode Attribute, die verwendet werden können, um Elemente im angegebenen Selektor abzugleichen:

$attribute = $browser->attribute('selector', 'value');

Verwendung des Formulars

Eingabewert

Dusk stellt Formulare und Eingaben bereit Verschiedene Möglichkeiten, mit Elementen zu interagieren. Schauen wir uns zunächst ein Beispiel für die Eingabe von Text in ein Eingabefeld an:

$browser->type('email', 'taylor@laravel.com');

Beachten Sie, dass die Methode type zwar einen CSS-Selektor als Parameter übergeben kann, dies jedoch nicht erforderlich ist. Wenn kein CSS-Selektor bereitgestellt wird, sucht Dusk nach einer Eingabe mit demselben name-Attribut. Wenn es immer noch nicht gefunden wird, versucht Dusk, ein name mit demselben Wert wie das übergebene textarea-Attribut zu finden.

Um Text an ein Feld anzuhängen, ohne seinen Inhalt zu löschen, können Sie die Methode append verwenden:

$browser->type('tags', 'foo')   
     ->append('tags', ', bar, baz');

Sie können clear verwenden Methode zum Löschen des Eingabewerts:

$browser->clear('email');

Dropdown-Menü

Müssen Sie einen Wert im Dropdown-Menü auswählen, können Sie die Methode select verwenden. Ähnlich wie die Methode type erfordert die Methode select nicht unbedingt die Übergabe eines CSS-Selektors. Wenn Sie die Methode select verwenden, sollten Sie den tatsächlichen Wert der Option und nicht ihren Anzeigetext übergeben:

$browser->select('size', 'Large');

Sie können eine Option auch zufällig auswählen, indem Sie das zweite Argument weglassen:

$browser->select('size');

Kontrollkästchen

Bei Verwendung des Kontrollkästchens „Häkchen“ können Sie check verwenden Methode. Wie bei vielen anderen eingabebezogenen Methoden ist es nicht erforderlich, einen CSS-Selektor zu übergeben. Wenn der genaue Selektor nicht gefunden werden kann, sucht Dusk nach einem Kontrollkästchen, das mit dem Attribut name übereinstimmt:

$browser->check('terms');$browser->uncheck('terms');

Optionsfeld

Verwenden Sie „select“ bei der Auswahl Wenn Sie die Optionsschaltfläche auswählen, können Sie die Methode radio verwenden. Wie bei vielen anderen eingabebezogenen Methoden ist es nicht erforderlich, einen CSS-Selektor zu übergeben. Wenn der genaue Selektor nicht gefunden werden kann, sucht Dusk nach Optionsfeldern, die dem name-Attribut oder dem value-Attribut entsprechen:

$browser->radio('version', 'php7');

Die Methode

Anhang

attach kann eine Datei an das Eingabeelement file anhängen. Wie bei vielen anderen eingabebezogenen Methoden ist es nicht erforderlich, einen CSS-Selektor zu übergeben. Wenn der genaue Selektor nicht gefunden wird, sucht Dusk nach dem Dateieingabefeld, das dem name-Attribut entspricht:

$browser->attach('photo', __DIR__.'/photos/me.png');

{Hinweis} Die Attach-Methode erfordert die Verwendung der PHP-Erweiterung Zip. Auf Ihrem Server muss diese Erweiterung installiert sein.

Mit der Tastaturmethode

keys können Sie das Eingabeverhältnis im Element festlegen type Methode für komplexere Eingabesequenzen. Sie können beispielsweise während der Eingabe eines Werts eine Taste drücken. In diesem Beispiel wird bei der Eingabe von taylor auch die Taste shift gedrückt. Nachdem taylor eingegeben wurde, wird otwell ohne Drücken einer Taste eingegeben:

$browser->keys('selector', ['{shift}', 'taylor'], 'otwell');

Sie können sogar ein Element in Ihrer Anwendung auswählen und die „Tastenkombination“ drücken:

$browser->keys('.app', ['{command}', 'j']);

{Tipp} Alle in {} enthaltenen Tastaturtasten sind entsprechend in FacebookWebDriverWebDriverKeys definiert Klasse, die Sie in GitHub finden.

Klicken Sie mit der Maus auf das Element

🎜> Methoden können verwendet werden, um auf ein Element zu „klicken“, das dem angegebenen Selektor entspricht: click

$browser->click('.selector');

Mouseover

Verfügbare Methoden für Mouseover-Aktionen auf Elementen, die mit dem angegebenen Selektor übereinstimmen: mouseover

$browser->mouseover('.selector');

Drag and Drop

Methode zum Ziehen von Elementen, die dem angegebenen Selektor entsprechen, zu anderen Elementen: drag

$browser->drag('.from-selector', '.to-selector');

Alternativ können Elemente in eine einzige Richtung gezogen werden:

$browser->dragLeft('.selector', 10);
$browser->dragRight('.selector', 10);
$browser->dragUp('.selector', 10);
$browser->dragDown('.selector', 10);

JavaScript-Dialog

Dusk bietet mehrere Methoden der Dialogbox-Interaktion:

// 等待对话框显示:
$browser->waitForDialog($seconds = null);
// 断言对话框已经显示,并且其消息与给定值匹配:
$browser->assertDialogOpened('value');
// 在打开的 JavaScript 提示对话框中输入给定值:
$browser->typeInDialog('Hello World');

Schließen Sie das geöffnete JavaScript-Dialogfeld, indem Sie auf die Schaltfläche „OK“ klicken:

$browser->acceptDialog();

Schließen Sie das geöffnete JavaScript-Dialogfeld, indem Sie auf die Schaltfläche „Abbrechen“ klicken Dialog (nur gültig für Bestätigungsdialoge):

$browser->dismissDialog();

Selektorbereich

Manchmal möchten Sie möglicherweise mehrere Vorgänge ausführen innerhalb des angegebenen Selektorbereichs. Beispielsweise möchten Sie möglicherweise bestätigen, dass ein bestimmter Text in einer Tabelle vorhanden ist, und dann auf eine Schaltfläche in der Tabelle klicken. Diese Anforderung kann mit der Methode

erreicht werden. Alle innerhalb der Callback-Funktion ausgeführten Vorgänge sind auf den ursprünglichen Selektor beschränkt: with

$browser->with('.table', function ($table) { 
   $table->assertSee('Hello World')         
        ->clickLink('Delete');
     });

Warten auf Elemente

Beim Testen von Anwendungen, die häufig JavaScript verwenden, ist es oft notwendig, vor dem Testen zu „warten“, bis das angegebene Element oder die angegebenen Daten verfügbar sind. Die Dämmerung macht es einfacher. Mit einer Reihe von Methoden ist es möglich zu warten, bis ein Seitenelement verfügbar ist oder sogar bis ein bestimmter JavaScript-Ausdruck als true ausgewertet wird.

Warten

Wenn Sie die Pause für eine bestimmte Anzahl von Millisekunden testen müssen, können Sie die pause-Methode verwenden:

$browser->pause(1000);

Warten Sie auf die Auswahl des Geräts

waitFor Die Methode kann verwendet werden, um die Testausführung anzuhalten, bis ein Element auf der Seite angezeigt wird, das dem angegebenen CSS-Selektor entspricht. Standardmäßig wird nach einer Pause von mehr als 5 Sekunden eine Ausnahme ausgelöst. Bei Bedarf können Sie als zweiten Parameter ein benutzerdefiniertes Timeout übergeben:

// 等待选择器 5 秒时间...
$browser->waitFor('.selector');
// 等待选择器 1 秒时间...
$browser->waitFor('.selector', 1);

Sie können auch warten, bis der angegebene Selektor von der Seite verschwindet:

$browser->waitUntilMissing('.selector');
$browser->waitUntilMissing('.selector', 1);

Der Selektor ist verfügbar. Zeitgesteuertes Scoping

Gelegentlich möchten Sie vielleicht auf einen Selektor warten und dann mit ihm interagieren. Beispielsweise möchten Sie möglicherweise warten, bis ein modales Fenster verfügbar wird, und dann auf die Schaltfläche „OK“ des modalen Fensters klicken. In diesem Fall kann die Methode whenAvailable verwendet werden. Alle Elementoperationen, die innerhalb des angegebenen Rückrufs ausgeführt werden sollen, werden auf den Startselektor beschränkt:

$browser->whenAvailable('.modal', function ($modal) { 
   $modal->assertSee('Hello World')       
      ->press('OK');
   });

await text

waitForText Es können Methoden verwendet werden, um darauf zu warten, dass ein bestimmter Text auf der Seite angezeigt wird:

// 等待指定文本 5 秒时间...
$browser->waitForText('Hello World');
// 等待指定文本 1 秒时间...
$browser->waitForText('Hello World', 1);

Wait for a link

waitForLink Die Methode wird verwendet, um darauf zu warten, dass der angegebene Linktext auf der Seite angezeigt wird:

// 等待指定链接 5 秒时间...
$browser->waitForLink('Create');
// 等待给定链接 2 秒时间...
$browser->waitForLink('Create', 1);

Warten, bis die Seite springt

Wenn eine Pfadzusicherung wie $browser->assertPathIs('/home') angegeben ist, schlägt die Behauptung fehl, wenn window.location.pathname asynchron aktualisiert wird. Sie können die Methode waitForLocation verwenden, um darauf zu warten, dass die Seite zu einem bestimmten Pfad springt:

$browser->waitForLocation('/secret');

Sie können auch warten, bis die benannte Route springt:

$browser->waitForRoute($routeName, $parameters);

Warten Sie, bis die Seite neu geladen wird

Wenn Sie nach dem Neuladen der Seite bestätigen möchten, können Sie waitForReload verwenden Methode:

$browser->click('.some-action')  
      ->waitForReload()        
      ->assertSee('something');

Warten auf JavaScript-Ausdruck

Manchmal möchten Sie die Testausführung anhalten, bis der angegebene JavaScript-Ausdruck true ergibt. Dies lässt sich ganz einfach mit der waitUntil-Methode bewerkstelligen. Übergeben Sie einen Ausdruck an diese Methode, ohne das Schlüsselwort return oder das schließende Semikolon einzuschließen:

//等待表达式为 true 5 秒时间...
$browser->waitUntil('App.dataLoaded');
$browser->waitUntil('App.data.servers.length > 0');
// 等待表达式为 true 1 秒时间...
$browser->waitUntil('App.data.servers.length > 0', 1);

Warten Sie auf Vue-Ausdrücke

Die folgenden Methoden können verwendet werden. Wartet auf das gegebene Vue-Komponenteneigenschaft, die den angegebenen Wert enthalten soll oder nicht:

// 等待组件属性包含给定值...
$browser->waitUntilVue('user.name', 'Taylor', '@user');
// 等待组件属性不包含给定值...
$browser->waitUntilVueIsNot('user.name', null, '@user');

Auf Rückruf warten

Viele der „Warten“-Methoden von Dusk basieren auf der zugrunde liegenden waitUsing-Methode. Diese Methode kann direkt verwendet werden, um darauf zu warten, dass der angegebene Rückruf true zurückgibt. waitUsing Die Methode akzeptiert die maximale Wartezeit in Sekunden, das Intervall zwischen Abschlussausführungen, den ausgeführten Abschluss und eine zuverlässige Fehlermeldung:

$browser->waitUsing(10, 1, function () use ($something) { 
   return $something->isReady();
   },"Something wasn't ready in time.");

Vue-Behauptungen machen

Dusk ermöglicht es Ihnen auch Vue macht Aussagen über den Zustand von Komponentendaten. Angenommen, Ihre Anwendung enthält die folgende Vue-Komponente:

// HTML...
<profile dusk="profile-component"></profile>
// 定义组件...
Vue.component('profile', {
    template: '<div>{{ user.name }}</div>',
    data: function () { 
               return {
                         user: {
                                  name: 'Taylor' 
                                  }        
                           };    
                      }
              });

Sie können die folgende Aussage zum Status der Vue-Komponente treffen:

/**
 * 一个简单的 Vue 测试例子。
 *
 * @return void
 */
 public function testVue(){ 
    $this->browse(function (Browser $browser) {    
        $browser->visit('/')            
            ->assertVue('user.name', 'Taylor', '@profile-component');  
        });
    }

Verfügbare Behauptungen

Dusk bietet eine Reihe verfügbarer Behauptungsmethoden. Alle Behauptungen lauten wie folgt:

assertTitle

Stellen Sie sicher, dass der Webseitentitel mit dem angegebenen Text übereinstimmt:

$browser->assertTitle($title);

assertTitleContains

Stellen Sie sicher, dass der Webseitentitel den angegebenen Text enthält :

$browser->assertTitleContains($title);

assertUrlIs

Aktuell bestätigen URL (ohne Abfragezeichenfolge) entspricht der angegebenen Zeichenfolge:

$browser->assertUrlIs($url);

assertSchemeIs

Assert die aktuelle URL Entspricht der angegebenen Zeichenfolge:

$browser->assertSchemeIs($scheme);

assertSchemeIsNot

Aktiviert die aktuelle URL Entspricht einer Nichtübereinstimmung mit der angegebenen Zeichenfolge:

$browser->assertSchemeIsNot($scheme);

assertHostIs

Bestätigt den Host der aktuellen URL Entspricht dem angegebenen Wert:

$browser->assertHostIs($host);

assertHostIsNot

Bestätigt den Host der aktuellen URL Entspricht nicht dem angegebenen Wert:

$browser->assertHostIsNot($host);

assertPortIs

Assert die aktuelle URL Der Portwert entspricht dem angegebenen Wert:

$browser->assertPortIs($port);

assertPortIsNot

Bestätigen Sie die aktuelle URL Der Portwert stimmt nicht mit dem angegebenen Wert überein:

$browser->assertPortIsNot($port);

assertPathBeginsWith

Bestätigen Sie die aktuelle URL Beginnen Sie am angegebenen Pfad:

$browser->assertPathBeginsWith($path);

assertPa thIs

Stellt sicher, dass der aktuelle Pfad mit dem angegebenen Pfad übereinstimmt:

$browser->assertPathIs('/home');

assertPathIsNot

Stellen Sie sicher, dass der aktuelle Pfad nicht mit dem angegebenen Pfad übereinstimmt:

$browser->assertPathIsNot('/home');

behauptenRouteIs

Aktuell bestätigen URL, die mit der angegebenen benannten Route übereinstimmt URL:

$browser->assertRouteIs($name, $parameters);

assertQueryStringHas

Stellen Sie sicher, dass der angegebene Abfragezeichenfolgenparameter vorhanden ist:

$browser->assertQueryStringHas($name);

Stellen Sie sicher, dass der angegebene Abfragezeichenfolgenparameter vorhanden ist und dass der Wert des Parameters vorliegt Für den angegebenen Wert:

$browser->assertQueryStringHas($name, $value);

assertQueryStringM issing

Bestätigt, dass der angegebene Abfragezeichenfolgenparameter nicht existiert:

$browser->assertQueryStringMissing($name);

assertFragmentIs

Bestätigt, dass das aktuelle Fragment dem angegebenen Fragment entspricht:

$browser->assertFragmentIs('anchor');

assertFragmentBeginsWith

Stellt sicher, dass das aktuelle Fragment mit dem angegebenen Fragment beginnt:

$browser->assertFragmentBeginsWith('anchor');

assertFragmentIsNot

Stellt sicher, dass das aktuelle Fragment die angegebenen Anforderungen nicht erfüllt Shards:

$browser->assertFragmentIsNot('anchor');

assertHasCookie

Bestätigt, dass das angegebene existiert Cookie:

$browser->assertHasCookie($name);

assertCookieMissing

Bestätigt, dass das angegebene nicht existiert Cookie:

$browser->assertCookieMissing($name);

assertCookieValue

Cookie bestätigen Der angegebene Wert existiert:

$browser->assertCookieValue($name, $value);

assertPlainCookieValue

Assert unverschlüsseltes Cookie Der angegebene Wert existiert:

$browser->assertPlainCookieValue($name, $value);

assertSee

Stellen Sie sicher, dass der angegebene Text auf der aktuellen Seite vorhanden ist:

$browser->assertSee($text);

assertDontSee

Stellen Sie sicher, dass der angegebene Text auf der aktuellen Seite nicht vorhanden ist:

$browser->assertDontSee($text);

assertSeeIn

<🎜 Stellen Sie sicher, dass der Selektor innerhalb des Gültigkeitsbereichs vorhanden ist Angegebener Text:

$browser->assertSeeIn($selector, $text);

assertDontSeeIn

Stellen Sie sicher, dass der angegebene Text nicht im Selektorbereich vorhanden ist:

$browser->assertDontSeeIn($selector, $text);

assertSourceHas

Stellen Sie sicher, dass der angegebene Quellcode auf der aktuellen Seite vorhanden ist:

$browser->assertSourceHas($code);

assertSourceMissin g

Stellen Sie sicher, dass der angegebene Quellcode auf der aktuellen Seite nicht vorhanden ist:

$browser->assertSourceMissing($code);

assertSeeLink

Assert current Die Seite hat den angegebenen Link:

$browser->assertSeeLink($linkText);

assertDontSeeLink

Bestätigen, wann Der angegebene Link existiert auf der vorherigen Seite nicht:

$browser->assertDontSeeLink($linkText);

assert InputValue

Stellen Sie sicher, dass der angegebene Wert im Eingabefeld vorhanden ist:

$browser->assertInputValue($field, $value);

assertInputValueIsNot

Bestätigen Sie, dass das Eingabefeld nicht existiert Angegebener Wert:

$browser->assertInputValueIsNot($field, $value);

assertCheck ed

Bestätigt, dass das angegebene Kontrollkästchen ausgewählt ist:

$browser->assertChecked($field);

assertNotChecked

Bestätigen, dass das angegebene Kontrollkästchen nicht aktiviert ist:

$browser->assertNotChecked($field);

assertRadioSelected

Stellen Sie sicher, dass das angegebene Optionsfeld ausgewählt ist:

$browser->assertRadioSelected($field, $value);

assertRadioNotSelected

Stellen Sie sicher, dass das angegebene Optionsfeld nicht ausgewählt ist:

$browser->assertRadioNotSelected($field, $value);

asse rtSelected

Bestätigt, dass das Dropdown-Feld mit dem angegebenen Wert ausgewählt ist:

$browser->assertSelected($field, $value);

assertNotSelected

Stellen Sie sicher, dass das Dropdown-Feld den angegebenen Wert nicht auswählt:

$browser->assertNotSelected($field, $value);

assertSelectHasOptions

Assert optional zu Geben Sie die Werte im Array an:

$browser->assertSelectHasOptions($field, $values);

assertSelectMis singOptions

Bestätigt, dass der ausgewählte Wert kein Wert im angegebenen Array ist:

$browser->assertSelectMissingOptions($field, $values);

assertSelectHasOption

Setzen Sie diesen optionalen Wert auf den angegebenen Wert:

$browser->assertSelectHasOption($field, $value);

assertValue

Aktiviert Elemente innerhalb des Selektorbereichs Der angegebene Wert existiert:

$browser->assertValue($selector, $value);

assertVisible

Stellen Sie sicher, dass Elemente innerhalb des Auswahlbereichs sichtbar sind:

$browser->assertVisible($selector);

assert Present

bestätigt, dass das Element innerhalb des Selektorbereichs existiert:

$browser->assertPresent($selector);

assertMissing

Stellen Sie sicher, dass das Element innerhalb des Selektorbereichs nicht existiert:

$browser->assertMissing($selector);

assertDialogOpened

Assert, das die angegebene Nachricht enthält JavaScript Das Dialogfeld wurde geöffnet:

$browser->assertDialogOpened($message);

assertEnabled

Bestätigen Sie, dass das angegebene Feld aktiviert ist:

$browser->assertEnabled($field);

assertDisabled

Bestätigt, dass das angegebene Feld deaktiviert ist:

$browser->assertDisabled($field);

assertFocused

Bestätigt, dass der Fokus auf dem angegebenen Feld liegt:

$browser->assertFocused($field);

asser tNotFocused

gibt an, dass der Fokus nicht auf dem angegebenen Feld liegt:

$browser->assertNotFocused($field);

assertVue

behaupten Die Eigenschaften der Vue-Komponentendaten stimmen mit dem angegebenen Wert überein:

$browser->assertVue($property, $value, $componentSelector = null);

assertVueIsNot

Stellen Sie sicher, dass die Eigenschaften der Vue-Komponentendaten nicht mit dem angegebenen Wert übereinstimmen:

$browser->assertVueIsNot($property, $value, $componentSelector = null);

assertVueContains

Assert Vue Die Eigenschaft der Komponentendaten ist ein Array, und das Array enthält den angegebenen Wert:

$browser->assertVueContains($property, $value, $componentSelector = null);

assertVueDoesNotContain

Behaupten Sie Vue Die Eigenschaft von Komponentendaten ist ein Array, und das Array enthält nicht den angegebenen Wert:

$browser->assertVueDoesNotContain($property, $value, $componentSelector = null);

Seite

hat Manchmal muss eine komplexe Reihe von Aktionen getestet werden, was das Lesen und Verstehen des Testcodes erschweren kann. Semantische Aktionen können über die Seite definiert werden und dann kann eine einzelne Methode auf der angegebenen Seite verwendet werden. Seiten können auch Verknüpfungen zu universellen Selektoren für Anwendungen oder einzelne Seiten definieren.

Seite generieren

dusk:page Der Artisan-Befehl kann Seitenobjekte generieren. Alle Seitenobjekte befinden sich im Verzeichnis tests/Browser/Pages:

php artisan dusk:page Login

Konfigurationsseite

Die Seite verfügt über 3 Methoden Standardmäßig: url, assert und elements. Hier beschreiben wir zunächst die Methoden url und assert. Die Methode elements wird in der Abkürzung Selektor detailliert beschrieben.

url Methoden Die Methode

url sollte einen Pfad zurückgeben, der die URL der Seite darstellt. Dusk verwendet diese URL im Browser, um zu der spezifischen Seite zu navigieren:

/**
 * 获得页面 URL 路径。
 *
 * @return string
 */
 public function url(){   
  return '/login';
 }

assert-Methode Die

assert-Methode kann jede Behauptung zur Überprüfung aufstellen Durchsuchen Sie, ob sich der Browser auf der angegebenen Seite befindet. Diese Methode ist nicht erforderlich. Sie können diese Aussagen basierend auf Ihren eigenen Bedürfnissen treffen. Diese Behauptungen werden automatisch ausgeführt, wenn Sie zu dieser Seite navigieren:

/**
 * 断言浏览器当前处于指定页面。
 *
 * @return void
 */
 public function assert(Browser $browser){ 
    $browser->assertPathIs($this->url());
   }

Navigiere zur Seite

Sobald die Seite danach geöffnet ist Konfiguration können Sie visit verwenden Methode zum Navigieren zur Seite:

use Tests\Browser\Pages\Login;$browser->visit(new Login);

Manchmal befinden Sie sich möglicherweise bereits auf der angegebenen Seite und müssen lediglich den Selektor und die Methode der aktuellen Seite in den aktuellen Test „laden“. Gängige Beispiele sind: Wenn Sie eine Schaltfläche drücken, werden Sie zur angegebenen Seite weitergeleitet, anstatt direkt zur angegebenen Seite zu navigieren. In diesem Fall müssen Sie die Methode on verwenden, um die Seite zu laden:

use Tests\Browser\Pages\CreatePlaylist;$browser->visit('/dashboard')  
      ->clickLink('Create Playlist')        
      ->on(new CreatePlaylist)        
      ->assertSee('@create');

Mit der Methode

Selector Shorthand

elements können Sie eine einfache und leicht zu merkende Kurzschrift für jeden CSS-Selektor auf der Seite definieren. Definieren wir beispielsweise eine Abkürzung für das Eingabefeld email auf der Anmeldeseite der App:

/**
 * 获取页面的元素简写。
 *
 * @return array
 */
 public function elements(){ 
    return [  
          '@email' => 'input[name=email]',   
         ];
       }

Jetzt können Sie diese Abkürzung anstelle des vollständigen CSS-Selektors verwenden, den Sie zuvor auf der Seite verwendet haben:

$browser->type('@email', 'taylor@laravel.com');

Abkürzung für globale Selektoren

Nach der Installation von Dusk, Page Basisklassen werden in Ihrem Verzeichnis tests/Browser/Pages gespeichert. Diese Klasse enthält ein siteElements Methode: Mit dieser Methode können globale Selektorabkürzungen definiert werden, sodass jede Seite in Ihrer Anwendung diese globalen Selektorabkürzungen verwenden kann:

/**
 * 获取站点全局的选择器简写。
 *
 * @return array
 */
 public static function siteElements(){
     return [    
         '@element' => '#selector',   
          ];
        }

Seitenmethoden

Zusätzlich zu den bereits auf der Seite definierten Standardmethoden können Sie auch andere Methoden definieren, die während des gesamten Testprozesses verwendet werden. Angenommen, wir entwickeln eine Musikverwaltungsanwendung. In der Anwendung benötigen wir möglicherweise eine öffentliche Methode zum Erstellen einer Liste, anstatt die Logik zum Erstellen einer Wiedergabeliste auf jeder Seite und in jeder Testklasse neu zu schreiben createPlaylist-Methode in Ihrer Seitenklasse: Nachdem die

<?php
    namespace Tests\Browser\Pages;
    use Laravel\Dusk\Browser;
    class Dashboard extends Page{  
      // 其他页面方法...  
      /**
     * 创建一个新的播放列表。
     *
     * @param  \Laravel\Dusk\Browser  $browser
     * @param  string  $name
     * @return void
     */  
      public function createPlaylist(Browser $browser, $name) 
         {     
            $browser->type('name', $name)            
                ->check('share')                
                ->press('Create Playlist');   
           }
       }

-Methode definiert wurde, können Sie diese Methode in jedem Test verwenden, der die Seite verwendet. Die Browserinstanz übergibt automatisch die Seitenmethode:

use Tests\Browser\Pages\Dashboard;$browser->visit(new Dashboard)    
    ->createPlaylist('My Playlist')        
    ->assertSee('My Playlist');

Komponente

Die Komponente ähnelt dem „Page Object“ von Dusk „“, aber es handelt sich eher um eine Benutzeroberfläche und ein Funktionsfragment, das häufig in der gesamten Anwendung wiederverwendet wird, z. B. in einer Navigationsleiste oder einem Popup-Fenster für Informationsbenachrichtigungen. Daher ist die Komponente nicht an eine explizite URL gebunden.

Generierung von Komponenten

Um eine Komponente zu generieren, verwenden Sie den Artisan-Befehl dusk:component, um die Komponente zu generieren. Die neu generierte Komponente befindet sich im Verzeichnis test/Browser/Components:

php artisan dusk:component DatePicker

Wie oben gezeigt, ist dies ein Beispiel für die Generierung einer „Datumsauswahl“-Komponente, die in Ihrer gesamten Anwendung auf vielen Seiten verwendet werden kann. Das manuelle Schreiben einer Browser-Automatisierungslogik für die Datumsauswahl für eine große Anzahl von Testseiten in einer Testsuite wäre umständlich. Eine bequemere Alternative besteht darin, eine Abenddämmerung zu definieren, die eine Datumsauswahl darstellt Komponente und kapseln Sie dann die Automatisierungslogik in der Komponente:

<?php
    namespace Tests\Browser\Components;
    use Laravel\Dusk\Browser;
    use Laravel\Dusk\Component as BaseComponent;
    class DatePicker extends BaseComponent{   
     /**
     * 获取组件的 root selector
     *
     * @return string
     */   
      public function selector()   
       {     
          return '.date-picker';   
        }   
    /**
     * 浏览器包含组件的断言
     *
     * @param  Browser  $browser
     * @return void
     */   
      public function assert(Browser $browser)  
        {      
          $browser->assertVisible($this->selector());  
         }    
    /**
     * 读取组件的元素快捷方式
     *
     * @return array
     */   
      public function elements()   
       {    
           return [        
               '@date-field' => 'input.datepicker-input',       
               '@month-list' => 'div > div.datepicker-months',            
               '@day-list' => 'div > div.datepicker-days',      
         ];   
      }   
     /**
     * 选择给定日期
     *
     * @param  \Laravel\Dusk\Browser  $browser
     * @param  int  $month
     * @param  int  $day
     * @return void
     */  
      public function selectDate($browser, $month, $day)  
        {    
            $browser->click('@date-field')             
               ->within('@month-list', function ($browser) use ($month) {       
                            $browser->click($month);         
                                })                
                 ->within('@day-list', function ($browser) use ($day) {       
                              $browser->click($day);           
                                   });   
          }
       }

Verwendung der Komponente

Einmal die Komponente Sobald die Definition abgeschlossen ist, können Sie auf jeder Testseite ganz einfach ein Datum in der Datumsauswahl auswählen. Und wenn Sie die Logik des ausgewählten Datums ändern müssen, ändern Sie einfach diese Komponente:

<?php
    namespace Tests\Browser;
    use Tests\DuskTestCase;
    use Laravel\Dusk\Browser;
    use Tests\Browser\Components\DatePicker;
    use Illuminate\Foundation\Testing\DatabaseMigrations;
    class ExampleTest extends DuskTestCase{  
      /**
     * 基本的组件测试示例
     *
     * @return void
     */   
      public function testBasicExample() 
         {    
             $this->browse(function (Browser $browser) {       
                  $browser->visit('/')                
                      ->within(new DatePicker, function ($browser) {                   
                           $browser->selectDate(1, 2018);               
                               })                   
                      ->assertSee('January');     
                       });   
            }
      }

Kontinuierliche Integration

CircleCI

Wenn Sie CircleCI zum Ausführen von Dusk-Tests verwenden, können Sie diese Konfigurationsdatei als Ausgangspunkt verwenden. Wie bei TravisCI starten wir den in PHP integrierten Webserver mit dem Befehl php artisan serve:

version: 2jobs:
    build:
        steps:            
            - run: sudo apt-get install -y libsqlite3-dev            
            - run: cp .env.testing .env            
            - run: composer install -n --ignore-platform-reqs            
            - run: npm install            
            - run: npm run production            
            - run: vendor/bin/phpunit            
            - run:
                name: Start Chrome Driver
                command: ./vendor/laravel/dusk/bin/chromedriver-linux
                background: true            
           - run:
                name: Run Laravel Server
                command: php artisan serve
                background: true            
           - run:
                name: Run Laravel Dusk Tests
                command: php artisan dusk

Codeship

Running Dusk im Codeship Zum Testen müssen Sie die folgenden Befehle zu Ihrem Codeship-Projekt hinzufügen. Natürlich sind diese Befehle nur Beispiele, Sie können bei Bedarf gerne weitere Befehle hinzufügen:

phpenv local 7.2
cp .env.testing .env
mkdir -p ./bootstrap/cache
composer install --no-interaction --prefer-dist
php artisan key:generate
nohup bash -c "php artisan serve 2>&1 &" && sleep 5
php artisan dusk

Heroku CI

Wenn Sie Dusk-Tests in Heroku CI ausführen, ändern Sie bitte Folgendes: Google Chrome Fügen Sie das Buildpack und das Skript zu Ihrer Heroku app.json-Datei hinzu:

{  "environments": { 
       "test": { 
            "buildpacks": [    
                { "url": "heroku/php" },        
                { "url": "https://github.com/heroku/heroku-buildpack-google-chrome" }    
                  ],      
              "scripts": {      
                 "test-setup": "cp .env.testing .env",        
                 "test": "nohup bash -c './vendor/laravel/dusk/bin/chromedriver-linux > /dev/null 2>&1 &' && nohup bash -c 'php artisan serve > /dev/null 2>&1 &' && php artisan dusk" 
                    }  
                  }  
            }
       }

Travis CI

in < Beim Ausführen Dämmerungstests in 🎜>Travis CI, auf die Sie sich beziehen können Konfiguration. Da es sich bei Travis CI nicht um eine grafische Umgebung handelt, müssen wir einige zusätzliche Schritte ausführen, um den Chrome-Browser zu starten. Darüber hinaus verwenden wir .travis.yml, um den in PHP integrierten Webserver zu starten: php artisan serve

language: php
php: 
 - 7.3
addons:
  chrome: stable
install:
  - cp .env.testing .env  
  - travis_retry composer install--no-interaction --prefer-dist --no-suggest  
  - php artisan key:generate
before_script:  
   - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &  
   - php artisan serve &
 script:
   - php artisan dusk

Passen Sie in der Datei

den Wert von .env.testing an: APP_URL

APP_URL=http://127.0.0.1:8000

Dieser Artikel erschien zuerst auf der Website
LearnKu.com.