نسخه:

Laravel Dusk

معرفی

Laravel Dusk یک API آزمایشی و اتوماسیون مرورگر رسا و با استفاده آسان ارائه می دهد. به طور پیش فرض، Dusk نیازی به نصب JDK یا Selenium در رایانه محلی خود ندارد. در عوض، Dusk از نصب ChromeDriver مستقل استفاده می‌کند . با این حال، شما آزاد هستید که از هر درایور سازگار با سلنیوم دیگری که می خواهید استفاده کنید.

نصب و راه اندازی

برای شروع، باید Google Chrome را نصب کنید و laravel/dusk وابستگی Composer را به پروژه خود اضافه کنید:

composer require laravel/dusk --dev

اگر به صورت دستی ارائه دهنده خدمات Dusk را ثبت نام می کنید، هرگز نباید آن را در محیط تولید خود ثبت کنید، زیرا انجام این کار می تواند منجر به این شود که کاربران خودسرانه بتوانند با برنامه شما احراز هویت کنند.

پس از نصب بسته Dusk، dusk:install دستور Artisan را اجرا کنید. این dusk:install دستور یک دایرکتوری ایجاد می کند tests/Browser ، یک نمونه آزمایش Dusk، و باینری Chrome Driver را برای سیستم عامل شما نصب می کند:

php artisan dusk:install

در مرحله بعد، APP_URL متغیر محیطی را در فایل برنامه خود تنظیم کنید .env . این مقدار باید با URL مورد استفاده شما برای دسترسی به برنامه خود در مرورگر مطابقت داشته باشد.

اگر از Laravel Sail برای مدیریت محیط توسعه محلی خود استفاده می کنید ، لطفاً به اسناد Sail در مورد پیکربندی و اجرای تست های Dusk نیز مراجعه کنید .

مدیریت نصب ChromeDriver

اگر می‌خواهید نسخه متفاوتی از ChromeDriver را نسبت به آنچه که توسط Laravel Dusk نصب شده است نصب کنید dusk:install ، می‌توانید از این dusk:chrome-driver دستور استفاده کنید:

# Install the latest version of ChromeDriver for your OS...
php artisan dusk:chrome-driver
 
# Install a given version of ChromeDriver for your OS...
php artisan dusk:chrome-driver 86
 
# Install a given version of ChromeDriver for all supported OSs...
php artisan dusk:chrome-driver --all
 
# Install the version of ChromeDriver that matches the detected version of Chrome / Chromium for your OS...
php artisan dusk:chrome-driver --detect

Dusk به chromedriver باینری ها نیاز دارد که قابل اجرا باشند. اگر در اجرای Dusk مشکل دارید، باید مطمئن شوید که باینری ها با استفاده از دستور زیر قابل اجرا هستند: chmod -R 0755 vendor/laravel/dusk/bin/ .

استفاده از سایر مرورگرها

به طور پیش‌فرض، Dusk از Google Chrome و نصب ChromeDriver مستقل برای اجرای آزمایش‌های مرورگر شما استفاده می‌کند. با این حال، می‌توانید سرور سلنیوم خود را راه‌اندازی کنید و آزمایش‌های خود را با هر مرورگری که می‌خواهید اجرا کنید.

برای شروع، tests/DuskTestCase.php فایل خود را باز کنید، که مورد آزمایش Dusk پایه برنامه شما است. در این فایل می توانید فراخوانی متد را حذف کنید startChromeDriver . با این کار Dusk از راه اندازی خودکار ChromeDriver جلوگیری می کند:

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

در مرحله بعد، می توانید driver روش اتصال به URL و پورت مورد نظر خود را تغییر دهید. علاوه بر این، می‌توانید «قابلیت‌های دلخواه» را که باید به WebDriver منتقل شود را تغییر دهید:

use Facebook\WebDriver\Remote\RemoteWebDriver;
 
/**
* Create the RemoteWebDriver instance.
*/
protected function driver(): RemoteWebDriver
{
return RemoteWebDriver::create(
'http://localhost:4444/wd/hub', DesiredCapabilities::phantomjs()
);
}

شروع شدن

تولید تست ها

برای تولید تست Dusk، از dusk:make دستور Artisan استفاده کنید. تست تولید شده در tests/Browser دایرکتوری قرار می گیرد:

php artisan dusk:make LoginTest

تنظیم مجدد پایگاه داده پس از هر تست

اکثر تست هایی که می نویسید با صفحاتی که داده ها را از پایگاه داده برنامه شما بازیابی می کنند، تعامل دارند. با این حال، تست های Dusk شما هرگز نباید از این RefreshDatabase ویژگی استفاده کنند. این RefreshDatabase ویژگی از تراکنش‌های پایگاه داده استفاده می‌کند که در درخواست‌های HTTP قابل اجرا یا در دسترس نیستند. در عوض، شما دو گزینه دارید: DatabaseMigrations صفت و DatabaseTruncation صفت.

استفاده از Database Migrations

این DatabaseMigrations ویژگی قبل از هر آزمون، مهاجرت های پایگاه داده شما را اجرا می کند. با این حال، حذف و ایجاد مجدد جداول پایگاه داده برای هر آزمون معمولاً کندتر از کوتاه کردن جداول است:

<?php
 
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
 
uses(DatabaseMigrations::class);
 
//
<?php
 
namespace Tests\Browser;
 
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
 
class ExampleTest extends DuskTestCase
{
use DatabaseMigrations;
 
//
}

پایگاه داده های SQLite در حافظه ممکن است هنگام اجرای تست Dusk استفاده نشوند. از آنجایی که مرورگر در فرآیند خود اجرا می‌کند، نمی‌تواند به پایگاه‌های اطلاعاتی درون حافظه سایر فرآیندها دسترسی داشته باشد.

با استفاده از بریدن پایگاه داده

این DatabaseTruncation ویژگی در اولین آزمایش پایگاه داده شما را منتقل می کند تا مطمئن شود جداول پایگاه داده شما به درستی ایجاد شده است. با این حال، در آزمایش‌های بعدی، جداول پایگاه داده به سادگی کوتاه می‌شوند - افزایش سرعت نسبت به اجرای مجدد همه مهاجرت‌های پایگاه داده شما:

<?php
 
use Illuminate\Foundation\Testing\DatabaseTruncation;
use Laravel\Dusk\Browser;
 
uses(DatabaseTruncation::class);
 
//
<?php
 
namespace Tests\Browser;
 
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTruncation;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
 
class ExampleTest extends DuskTestCase
{
use DatabaseTruncation;
 
//
}

به طور پیش فرض، این ویژگی همه جداول به جز migrations جدول را کوتاه می کند. اگر می‌خواهید جداولی را که باید کوتاه شوند سفارشی کنید، می‌توانید یک $tablesToTruncate ویژگی را در کلاس آزمایشی خود تعریف کنید:

اگر از Pest استفاده می‌کنید، باید ویژگی‌ها یا روش‌هایی را روی DuskTestCase کلاس پایه یا هر کلاسی که فایل آزمایشی شما گسترش می‌یابد تعریف کنید.

/**
* Indicates which tables should be truncated.
*
* @var array
*/
protected $tablesToTruncate = ['users'];

همچنین، می‌توانید یک $exceptTables ویژگی در کلاس آزمایشی خود تعریف کنید تا مشخص کنید کدام جداول باید از برش حذف شوند:

/**
* Indicates which tables should be excluded from truncation.
*
* @var array
*/
protected $exceptTables = ['users'];

برای مشخص کردن اتصالات پایگاه داده که باید جداول آنها کوتاه شود، می توانید یک $connectionsToTruncate ویژگی را در کلاس آزمایشی خود تعریف کنید:

/**
* Indicates which connections should have their tables truncated.
*
* @var array
*/
protected $connectionsToTruncate = ['mysql'];

اگر می خواهید کد را قبل یا بعد از انجام برش پایگاه داده اجرا کنید، می توانید در کلاس آزمایشی خود متدهایی را beforeTruncatingDatabase تعریف کنید: afterTruncatingDatabase

/**
* Perform any work that should take place before the database has started truncating.
*/
protected function beforeTruncatingDatabase(): void
{
//
}
 
/**
* Perform any work that should take place after the database has finished truncating.
*/
protected function afterTruncatingDatabase(): void
{
//
}

در حال اجرا تست ها

برای اجرای تست های مرورگر خود، dusk دستور Artisan را اجرا کنید:

php artisan dusk

اگر آخرین باری که دستور را اجرا کردید با شکست تست مواجه شدید dusk ، می‌توانید با اجرای مجدد تست‌های ناموفق ابتدا با استفاده از dusk:fails دستور، در زمان خود صرفه‌جویی کنید:

php artisan dusk:fails

این dusk دستور هر آرگومانی را می‌پذیرد که معمولاً توسط اجراکننده آزمایش Pest / PHPUnit پذیرفته می‌شود، مثلاً به شما اجازه می‌دهد فقط آزمایش‌ها را برای یک گروه معین اجرا کنید :

php artisan dusk --group=foo

اگر از Laravel Sail برای مدیریت محیط توسعه محلی خود استفاده می کنید ، لطفاً به اسناد Sail در مورد پیکربندی و اجرای تست های Dusk مراجعه کنید .

راه‌اندازی دستی ChromeDriver

به‌طور پیش‌فرض، Dusk به‌طور خودکار ChromeDriver را راه‌اندازی می‌کند. اگر این برای سیستم خاص شما کار نمی کند، می توانید ChromeDriver را قبل از اجرای dusk دستور به صورت دستی راه اندازی کنید. اگر انتخاب می‌کنید ChromeDriver را به‌صورت دستی راه‌اندازی کنید، باید خط زیر tests/DuskTestCase.php فایل خود را نظر دهید:

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

علاوه بر این، اگر ChromeDriver را روی درگاهی غیر از 9515 راه‌اندازی می‌کنید، باید driver روش همان کلاس را تغییر دهید تا پورت صحیح منعکس شود:

use Facebook\WebDriver\Remote\RemoteWebDriver;
 
/**
* Create the RemoteWebDriver instance.
*/
protected function driver(): RemoteWebDriver
{
return RemoteWebDriver::create(
'http://localhost:9515', DesiredCapabilities::chrome()
);
}

مدیریت محیط زیست

برای اینکه Dusk را مجبور کنید از فایل محیطی خودش هنگام اجرای آزمایش استفاده کند، یک .env.dusk.{environment} فایل در ریشه پروژه خود ایجاد کنید. به عنوان مثال، اگر dusk دستور را از محیط خود شروع می کنید local ، باید یک .env.dusk.local فایل ایجاد کنید.

هنگام اجرای آزمایشات، Dusk از فایل شما نسخه پشتیبان تهیه می کند .env و نام محیط Dusk شما را به .env . پس از اتمام تست ها، .env فایل شما بازیابی می شود.

مبانی مرورگر

ایجاد مرورگرها

برای شروع، بیایید آزمایشی بنویسیم که تأیید کند ما می توانیم به برنامه خود وارد شویم. پس از ایجاد یک آزمایش، می‌توانیم آن را تغییر دهیم تا به صفحه ورود به سیستم بروید، تعدادی اعتبارنامه را وارد کنید و روی دکمه «ورود» کلیک کنید. برای ایجاد یک نمونه مرورگر، می توانید browse روش را از داخل Dusk Test خود فراخوانی کنید:

<?php
 
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
 
uses(DatabaseMigrations::class);
 
test('basic example', function () {
$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('/home');
});
});
<?php
 
namespace Tests\Browser;
 
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
 
class ExampleTest extends DuskTestCase
{
use DatabaseMigrations;
 
/**
* A basic browser test example.
*/
public function test_basic_example(): 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('/home');
});
}
}

همانطور که در مثال بالا مشاهده می کنید، browse روش بسته شدن را می پذیرد. یک نمونه مرورگر به طور خودکار توسط Dusk به این بسته ارسال می شود و شی اصلی مورد استفاده برای تعامل با برنامه شما و اظهار نظر علیه برنامه شما است.

ایجاد چندین مرورگر

گاهی اوقات ممکن است برای انجام درست یک آزمایش به چندین مرورگر نیاز داشته باشید. برای مثال، ممکن است برای آزمایش صفحه چت که با سوکت‌های وب در تعامل است، به چندین مرورگر نیاز باشد. برای ایجاد چندین مرورگر، به سادگی آرگومان های مرورگر بیشتری را به امضای بسته شدن داده شده به browse روش اضافه کنید:

$this->browse(function (Browser $first, Browser $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');
});

این visit روش ممکن است برای پیمایش به یک URI مشخص در برنامه شما استفاده شود:

$browser->visit('/login');

می توانید از visitRoute روش برای پیمایش به یک مسیر نامگذاری شده استفاده کنید :

$browser->visitRoute('login');

می‌توانید با استفاده از روش‌های back و «به عقب» و «به جلو» حرکت کنید forward :

$browser->back();
 
$browser->forward();

می توانید از این refresh روش برای بازخوانی صفحه استفاده کنید:

$browser->refresh();

تغییر اندازه مرورگر ویندوز

resize برای تنظیم اندازه پنجره مرورگر می توانید از روش زیر استفاده کنید :

$browser->resize(1920, 1080);

این maximize روش ممکن است برای به حداکثر رساندن پنجره مرورگر استفاده شود:

$browser->maximize();

این fitContent روش اندازه پنجره مرورگر را برای مطابقت با اندازه محتوای آن تغییر می دهد:

$browser->fitContent();

وقتی آزمایشی با شکست مواجه می‌شود، Dusk به‌طور خودکار اندازه مرورگر را تغییر می‌دهد تا قبل از گرفتن اسکرین شات، متناسب با محتوا باشد. می‌توانید این ویژگی را با فراخوانی disableFitOnFailure روش موجود در تست خود غیرفعال کنید:

$browser->disableFitOnFailure();

می توانید از move روشی برای انتقال پنجره مرورگر به موقعیت دیگری در صفحه خود استفاده کنید:

$browser->move($x = 100, $y = 100);

ماکروهای مرورگر

اگر می‌خواهید یک متد مرورگر سفارشی تعریف کنید که بتوانید مجدداً در آزمایش‌های مختلف خود از آن استفاده کنید، می‌توانید از این macro روش در Browser کلاس استفاده کنید. به طور معمول، شما باید این روش را از روش ارائه دهنده خدمات boot فراخوانی کنید :

<?php
 
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use Laravel\Dusk\Browser;
 
class DuskServiceProvider extends ServiceProvider
{
/**
* Register Dusk's browser macros.
*/
public function boot(): void
{
Browser::macro('scrollToElement', function (string $element = null) {
$this->script("$('html, body').animate({ scrollTop: $('$element').offset().top }, 0);");
 
return $this;
});
}
}

تابع macro یک نام را به عنوان اولین آرگومان خود و یک بسته را به عنوان آرگومان دوم خود می پذیرد. بسته شدن ماکرو هنگام فراخوانی ماکرو به عنوان متد در یک Browser نمونه اجرا می شود:

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

احراز هویت

اغلب، صفحاتی را که نیاز به احراز هویت دارند را آزمایش می کنید. شما می توانید از روش Dusk استفاده کنید loginAs تا از تعامل با صفحه ورود به سیستم برنامه خود در طول هر آزمایش جلوگیری کنید. این loginAs روش یک کلید اولیه مرتبط با مدل قابل احراز هویت شما یا یک نمونه مدل قابل احراز هویت را می پذیرد:

use App\Models\User;
use Laravel\Dusk\Browser;
 
$this->browse(function (Browser $browser) {
$browser->loginAs(User::find(1))
->visit('/home');
});

پس از استفاده از loginAs روش، جلسه کاربر برای تمام تست های داخل فایل حفظ می شود.

بیسکویت ها

می توانید از این cookie روش برای دریافت یا تنظیم مقدار یک کوکی رمزگذاری شده استفاده کنید. به طور پیش فرض، تمام کوکی های ایجاد شده توسط لاراول رمزگذاری شده اند:

$browser->cookie('name');
 
$browser->cookie('name', 'Taylor');

می‌توانید از این plainCookie روش برای دریافت یا تنظیم مقدار یک کوکی رمزگذاری نشده استفاده کنید:

$browser->plainCookie('name');
 
$browser->plainCookie('name', 'Taylor');

deleteCookie برای حذف کوکی داده شده می توانید از روش زیر استفاده کنید :

$browser->deleteCookie('name');

اجرای جاوا اسکریپت

می توانید از script روش برای اجرای دستورات جاوا اسکریپت دلخواه در مرورگر استفاده کنید:

$browser->script('document.documentElement.scrollTop = 0');
 
$browser->script([
'document.body.scrollTop = 0',
'document.documentElement.scrollTop = 0',
]);
 
$output = $browser->script('return window.location.pathname');

گرفتن اسکرین شات

می توانید از این screenshot روش برای گرفتن اسکرین شات و ذخیره آن با نام فایل استفاده کنید. همه اسکرین شات ها در دایرکتوری ذخیره می شوند tests/Browser/screenshots :

$browser->screenshot('filename');

این responsiveScreenshots روش ممکن است برای گرفتن یک سری اسکرین شات در نقاط شکست مختلف استفاده شود:

$browser->responsiveScreenshots('filename');

این screenshotElement روش ممکن است برای گرفتن اسکرین شات از یک عنصر خاص در صفحه استفاده شود:

$browser->screenshotElement('#selector', 'filename');

ذخیره خروجی کنسول در دیسک

می‌توانید از این storeConsoleLog روش برای نوشتن خروجی کنسول مرورگر فعلی روی دیسک با نام فایل استفاده کنید. خروجی کنسول در دایرکتوری ذخیره می شود tests/Browser/console :

$browser->storeConsoleLog('filename');

ذخیره منبع صفحه در دیسک

می توانید از این storeSource روش برای نوشتن منبع صفحه فعلی روی دیسک با نام فایل داده شده استفاده کنید. منبع صفحه در tests/Browser/source دایرکتوری ذخیره می شود:

$browser->storeSource('filename');

تعامل با عناصر

انتخابگرهای غروب

انتخاب انتخابگرهای CSS خوب برای تعامل با عناصر یکی از سخت‌ترین بخش‌های نوشتن تست‌های Dusk است. با گذشت زمان، تغییرات ظاهری می‌تواند باعث شود که انتخابگرهای CSS مانند موارد زیر تست‌های شما را شکست دهند:

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

انتخابگرهای غروب به شما این امکان را می دهند که به جای به خاطر سپردن انتخابگرهای CSS، روی نوشتن تست های موثر تمرکز کنید. برای تعریف انتخابگر، یک dusk ویژگی به عنصر HTML خود اضافه کنید. سپس، هنگام تعامل با مرورگر Dusk، پیشوند انتخابگر را @ برای دستکاری عنصر پیوست شده در تست خود قرار دهید:

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

در صورت تمایل، می توانید ویژگی HTML را که انتخابگر Dusk از طریق selectorHtmlAttribute روش استفاده می کند، سفارشی کنید. به طور معمول، این متد باید از boot روش برنامه شما فراخوانی شود AppServiceProvider :

use Laravel\Dusk\Dusk;
 
Dusk::selectorHtmlAttribute('data-dusk');

متن، ارزش‌ها و ویژگی‌ها

بازیابی و تنظیم مقادیر

Dusk چندین روش برای تعامل با مقدار فعلی، متن نمایش داده شده و ویژگی های عناصر در صفحه ارائه می دهد. به عنوان مثال، برای به دست آوردن "مقدار" عنصری که با یک انتخابگر CSS یا Dusk مطابقت دارد، از value روش استفاده کنید:

// Retrieve the value...
$value = $browser->value('selector');
 
// Set the value...
$browser->value('selector', 'value');

می توانید از این inputValue روش برای دریافت "مقدار" عنصر ورودی که نام فیلد مشخصی دارد استفاده کنید:

$value = $browser->inputValue('field');

بازیابی متن

این text روش ممکن است برای بازیابی متن نمایشگر عنصری که با انتخابگر داده شده مطابقت دارد استفاده شود:

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

بازیابی ویژگی ها

در نهایت، این attribute روش ممکن است برای بازیابی مقدار یک ویژگی یک عنصر مطابق با انتخابگر داده شده استفاده شود:

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

تعامل با فرم ها

تایپ مقادیر

Dusk روش های مختلفی را برای تعامل با فرم ها و عناصر ورودی ارائه می دهد. ابتدا، بیایید نگاهی به نمونه ای از تایپ متن در یک فیلد ورودی بیندازیم:

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

توجه داشته باشید که اگرچه متد در صورت لزوم یکی را می پذیرد، اما نیازی نیست که انتخابگر CSS را به type متد ارسال کنیم. اگر انتخابگر CSS ارائه نشده باشد، Dusk برای یک input یا textarea فیلد با name ویژگی داده شده جستجو می کند.

برای افزودن متن به یک فیلد بدون پاک کردن محتوای آن، می‌توانید از append روش زیر استفاده کنید:

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

می توانید مقدار یک ورودی را با استفاده از clear روش پاک کنید:

$browser->clear('email');

می‌توانید به Dusk دستور دهید با استفاده از typeSlowly روش، به آرامی تایپ کند. به طور پیش فرض، Dusk بین فشردن کلیدها به مدت 100 میلی ثانیه مکث می کند. برای سفارشی کردن زمان بین فشار دادن کلید، می توانید تعداد مناسب میلی ثانیه را به عنوان آرگومان سوم به روش ارسال کنید:

$browser->typeSlowly('mobile', '+1 (202) 555-5555');
 
$browser->typeSlowly('mobile', '+1 (202) 555-5555', 300);

می توانید از این appendSlowly روش برای اضافه کردن متن آهسته استفاده کنید:

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

برای انتخاب مقدار موجود در یک select عنصر، می توانید از select روش استفاده کنید. مانند type متد، select روش نیز به انتخابگر کامل CSS نیاز ندارد. هنگام ارسال یک مقدار به select متد، باید مقدار گزینه زیرین را به جای متن نمایش داده ارسال کنید:

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

می توانید با حذف آرگومان دوم، یک گزینه تصادفی انتخاب کنید:

$browser->select('size');

با ارائه یک آرایه به عنوان آرگومان دوم برای select متد، می توانید به متد دستور دهید چندین گزینه را انتخاب کند:

$browser->select('categories', ['Art', 'Music']);

چک باکس ها

برای "بررسی" ورودی چک باکس، می توانید از این check روش استفاده کنید. مانند بسیاری از روش‌های مرتبط با ورودی، انتخابگر کامل CSS مورد نیاز نیست. اگر یک منطبق انتخابگر CSS پیدا نشد، Dusk یک چک باکس با name ویژگی منطبق را جستجو می کند:

$browser->check('terms');

این uncheck روش ممکن است برای "برداشتن علامت" ورودی چک باکس استفاده شود:

$browser->uncheck('terms');

دکمه های رادیویی

برای "انتخاب" یک radio گزینه ورودی، می توانید از radio روش استفاده کنید. مانند بسیاری از روش‌های مرتبط با ورودی، انتخابگر کامل CSS مورد نیاز نیست. اگر یک منطبق انتخابگر CSS پیدا نشد، Dusk یک radio ورودی با تطابق name و value ویژگی‌ها را جستجو می‌کند:

$browser->radio('size', 'large');

ضمیمه کردن فایل ها

این attach روش ممکن است برای پیوست کردن یک فایل به یک file عنصر ورودی استفاده شود. مانند بسیاری از روش‌های مرتبط با ورودی، انتخابگر کامل CSS مورد نیاز نیست. اگر منطبق بر انتخابگر CSS پیدا نشد، Dusk یک file ورودی با ویژگی منطبق را جستجو می کند name :

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

تابع attach نیاز دارد که Zip پسوند PHP روی سرور شما نصب و فعال شود.

فشار دادن دکمه ها

این press روش ممکن است برای کلیک کردن روی یک عنصر دکمه در صفحه استفاده شود. آرگومان داده شده به press روش ممکن است متن نمایشی دکمه یا انتخابگر CSS / Dusk باشد:

$browser->press('Login');

هنگام ارسال فرم ها، بسیاری از برنامه ها دکمه ارسال فرم را پس از فشار دادن آن غیرفعال می کنند و پس از تکمیل درخواست HTTP ارسال فرم، دوباره دکمه را فعال می کنند. برای فشار دادن یک دکمه و صبر کردن برای فعال شدن مجدد دکمه، می توانید از pressAndWaitFor روش زیر استفاده کنید:

// Press the button and wait a maximum of 5 seconds for it to be enabled...
$browser->pressAndWaitFor('Save');
 
// Press the button and wait a maximum of 1 second for it to be enabled...
$browser->pressAndWaitFor('Save', 1);

برای کلیک بر روی یک پیوند، می توانید از clickLink روش موجود در نمونه مرورگر استفاده کنید. این clickLink روش روی پیوندی که متن نمایش داده شده را دارد کلیک می کند:

$browser->clickLink($linkText);

seeLink برای تعیین اینکه آیا پیوندی با متن نمایش داده شده در صفحه قابل مشاهده است، می توانید از روش استفاده کنید :

if ($browser->seeLink($linkText)) {
// ...
}

این روش ها با jQuery تعامل دارند. اگر jQuery در صفحه موجود نباشد، Dusk به طور خودکار آن را به صفحه تزریق می کند تا برای مدت زمان آزمایش در دسترس باشد.

با استفاده از صفحه کلید

این keys روش به شما امکان می‌دهد توالی‌های ورودی پیچیده‌تری را نسبت به مقدار معمولی که روش مجاز می‌داند برای یک عنصر معین ارائه کنید type . به عنوان مثال، ممکن است به Dusk دستور دهید هنگام وارد کردن مقادیر، کلیدهای اصلاح کننده را نگه دارد. در این مثال، کلید در حالی که در عنصری که با انتخابگر داده شده مطابقت دارد وارد می شود، shift نگه داشته می شود . taylor پس از taylor تایپ کردن، swift بدون هیچ کلید اصلاحی تایپ خواهد شد:

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

یکی دیگر از موارد استفاده ارزشمند برای این keys روش، ارسال یک ترکیب "میانبر صفحه کلید" به انتخابگر CSS اولیه برای برنامه شما است:

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

همه کلیدهای اصلاح‌کننده مانند کاراکترها {command} پیچیده شده‌اند {} و با ثابت‌های تعریف‌شده در Facebook\WebDriver\WebDriverKeys کلاس مطابقت دارند که در GitHub یافت می‌شوند .

تعاملات صفحه کلید روان

Dusk همچنین withKeyboard روشی را ارائه می‌کند که به شما امکان می‌دهد به طور روان تعاملات پیچیده صفحه کلید را از طریق Laravel\Dusk\Keyboard کلاس انجام دهید. کلاس , , و متدها Keyboard را ارائه می دهد : press release type pause

use Laravel\Dusk\Keyboard;
 
$browser->withKeyboard(function (Keyboard $keyboard) {
$keyboard->press('c')
->pause(1000)
->release('c')
->type(['c', 'e', 'o']);
});

ماکروهای صفحه کلید

اگر می خواهید تعاملات صفحه کلید سفارشی را تعریف کنید که بتوانید به راحتی در مجموعه آزمایشی خود دوباره از آنها استفاده کنید، می توانید از روش macro ارائه شده توسط Keyboard کلاس استفاده کنید. به طور معمول، شما باید این روش را از روش ارائه دهنده خدمات boot فراخوانی کنید :

<?php
 
namespace App\Providers;
 
use Facebook\WebDriver\WebDriverKeys;
use Illuminate\Support\ServiceProvider;
use Laravel\Dusk\Keyboard;
use Laravel\Dusk\OperatingSystem;
 
class DuskServiceProvider extends ServiceProvider
{
/**
* Register Dusk's browser macros.
*/
public function boot(): void
{
Keyboard::macro('copy', function (string $element = null) {
$this->type([
OperatingSystem::onMac() ? WebDriverKeys::META : WebDriverKeys::CONTROL, 'c',
]);
 
return $this;
});
 
Keyboard::macro('paste', function (string $element = null) {
$this->type([
OperatingSystem::onMac() ? WebDriverKeys::META : WebDriverKeys::CONTROL, 'v',
]);
 
return $this;
});
}
}

تابع macro یک نام را به عنوان اولین آرگومان خود و یک بسته را به عنوان آرگومان دوم خود می پذیرد. بسته شدن ماکرو هنگام فراخوانی ماکرو به عنوان متد در یک Keyboard نمونه اجرا می شود:

$browser->click('@textarea')
->withKeyboard(fn (Keyboard $keyboard) => $keyboard->copy())
->click('@another-textarea')
->withKeyboard(fn (Keyboard $keyboard) => $keyboard->paste());

با استفاده از ماوس

با کلیک بر روی Elements

این click روش ممکن است برای کلیک بر روی عنصری که با CSS یا انتخابگر Dusk داده شده مطابقت دارد، استفاده شود:

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

این clickAtXPath روش ممکن است برای کلیک بر روی عنصری که با عبارت XPath مطابقت دارد استفاده شود:

$browser->clickAtXPath('//div[@class = "selector"]');

این clickAtPoint روش ممکن است برای کلیک بر روی بالاترین عنصر در یک جفت مختصات معین نسبت به ناحیه قابل مشاهده مرورگر استفاده شود:

$browser->clickAtPoint($x = 0, $y = 0);

این doubleClick روش ممکن است برای شبیه سازی دوبار کلیک ماوس استفاده شود:

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

این rightClick روش ممکن است برای شبیه سازی کلیک راست ماوس استفاده شود:

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

این clickAndHold روش ممکن است برای شبیه‌سازی کلیک و نگه‌داشتن یک دکمه ماوس استفاده شود. فراخوانی بعدی به releaseMouse متد، این رفتار را لغو می‌کند و دکمه ماوس را آزاد می‌کند:

$browser->clickAndHold('.selector');
 
$browser->clickAndHold()
->pause(1000)
->releaseMouse();

این controlClick روش ممکن است برای شبیه سازی ctrl+click رویداد در مرورگر استفاده شود:

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

ماوس بر

این mouseover روش ممکن است زمانی استفاده شود که باید ماوس را بر روی عنصری مطابق با انتخابگر CSS یا Dusk داده شده حرکت دهید:

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

کشیدن و انداختن

این drag روش ممکن است برای کشیدن یک عنصر منطبق بر انتخابگر داده شده به عنصر دیگر استفاده شود:

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

یا ممکن است یک عنصر را در یک جهت بکشید:

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

در نهایت، می توانید یک عنصر را با یک افست داده شده بکشید:

$browser->dragOffset('.selector', $x = 10, $y = 10);

دیالوگ های جاوا اسکریپت

Dusk روش های مختلفی برای تعامل با دیالوگ های جاوا اسکریپت ارائه می دهد. برای مثال، می‌توانید از waitForDialog روشی برای صبر کردن برای ظاهر شدن یک گفتگوی جاوا اسکریپت استفاده کنید. این روش یک آرگومان اختیاری را می پذیرد که نشان می دهد چند ثانیه باید منتظر ظاهر شدن دیالوگ بود:

$browser->waitForDialog($seconds = null);

این assertDialogOpened روش ممکن است برای بیان اینکه یک گفتگو نمایش داده شده و حاوی پیام داده شده است استفاده شود:

$browser->assertDialogOpened('Dialog message');

اگر محاوره جاوا اسکریپت حاوی یک درخواست باشد، می‌توانید از typeInDialog روش برای تایپ یک مقدار در دستور استفاده کنید:

$browser->typeInDialog('Hello World');

برای بستن یک گفتگوی باز جاوا اسکریپت با کلیک بر روی دکمه "OK"، می توانید acceptDialog روش را فراخوانی کنید:

$browser->acceptDialog();

برای بستن یک گفتگوی باز جاوا اسکریپت با کلیک بر روی دکمه "لغو"، می توانید dismissDialog روش را فراخوانی کنید:

$browser->dismissDialog();

تعامل با فریم های درون خطی

اگر نیاز به تعامل با عناصر درون یک iframe دارید، می توانید از این withinFrame روش استفاده کنید. تمام فعل و انفعالات عنصری که در بسته شدن ارائه شده به روش انجام می‌شود، withinFrame در چارچوب iframe مشخص شده در نظر گرفته می‌شود:

$browser->withinFrame('#credit-card-details', function ($browser) {
$browser->type('input[name="cardnumber"]', '4242424242424242')
->type('input[name="exp-date"]', '12/24')
->type('input[name="cvc"]', '123');
})->press('Pay');
});

انتخاب کنندگان محدوده

گاهی اوقات ممکن است بخواهید چندین عملیات را در حالی که همه عملیات را در یک انتخابگر معین انجام می دهید انجام دهید. برای مثال، ممکن است بخواهید ادعا کنید که متنی فقط در یک جدول وجود دارد و سپس روی دکمه ای در آن جدول کلیک کنید. with برای انجام این کار می توانید از روش استفاده کنید . تمام عملیات انجام شده در بسته بندی داده شده به with روش، به انتخابگر اصلی ارائه می شود:

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

ممکن است گاهی اوقات نیاز به اجرای اظهارات خارج از محدوده فعلی داشته باشید. برای انجام این کار می توانید از elsewhere و روش ها استفاده کنید: elsewhereWhenAvailable

$browser->with('.table', function (Browser $table) {
// Current scope is `body .table`...
 
$browser->elsewhere('.page-title', function (Browser $title) {
// Current scope is `body .page-title`...
$title->assertSee('Hello World');
});
 
$browser->elsewhereWhenAvailable('.page-title', function (Browser $title) {
// Current scope is `body .page-title`...
$title->assertSee('Hello World');
});
});

در انتظار عناصر

هنگام آزمایش برنامه هایی که به طور گسترده از جاوا اسکریپت استفاده می کنند، اغلب لازم است قبل از ادامه آزمایش، «منتظر» شوید تا عناصر یا داده های خاصی در دسترس باشند. گرگ و میش باعث می‌شود که این یک سینچ باشد. با استفاده از روش‌های مختلف، ممکن است منتظر بمانید تا عناصر در صفحه قابل مشاهده شوند یا حتی منتظر بمانید تا یک عبارت جاوا اسکریپت به true .

در انتظار

اگر فقط نیاز دارید تست را برای چند میلی ثانیه معین متوقف کنید، از pause روش زیر استفاده کنید:

$browser->pause(1000);

اگر فقط در صورتی نیاز به توقف آزمایش دارید که شرط داده شده باشد true ، از روش زیر استفاده کنید pauseIf :

$browser->pauseIf(App::environment('production'), 1000);

به همین ترتیب، اگر نیاز به توقف آزمایش دارید، مگر اینکه یک شرط مشخص باشد true ، می توانید از pauseUnless روش زیر استفاده کنید:

$browser->pauseUnless(App::environment('testing'), 1000);

در انتظار انتخاب کنندگان

این waitFor روش ممکن است برای توقف اجرای آزمایش تا زمانی که عنصر مطابق با CSS داده شده یا انتخابگر Dusk در صفحه نمایش داده شود، استفاده شود. به‌طور پیش‌فرض، قبل از ایجاد استثنا، آزمون را حداکثر به مدت پنج ثانیه متوقف می‌کند. در صورت لزوم، می توانید یک آستانه زمان بندی سفارشی را به عنوان آرگومان دوم به متد ارسال کنید:

// Wait a maximum of five seconds for the selector...
$browser->waitFor('.selector');
 
// Wait a maximum of one second for the selector...
$browser->waitFor('.selector', 1);

همچنین می توانید منتظر بمانید تا عنصری که با انتخابگر داده شده مطابقت دارد متن داده شده را داشته باشد:

// Wait a maximum of five seconds for the selector to contain the given text...
$browser->waitForTextIn('.selector', 'Hello World');
 
// Wait a maximum of one second for the selector to contain the given text...
$browser->waitForTextIn('.selector', 'Hello World', 1);

همچنین می‌توانید منتظر بمانید تا عنصر مطابق با انتخاب‌گر داده شده در صفحه گم نشود:

// Wait a maximum of five seconds until the selector is missing...
$browser->waitUntilMissing('.selector');
 
// Wait a maximum of one second until the selector is missing...
$browser->waitUntilMissing('.selector', 1);

یا، ممکن است صبر کنید تا عنصر مطابق با انتخابگر داده شده فعال یا غیرفعال شود:

// Wait a maximum of five seconds until the selector is enabled...
$browser->waitUntilEnabled('.selector');
 
// Wait a maximum of one second until the selector is enabled...
$browser->waitUntilEnabled('.selector', 1);
 
// Wait a maximum of five seconds until the selector is disabled...
$browser->waitUntilDisabled('.selector');
 
// Wait a maximum of one second until the selector is disabled...
$browser->waitUntilDisabled('.selector', 1);

انتخابگرهای محدوده زمانی که در دسترس هستند

گاهی اوقات، ممکن است بخواهید منتظر بمانید تا عنصری ظاهر شود که با یک انتخابگر مشخص مطابقت دارد و سپس با عنصر تعامل داشته باشید. برای مثال، ممکن است بخواهید منتظر بمانید تا یک پنجره مودال در دسترس باشد و سپس دکمه "OK" را در داخل مدال فشار دهید. روش whenAvailable ممکن است برای انجام این مورد استفاده شود. تمام عملیات عنصر انجام شده در بسته بندی داده شده به انتخابگر اصلی محدود می شود:

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

در انتظار متن

این waitForText روش ممکن است برای صبر کردن تا زمانی که متن داده شده در صفحه نمایش داده شود استفاده شود:

// Wait a maximum of five seconds for the text...
$browser->waitForText('Hello World');
 
// Wait a maximum of one second for the text...
$browser->waitForText('Hello World', 1);

می توانید از waitUntilMissingText روش صبر کنید تا متن نمایش داده شده از صفحه حذف شود:

// Wait a maximum of five seconds for the text to be removed...
$browser->waitUntilMissingText('Hello World');
 
// Wait a maximum of one second for the text to be removed...
$browser->waitUntilMissingText('Hello World', 1);

این waitForLink روش ممکن است برای صبر کردن تا زمانی که متن پیوند داده شده در صفحه نمایش داده شود استفاده شود:

// Wait a maximum of five seconds for the link...
$browser->waitForLink('Create');
 
// Wait a maximum of one second for the link...
$browser->waitForLink('Create', 1);

در انتظار ورودی ها

این waitForInput روش ممکن است برای صبر کردن تا زمانی که فیلد ورودی داده شده در صفحه قابل مشاهده باشد استفاده شود:

// Wait a maximum of five seconds for the input...
$browser->waitForInput($field);
 
// Wait a maximum of one second for the input...
$browser->waitForInput($field, 1);

در حال انتظار در مکان صفحه

هنگام ایجاد یک ادعای مسیر مانند ، اگر به طور ناهمزمان به روز شود، $browser->assertPathIs('/home') ادعا ممکن است شکست بخورد . window.location.pathname می‌توانید از waitForLocation روشی استفاده کنید تا منتظر بمانید تا مکان یک مقدار داده شود:

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

همچنین می‌توان از این waitForLocation روش برای منتظر ماندن تا مکان پنجره فعلی یک URL کاملا واجد شرایط استفاده کرد:

$browser->waitForLocation('https://example.com/path');

همچنین می‌توانید منتظر مکان مسیر نام‌گذاری شده باشید :

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

در انتظار بارگیری مجدد صفحه

اگر پس از انجام یک عمل باید منتظر بمانید تا صفحه ای دوباره بارگذاری شود، از waitForReload روش زیر استفاده کنید:

use Laravel\Dusk\Browser;
 
$browser->waitForReload(function (Browser $browser) {
$browser->press('Submit');
})
->assertSee('Success!');

از آنجایی که نیاز به منتظر ماندن برای بارگیری مجدد صفحه معمولاً پس از کلیک روی یک دکمه رخ می دهد، می توانید clickAndWaitForReload برای راحتی کار از روش زیر استفاده کنید:

$browser->clickAndWaitForReload('.selector')
->assertSee('something');

در انتظار عبارات جاوا اسکریپت

گاهی اوقات ممکن است بخواهید اجرای یک تست را تا زمانی که یک عبارت جاوا اسکریپت به true . با استفاده از این روش می توانید به راحتی این کار را انجام دهید waitUntil . هنگام ارسال یک عبارت به این روش، نیازی به وارد کردن return کلمه کلیدی یا نیمه ویرگول پایانی ندارید :

// Wait a maximum of five seconds for the expression to be true...
$browser->waitUntil('App.data.servers.length > 0');
 
// Wait a maximum of one second for the expression to be true...
$browser->waitUntil('App.data.servers.length > 0', 1);

در انتظار Vue Expressions

متدهای waitUntilVue و waitUntilVueIsNot ممکن است برای صبر کردن تا زمانی که یک ویژگی جزء Vue مقدار مشخصی داشته باشد استفاده شود:

// Wait until the component attribute contains the given value...
$browser->waitUntilVue('user.name', 'Taylor', '@user');
 
// Wait until the component attribute doesn't contain the given value...
$browser->waitUntilVueIsNot('user.name', null, '@user');

در انتظار رویدادهای جاوا اسکریپت

از این waitForEvent روش می توان برای توقف اجرای یک تست تا زمانی که یک رویداد جاوا اسکریپت رخ دهد استفاده کرد:

$browser->waitForEvent('load');

شنونده رویداد به محدوده فعلی متصل است که body به طور پیش فرض عنصر است. هنگام استفاده از انتخابگر scoped، شنونده رویداد به عنصر تطبیق متصل می شود:

$browser->with('iframe', function (Browser $iframe) {
// Wait for the iframe's load event...
$iframe->waitForEvent('load');
});

همچنین می‌توانید یک انتخابگر به عنوان آرگومان دوم متد waitForEvent برای پیوست کردن شنونده رویداد به یک عنصر خاص ارائه دهید:

$browser->waitForEvent('load', '.selector');

همچنین می توانید منتظر رویدادهای مربوط به document و window اشیاء باشید:

// Wait until the document is scrolled...
$browser->waitForEvent('scroll', 'document');
 
// Wait a maximum of five seconds until the window is resized...
$browser->waitForEvent('resize', 'window', 5);

انتظار با پاسخ به تماس

بسیاری از روش‌های «انتظار» در Dusk به waitUsing روش اصلی متکی هستند. می‌توانید مستقیماً از این روش برای منتظر ماندن برای بازگشت بسته شدن معین استفاده کنید true . این waitUsing روش حداکثر تعداد ثانیه برای انتظار، فاصله زمانی که بسته شدن باید ارزیابی شود، بسته شدن و یک پیام شکست اختیاری را می پذیرد:

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

پیمایش یک عنصر در نمای

گاهی اوقات ممکن است نتوانید روی یک عنصر کلیک کنید زیرا خارج از ناحیه قابل مشاهده مرورگر است. این scrollIntoView روش در پنجره مرورگر پیمایش می کند تا زمانی که عنصر موجود در انتخابگر داده شده در نمای ظاهر شود:

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

ادعاهای موجود

Dusk اظهارات مختلفی را ارائه می دهد که ممکن است علیه برنامه خود بیان کنید. تمام ادعاهای موجود در فهرست زیر مستند شده است:

عنوان عنوان assertTitleContains assertUrlIs assertSchemeIs assertSchemeIsNot assertHostIs assertHostIsNot assertPortIs assertPortIsNot assertPathBeginsWith assertPathIs assertPathIsNot assertRouteIs assertQueryStringHas assertQueryString Missing ادعای FragmentIs assertFragmentBeginsWith assertFragmentIsNot AssertHasCookie assertHasPlainCookie اظهار کوکی گم شده است assertPlainCookie Missing assertCookieValue assertPlainCookieValue ادعا ببینید ادعا کنید ببینید assertSeeIn assertDontSeeIn assertSeeAnythingIn assertSeeNothingIn assertScript ادعا منبع دارد عنوان منبع گم شده است assertSeeLink assertDontSeeLink assertInputValue assertInputValueIsNot اظهار بررسی شد assertNotChecked ادعای نامشخص assertRadioSelected assertRadioNotSelected ادعا انتخاب شد assertNotSelected assertSelectHasOptions assertSelectMissingOptions assertSelectHasOption assertSelectMissingOption assertValue assertValueIsNot assertAttribute assertAttributeContains assertAttributeDoesntContain assertAriaAttribute assertDataAttribute ادعا قابل مشاهده ادعای حاضر assertNotPresent ادعای گمشده assertInputPresent assertInput Missing assertDialog باز شد assertEnabled ادعا غیرفعال شده است assertButtonEnabled assertButtonDisabled تاکید متمرکز assertNotFocused عنوان تایید شده است مدعی مهمان assertAuthenticatedAs assertVue assertVueIsNot assertVueContains assertVueDoesntContain

عنوان عنوان

ادعا کنید که عنوان صفحه با متن داده شده مطابقت دارد:

$browser->assertTitle($title);

assertTitleContains

ادعا کنید که عنوان صفحه حاوی متن داده شده است:

$browser->assertTitleContains($title);

assertUrlIs

ادعا کنید که URL فعلی (بدون رشته پرس و جو) با رشته داده شده مطابقت دارد:

$browser->assertUrlIs($url);

assertSchemeIs

ادعا کنید که طرح URL فعلی با طرح داده شده مطابقت دارد:

$browser->assertSchemeIs($scheme);

assertSchemeIsNot

ادعا کنید که طرح URL فعلی با طرح داده شده مطابقت ندارد:

$browser->assertSchemeIsNot($scheme);

assertHostIs

ادعا کنید که میزبان URL فعلی با میزبان داده شده مطابقت دارد:

$browser->assertHostIs($host);

assertHostIsNot

ادعا کنید که میزبان URL فعلی با میزبان داده شده مطابقت ندارد:

$browser->assertHostIsNot($host);

assertPortIs

ادعا کنید که پورت URL فعلی با پورت داده شده مطابقت دارد:

$browser->assertPortIs($port);

assertPortIsNot

ادعا کنید که پورت URL فعلی با پورت داده شده مطابقت ندارد:

$browser->assertPortIsNot($port);

assertPathBeginsWith

ادعا کنید که مسیر URL فعلی با مسیر داده شده شروع می شود:

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

assertPathIs

ثابت کنید که مسیر فعلی با مسیر داده شده مطابقت دارد:

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

assertPathIsNot

ثابت کنید که مسیر فعلی با مسیر داده شده مطابقت ندارد:

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

assertRouteIs

ادعا کنید که URL فعلی با URL مسیر نامگذاری شده مطابقت دارد :

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

assertQueryStringHas

ادعا کنید که پارامتر رشته کوئری داده شده وجود دارد:

$browser->assertQueryStringHas($name);

ادعا کنید که پارامتر رشته کوئری داده شده وجود دارد و مقدار مشخصی دارد:

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

assertQueryString Missing

ادعا کنید که پارامتر رشته کوئری داده شده وجود ندارد:

$browser->assertQueryStringMissing($name);

ادعای FragmentIs

ادعا کنید که قطعه هش فعلی URL با قطعه داده شده مطابقت دارد:

$browser->assertFragmentIs('anchor');

assertFragmentBeginsWith

ادعا کنید که قطعه هش فعلی URL با قطعه داده شده شروع می شود:

$browser->assertFragmentBeginsWith('anchor');

assertFragmentIsNot

ادعا کنید که قطعه هش فعلی URL با قطعه داده شده مطابقت ندارد:

$browser->assertFragmentIsNot('anchor');

ادعا کنید که کوکی رمزگذاری شده موجود است:

$browser->assertHasCookie($name);

ادعا کنید که کوکی رمزگذاری نشده موجود است:

$browser->assertHasPlainCookie($name);

ادعا کنید که کوکی رمزگذاری شده وجود ندارد:

$browser->assertCookieMissing($name);

ادعا کنید که کوکی رمزگذاری نشده ارائه شده وجود ندارد:

$browser->assertPlainCookieMissing($name);

ادعا کنید که یک کوکی رمزگذاری شده دارای یک مقدار مشخص است:

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

ادعا کنید که یک کوکی رمزگذاری نشده دارای مقدار مشخصی است:

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

ادعا ببینید

ادعا کنید که متن داده شده در صفحه وجود دارد:

$browser->assertSee($text);

ادعا کنید ببینید

ادعا کنید که متن داده شده در صفحه وجود ندارد:

$browser->assertDontSee($text);

assertSeeIn

ادعا کنید که متن داده شده در انتخابگر وجود دارد:

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

assertDontSeeIn

ادعا کنید که متن داده شده در انتخابگر وجود ندارد:

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

assertSeeAnythingIn

ادعا کنید که هر متنی در انتخابگر وجود دارد:

$browser->assertSeeAnythingIn($selector);

assertSeeNothingIn

ادعا کنید که هیچ متنی در انتخابگر وجود ندارد:

$browser->assertSeeNothingIn($selector);

assertScript

ادعا کنید که عبارت جاوا اسکریپت داده شده را به مقدار داده شده ارزیابی می کند:

$browser->assertScript('window.isLoaded')
->assertScript('document.readyState', 'complete');

ادعا منبع دارد

تأیید کنید که کد منبع داده شده در صفحه موجود است:

$browser->assertSourceHas($code);

عنوان منبع گم شده است

تأیید کنید که کد منبع داده شده در صفحه وجود ندارد:

$browser->assertSourceMissing($code);

اطمینان حاصل کنید که پیوند داده شده در صفحه وجود دارد:

$browser->assertSeeLink($linkText);

اطمینان حاصل کنید که پیوند داده شده در صفحه وجود ندارد:

$browser->assertDontSeeLink($linkText);

assertInputValue

ادعا کنید که فیلد ورودی داده شده دارای مقدار داده شده است:

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

assertInputValueIsNot

ادعا کنید که فیلد ورودی داده شده مقدار داده شده را ندارد:

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

اظهار بررسی شد

تأیید کنید که چک باکس داده شده علامت زده شده است:

$browser->assertChecked($field);

assertNotChecked

تأیید کنید که چک باکس داده شده علامت نخورده است:

$browser->assertNotChecked($field);

ادعای نامشخص

ادعا کنید که چک باکس داده شده در حالت نامشخص است:

$browser->assertIndeterminate($field);

assertRadioSelected

ادعا کنید که فیلد رادیویی داده شده انتخاب شده است:

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

assertRadioNotSelected

ادعا کنید که فیلد رادیویی داده شده انتخاب نشده است:

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

ادعا انتخاب شد

ادعا کنید که در منوی کشویی مقدار داده شده انتخاب شده است:

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

assertNotSelected

ادعا کنید که در منوی کشویی مقدار داده شده انتخاب نشده است:

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

assertSelectHasOptions

ادعا کنید که آرایه مقادیر داده شده برای انتخاب در دسترس است:

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

assertSelectMissingOptions

ادعا کنید که آرایه مقادیر داده شده برای انتخاب در دسترس نیست:

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

assertSelectHasOption

ادعا کنید که مقدار داده شده برای انتخاب در فیلد داده شده در دسترس است:

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

assertSelectMissingOption

ادعا کنید که مقدار داده شده برای انتخاب در دسترس نیست:

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

assertValue

ادعا کنید که عنصر مطابق با انتخابگر داده شده دارای مقدار داده شده است:

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

assertValueIsNot

ادعا کنید که عنصر مطابق با انتخابگر داده شده مقدار داده شده را ندارد:

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

assertAttribute

ادعا کنید که عنصر مطابق با انتخابگر داده شده دارای مقدار داده شده در ویژگی ارائه شده است:

$browser->assertAttribute($selector, $attribute, $value);

assertAttributeContains

ادعا کنید که عنصر مطابق با انتخابگر داده شده حاوی مقدار داده شده در ویژگی ارائه شده است:

$browser->assertAttributeContains($selector, $attribute, $value);

assertAttributeDoesntContain

ادعا کنید که عنصر منطبق با انتخابگر داده شده حاوی مقدار داده شده در ویژگی ارائه شده نیست:

$browser->assertAttributeDoesntContain($selector, $attribute, $value);

assertAriaAttribute

ادعا کنید که عنصر منطبق با انتخابگر داده شده دارای مقدار داده شده در ویژگی aria ارائه شده است:

$browser->assertAriaAttribute($selector, $attribute, $value);

به عنوان مثال، با توجه به نشانه گذاری <button aria-label="Add"></button> ، می توانید در برابر aria-label ویژگی مانند این ادعا کنید:

$browser->assertAriaAttribute('button', 'label', 'Add')

assertDataAttribute

ادعا کنید که عنصر مطابق با انتخابگر داده شده دارای مقدار داده شده در ویژگی داده ارائه شده است:

$browser->assertDataAttribute($selector, $attribute, $value);

به عنوان مثال، با توجه به نشانه گذاری <tr id="row-1" data-content="attendees"></tr> ، می توانید در برابر data-label ویژگی مانند این ادعا کنید:

$browser->assertDataAttribute('#row-1', 'content', 'attendees')

ادعا قابل مشاهده

ادعا کنید که عنصر مطابق با انتخابگر داده شده قابل مشاهده است:

$browser->assertVisible($selector);

ادعای حاضر

ادعا کنید که عنصر مطابق با انتخابگر داده شده در منبع وجود دارد:

$browser->assertPresent($selector);

assertNotPresent

ادعا کنید که عنصر مطابق با انتخابگر داده شده در منبع وجود ندارد:

$browser->assertNotPresent($selector);

ادعای گمشده

ادعا کنید که عنصر مطابق با انتخابگر داده شده قابل مشاهده نیست:

$browser->assertMissing($selector);

assertInputPresent

ادعا کنید که یک ورودی با نام داده شده وجود دارد:

$browser->assertInputPresent($name);

assertInput Missing

ادعا کنید که ورودی با نام داده شده در منبع وجود ندارد:

$browser->assertInputMissing($name);

assertDialog باز شد

ادعا کنید که یک گفتگوی جاوا اسکریپت با پیام داده شده باز شده است:

$browser->assertDialogOpened($message);

assertEnabled

ثابت کنید که فیلد داده شده فعال است:

$browser->assertEnabled($field);

ادعا غیرفعال شده است

ثابت کنید که فیلد داده شده غیرفعال است:

$browser->assertDisabled($field);

assertButtonEnabled

تاکید کنید که دکمه داده شده فعال است:

$browser->assertButtonEnabled($button);

assertButtonDisabled

تاکید کنید که دکمه داده شده غیرفعال است:

$browser->assertButtonDisabled($button);

تاکید متمرکز

ادعا کنید که فیلد داده شده متمرکز است:

$browser->assertFocused($field);

assertNotFocused

ادعا کنید که فیلد داده شده متمرکز نیست:

$browser->assertNotFocused($field);

عنوان تایید شده است

ادعا کنید که کاربر احراز هویت شده است:

$browser->assertAuthenticated();

مدعی مهمان

ادعا کنید که کاربر احراز هویت نشده است:

$browser->assertGuest();

assertAuthenticatedAs

ادعا کنید که کاربر به عنوان کاربر مشخص شده احراز هویت شده است:

$browser->assertAuthenticatedAs($user);

assertVue

Dusk حتی به شما امکان می دهد تا در مورد وضعیت داده های مؤلفه Vue اظهار نظر کنید . به عنوان مثال، تصور کنید برنامه شما حاوی مولفه Vue زیر است:

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

شما می توانید در مورد وضعیت مؤلفه Vue چنین ادعا کنید:

test('vue', function () {
$this->browse(function (Browser $browser) {
$browser->visit('/')
->assertVue('user.name', 'Taylor', '@profile-component');
});
});
/**
* A basic Vue test example.
*/
public function test_vue(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->assertVue('user.name', 'Taylor', '@profile-component');
});
}

assertVueIsNot

ادعا کنید که ویژگی داده مولفه Vue با مقدار داده شده مطابقت ندارد:

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

assertVueContains

ادعا کنید که ویژگی داده مولفه Vue یک آرایه است و حاوی مقدار داده شده است:

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

assertVueDoesntContain

ادعا کنید که ویژگی داده مولفه Vue یک آرایه است و حاوی مقدار داده شده نیست:

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

صفحات

گاهی اوقات، آزمایش ها نیاز به چندین عمل پیچیده دارند که به ترتیب انجام شوند. این می تواند خواندن و درک تست های شما را سخت تر کند. Dusk Pages به شما این امکان را می دهد که اقدامات بیانی را تعریف کنید که ممکن است از طریق یک روش در یک صفحه مشخص انجام شود. صفحات همچنین به شما این امکان را می دهند که میانبرهایی را برای انتخابگرهای رایج برای برنامه خود یا برای یک صفحه تعریف کنید.

تولید صفحات

برای ایجاد یک شی صفحه، dusk:page دستور Artisan را اجرا کنید. تمام اشیاء صفحه در فهرست برنامه شما قرار خواهند گرفت tests/Browser/Pages :

php artisan dusk:page Login

پیکربندی صفحات

به طور پیش فرض، صفحات دارای سه روش هستند: url , assert و elements . اکنون در مورد url و روش ها بحث خواهیم کرد . assert روش در زیر با جزئیات بیشتر مورد بحث elements قرار خواهد گرفت .

روش url

متد url باید مسیر URL که صفحه را نشان می دهد برگرداند. Dusk هنگام پیمایش به صفحه در مرورگر از این URL استفاده می کند:

/**
* Get the URL for the page.
*/
public function url(): string
{
return '/login';
}

روش assert

این assert روش ممکن است هر گونه ادعای لازم را برای تأیید اینکه مرورگر واقعاً در صفحه داده شده است انجام دهد. در واقع نیازی به قرار دادن چیزی در این روش نیست. با این حال، در صورت تمایل می توانید این اظهارات را بیان کنید. این ادعاها به طور خودکار هنگام پیمایش به صفحه اجرا می شوند:

/**
* Assert that the browser is on the page.
*/
public function assert(Browser $browser): void
{
$browser->assertPathIs($this->url());
}

هنگامی که یک صفحه تعریف شد، می توانید با استفاده از visit روش زیر به آن بروید:

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

گاهی اوقات ممکن است قبلاً در یک صفحه مشخص باشید و نیاز داشته باشید انتخابگرها و روش های صفحه را در زمینه آزمایش فعلی "بارگیری" کنید. این امر در هنگام فشار دادن یک دکمه و هدایت مجدد به یک صفحه مشخص بدون پیمایش صریح به آن رایج است. در این شرایط، می توانید از on روش برای بارگذاری صفحه استفاده کنید:

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

انتخابگرهای کوتاه نویسی

روش elements درون کلاس‌های صفحه به شما امکان می‌دهد میانبرهایی سریع و آسان برای به خاطر سپردن برای هر انتخابگر CSS در صفحه خود تعریف کنید. به عنوان مثال، اجازه دهید یک میانبر برای فیلد ورودی "ایمیل" در صفحه ورود برنامه تعریف کنیم:

/**
* Get the element shortcuts for the page.
*
* @return array<string, string>
*/
public function elements(): array
{
return [
'@email' => 'input[name=email]',
];
}

هنگامی که میانبر تعریف شد، می توانید از انتخابگر مختصر در هر جایی که معمولاً از یک انتخابگر کامل CSS استفاده می کنید استفاده کنید:

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

انتخابگرهای جهانی کوتاه نویسی

پس از نصب Dusk، یک Page کلاس پایه در دایرکتوری شما قرار می گیرد tests/Browser/Pages . این کلاس حاوی siteElements روشی است که ممکن است برای تعریف انتخابگرهای مختصر کلی که باید در هر صفحه در سراسر برنامه شما در دسترس باشد، استفاده شود:

/**
* Get the global element shortcuts for the site.
*
* @return array<string, string>
*/
public static function siteElements(): array
{
return [
'@element' => '#selector',
];
}

روش های صفحه

علاوه بر روش‌های پیش‌فرض تعریف‌شده در صفحات، می‌توانید روش‌های دیگری را تعریف کنید که ممکن است در طول آزمایش‌های خود مورد استفاده قرار گیرند. به عنوان مثال، بیایید تصور کنیم که در حال ساخت یک برنامه مدیریت موسیقی هستیم. یک اقدام رایج برای یک صفحه از برنامه ممکن است ایجاد یک لیست پخش باشد. به جای بازنویسی منطق ایجاد یک لیست پخش در هر آزمون، می توانید یک createPlaylist متد را در کلاس صفحه تعریف کنید:

<?php
 
namespace Tests\Browser\Pages;
 
use Laravel\Dusk\Browser;
 
class Dashboard extends Page
{
// Other page methods...
 
/**
* Create a new playlist.
*/
public function createPlaylist(Browser $browser, string $name): void
{
$browser->type('name', $name)
->check('share')
->press('Create Playlist');
}
}

هنگامی که روش تعریف شد، می توانید از آن در هر تستی که از صفحه استفاده می کند استفاده کنید. نمونه مرورگر به طور خودکار به عنوان اولین آرگومان به روش های صفحه سفارشی ارسال می شود:

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

اجزاء

مؤلفه‌ها شبیه «اشیاء صفحه» Dusk هستند، اما برای بخش‌هایی از رابط کاربری و عملکردی هستند که در سراسر برنامه شما مجدداً استفاده می‌شوند، مانند نوار پیمایش یا پنجره اعلان. به این ترتیب، مؤلفه ها به URL های خاصی محدود نمی شوند.

تولید مولفه ها

برای تولید کامپوننت، dusk:component دستور Artisan را اجرا کنید. اجزای جدید در tests/Browser/Components دایرکتوری قرار می گیرند:

php artisan dusk:component DatePicker

همانطور که در بالا نشان داده شد، "انتخاب کننده تاریخ" نمونه ای از مؤلفه ای است که ممکن است در سراسر برنامه شما در صفحات مختلف وجود داشته باشد. نوشتن دستی منطق اتوماسیون مرورگر برای انتخاب تاریخ در ده ها تست در مجموعه آزمایشی شما می تواند دشوار باشد. درعوض، می‌توانیم یک مؤلفه Dusk را برای نشان دادن انتخابگر تاریخ تعریف کنیم و به ما این امکان را می‌دهد که این منطق را در مولفه کپسوله کنیم:

<?php
 
namespace Tests\Browser\Components;
 
use Laravel\Dusk\Browser;
use Laravel\Dusk\Component as BaseComponent;
 
class DatePicker extends BaseComponent
{
/**
* Get the root selector for the component.
*/
public function selector(): string
{
return '.date-picker';
}
 
/**
* Assert that the browser page contains the component.
*/
public function assert(Browser $browser): void
{
$browser->assertVisible($this->selector());
}
 
/**
* Get the element shortcuts for the component.
*
* @return array<string, string>
*/
public function elements(): array
{
return [
'@date-field' => 'input.datepicker-input',
'@year-list' => 'div > div.datepicker-years',
'@month-list' => 'div > div.datepicker-months',
'@day-list' => 'div > div.datepicker-days',
];
}
 
/**
* Select the given date.
*/
public function selectDate(Browser $browser, int $year, int $month, int $day): void
{
$browser->click('@date-field')
->within('@year-list', function (Browser $browser) use ($year) {
$browser->click($year);
})
->within('@month-list', function (Browser $browser) use ($month) {
$browser->click($month);
})
->within('@day-list', function (Browser $browser) use ($day) {
$browser->click($day);
});
}
}

استفاده از کامپوننت ها

هنگامی که مؤلفه تعریف شد، می‌توانیم به راحتی یک تاریخ را در انتخابگر تاریخ از هر آزمایشی انتخاب کنیم. و اگر منطق لازم برای انتخاب تاریخ تغییر کند، فقط باید کامپوننت را به روز کنیم:

<?php
 
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\Browser\Components\DatePicker;
 
uses(DatabaseMigrations::class);
 
test('basic example', function () {
$this->browse(function (Browser $browser) {
$browser->visit('/')
->within(new DatePicker, function (Browser $browser) {
$browser->selectDate(2019, 1, 30);
})
->assertSee('January');
});
});
<?php
 
namespace Tests\Browser;
 
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\Browser\Components\DatePicker;
use Tests\DuskTestCase;
 
class ExampleTest extends DuskTestCase
{
/**
* A basic component test example.
*/
public function test_basic_example(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->within(new DatePicker, function (Browser $browser) {
$browser->selectDate(2019, 1, 30);
})
->assertSee('January');
});
}
}

یکپارچه سازی مداوم

اکثر پیکربندی‌های ادغام پیوسته Dusk انتظار دارند که برنامه Laravel شما با استفاده از سرور توسعه PHP داخلی در پورت 8000 ارائه شود. بنابراین، قبل از ادامه، باید مطمئن شوید که محیط یکپارچه‌سازی پیوسته شما دارای مقدار APP_URL متغیر محیطی است http://127.0.0.1:8000 .

Heroku CI

برای اجرای تست‌های Dusk در Heroku CI ، بیلدپک گوگل کروم و اسکریپت‌های زیر را به app.json فایل Heroku خود اضافه کنید:

{
"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 --no-reload > /dev/null 2>&1 &' && php artisan dusk"
}
}
}
}

تراویس سی

برای اجرای آزمایش‌های Dusk خود در Travis CI ، از پیکربندی زیر استفاده کنید .travis.yml . از آنجایی که Travis CI یک محیط گرافیکی نیست، برای راه‌اندازی مرورگر کروم باید اقدامات بیشتری انجام دهیم. علاوه بر این، ما php artisan serve برای راه اندازی وب سرور داخلی PHP استفاده خواهیم کرد:

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

اقدامات GitHub

اگر از GitHub Actions برای اجرای تست های Dusk خود استفاده می کنید ، می توانید از فایل پیکربندی زیر به عنوان نقطه شروع استفاده کنید. مانند TravisCI، ما از php artisan serve دستور برای راه اندازی وب سرور داخلی PHP استفاده خواهیم کرد:

name: CI
on: [push]
jobs:
 
dusk-php:
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@v4
- name: Prepare The Environment
run: cp .env.example .env
- name: Create Database
run: |
sudo systemctl start mysql
mysql --user="root" --password="root" -e "CREATE DATABASE \`my-database\` character set UTF8mb4 collate utf8mb4_bin;"
- name: Install Composer Dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Generate Application Key
run: php artisan key:generate
- name: Upgrade Chrome Driver
run: php artisan dusk:chrome-driver --detect
- name: Start Chrome Driver
run: ./vendor/laravel/dusk/bin/chromedriver-linux &
- name: Run Laravel Server
run: php artisan serve --no-reload &
- name: Run Dusk Tests
run: php artisan dusk
- name: Upload Screenshots
if: failure()
uses: actions/upload-artifact@v2
with:
name: screenshots
path: tests/Browser/screenshots
- name: Upload Console Logs
if: failure()
uses: actions/upload-artifact@v2
with:
name: console
path: tests/Browser/console

چیپر CI

اگر از Chipper CI برای اجرای تست های Dusk خود استفاده می کنید ، می توانید از فایل پیکربندی زیر به عنوان نقطه شروع استفاده کنید. ما از سرور داخلی PHP برای اجرای لاراول استفاده می کنیم تا بتوانیم به درخواست ها گوش دهیم:

# file .chipperci.yml
version: 1
 
environment:
php: 8.2
node: 16
 
# Include Chrome in the build environment
services:
- dusk
 
# Build all commits
on:
push:
branches: .*
 
pipeline:
- name: Setup
cmd: |
cp -v .env.example .env
composer install --no-interaction --prefer-dist --optimize-autoloader
php artisan key:generate
 
# Create a dusk env file, ensuring APP_URL uses BUILD_HOST
cp -v .env .env.dusk.ci
sed -i "s@APP_URL=.*@APP_URL=http://$BUILD_HOST:8000@g" .env.dusk.ci
 
- name: Compile Assets
cmd: |
npm ci --no-audit
npm run build
 
- name: Browser Tests
cmd: |
php -S [::0]:8000 -t public 2>server.log &
sleep 2
php artisan dusk:chrome-driver $CHROME_DRIVER
php artisan dusk --env=ci

برای کسب اطلاعات بیشتر در مورد اجرای آزمایش‌های Dusk در Chipper CI، از جمله نحوه استفاده از پایگاه‌های داده، به مستندات رسمی Chipper CI مراجعه کنید .