Browsertest Dusk
Browsertests (Laravel Dämmerung)
- Einführung
- Installation
- Beginnen Sie mit
- Interaktion mit Elementen
- Verfügbare Aussagen
- Seite
- Komponenten
- Kontinuierliche Integration
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:fails
Befehl:
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() ); }UmgebungsverarbeitungDamit 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
-Dateien und benennt Ihre Dusk-Umgebungsdateien in .env
um. Wenn der Test abgeschlossen ist, werden Ihre .env
-Dateien wiederhergestellt. .env
-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 BefehlErstellen Sie mehrere BrowserManchmal 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 dergenerierte Anmeldeschnittstelle zu testen.
make:auth
-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 inFacebookWebDriverWebDriverKeys
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-DialogDusk 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();SelektorbereichManchmal 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
assertTitleContains
assertUrlIs
assert SchemeIs
assertSchemeIsNot
assertHostIs
assertHostIsNot
assertPortIs
assertPortIsNot
assertPathBeginsWith
asser rtPathIs
assertPathIsNot
assertRouteIs
assertQueryStringHas
assertQueryStringMissing
assertFragmentIs
assertFragmentBe ginsWith
assertFragmentIsNot
assertHasCookie
assertCookieMi ssing
assertCookieValue
assertPlainCookieValue
assertSee
assertDontSee
assertSeeIn
assertDontSeeIn
assertSourc eHas
assertSourceMissing
assertSeeLink
assertDontSeeLink
assertInputValue
assertInputValueIsNot
assertChecked
assertNotChecked
assertRadioSelected
assertRadioNotSelected
assertSelected
assertNotSelected
assertSelectHasOptions
as sertSelectMissingOptions
assertSelectHasOption
assertValue
assertVisible
assertPresent
assertMissing
assertDialogOpene d
assertEnabled
assertDisabled
assertFocused
assert NotFocused
assertVue
assertVueIsNot
assertVueContains
assertVueDoesNotContain
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);assertDontSeeInStellen Sie sicher, dass der angegebene Text nicht im Selektorbereich vorhanden ist:
$browser->assertDontSeeIn($selector, $text);assertSourceHasStellen Sie sicher, dass der angegebene Quellcode auf der aktuellen Seite vorhanden ist:
$browser->assertSourceHas($code);assertSourceMissin gStellen 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);assertDontSeeLinkBestätigen, wann Der angegebene Link existiert auf der vorherigen Seite nicht:
$browser->assertDontSeeLink($linkText);assert InputValueStellen 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 duskPassen Sie in der Datei
den Wert von .env.testing
an: APP_URL
APP_URL=http://127.0.0.1:8000Dieser Artikel erschien zuerst auf der Website