نسخه:

Laravel Dusk

معرفی

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

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

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

composer require --dev laravel/dusk

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

پس از نصب بسته Dusk، dusk:install دستور Artisan را اجرا کنید:

php artisan dusk:install

یک Browser دایرکتوری در دایرکتوری شما ایجاد می شود tests و حاوی یک نمونه آزمایش است. سپس APP_URL متغیر محیطی را در .env فایل خود تنظیم کنید. این مقدار باید با URL مورد استفاده شما برای دسترسی به برنامه خود در مرورگر مطابقت داشته باشد.

برای اجرای تست های خود از dusk دستور Artisan استفاده کنید. دستور dusk هر آرگومانی را می پذیرد که توسط دستور نیز پذیرفته شود phpunit :

php artisan dusk

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

php artisan dusk:fails

مدیریت نصب ChromeDriver

اگر می‌خواهید نسخه دیگری از ChromeDriver را با نسخه‌ای که در لاراول Dusk ارائه می‌شود نصب کنید، می‌توانید از این 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 74
 
# Install a given version of ChromeDriver for all supported OSs...
php artisan dusk:chrome-driver --all

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
* @return void
*/
public static function prepare()
{
// static::startChromeDriver();
}

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

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

شروع شدن

تولید تست ها

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

php artisan dusk:make LoginTest

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

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

php artisan dusk

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

php artisan dusk:fails

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

php artisan dusk --group=foo

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

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

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

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

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

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

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

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

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

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

<?php
 
namespace Tests\Browser;
 
use App\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Chrome;
use Tests\DuskTestCase;
 
class ExampleTest extends DuskTestCase
{
use DatabaseMigrations;
 
/**
* A basic browser test example.
*
* @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', 'password')
->press('Login')
->assertPathIs('/home');
});
}
}

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

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

گاهی اوقات ممکن است برای انجام درست یک آزمایش به چندین مرورگر نیاز داشته باشید. برای مثال، ممکن است برای آزمایش صفحه چت که با سوکت‌های وب در تعامل است، به چندین مرورگر نیاز باشد. برای ایجاد چندین مرورگر، در امضای فراخوانی که به روش داده شده است، بیش از یک مرورگر را بخواهید 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');
});

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

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

$browser->resize(1920, 1080);

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

$browser->maximize();

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

$browser->fitContent();

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

$browser->disableFitOnFailure();

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

$browser->move(100, 100);

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

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

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

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

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

احراز هویت

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

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

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

مهاجرت های پایگاه داده

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

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

بیسکویت ها

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

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

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

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

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

$browser->deleteCookie('name');

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

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

$browser->screenshot('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');

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

$browser->clickLink($linkText);

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

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

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

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

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

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

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

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

// Retrieve the value of an input element...
$inputValue = $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 یک فیلد ورودی با name ویژگی داده شده را جستجو می کند. در نهایت، Dusk تلاش خواهد کرد تا a را 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 روش استفاده کنید. مانند type متد، select روش نیز به انتخابگر کامل CSS نیاز ندارد. هنگام ارسال یک مقدار به select متد، باید مقدار گزینه زیرین را به جای متن نمایش داده ارسال کنید:

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

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

$browser->select('size');

چک باکس ها

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

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

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

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

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

پیوست کردن فایل ها

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

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

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

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

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

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

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

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

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

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

روی عناصر کلیک کنید

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

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

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

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

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

$browser->clickAtPoint(0, 0);

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

$browser->doubleClick();

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

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

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

$browser->clickAndHold()
->pause(1000)
->releaseMouse();

ماوس بر

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

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

کشیدن و رها کردن

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

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

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

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

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

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

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

Dusk روش های مختلفی را برای تعامل با دیالوگ های جاوا اسکریپت ارائه می دهد:

// Wait for a dialog to appear:
$browser->waitForDialog($seconds = null);
 
// Assert that a dialog has been displayed and that its message matches the given value:
$browser->assertDialogOpened('value');
 
// Type the given value in an open JavaScript prompt dialog:
$browser->typeInDialog('Hello World');

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

$browser->acceptDialog();

برای بستن یک گفتگوی باز شده جاوا اسکریپت، روی دکمه لغو کلیک کنید (فقط برای گفتگوی تأیید):

$browser->dismissDialog();

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

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

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

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

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

انتظار برای عناصر

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

در انتظار

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

$browser->pause(1000);

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

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

// 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);

همچنین می‌توانید منتظر بمانید تا انتخاب‌کننده داده‌شده در صفحه وجود نداشته باشد:

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

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

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

$browser->whenAvailable('.modal', function ($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);

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

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

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

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

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

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

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

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

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

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

// Wait a maximum of five seconds for the expression to be true...
$browser->waitUntil('App.dataLoaded');
 
$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

از روش‌های زیر می‌توان برای صبر کردن تا زمانی که یک ویژگی جزء 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');

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

بسیاری از روش‌های «انتظار» در 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');

ایجاد اظهارات Vue

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 چنین ادعا کنید:

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

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

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

عنوان عنوان

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

$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($path);

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

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

$browser->assertFragmentIs('anchor');

assertFragmentBeginsWith

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

$browser->assertFragmentBeginsWith('anchor');

assertFragmentIsNot

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

$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);

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

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

$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);

assertRadioSelected

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

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

assertRadioNotSelected

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

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

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

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

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

assertNotSelected

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

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

assertSelectHasOptions

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

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

assertSelectMissingOption

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

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

assertSelectMissingOptions

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

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

assertSelectHasOption

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

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

assertValue

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

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

adsertAttribute

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

$browser->assertAttribute($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);

ادعای گمشده

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

$browser->assertMissing($selector);

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

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

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

assertVueIsNot

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

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

assertVueContains

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

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

assertVueDoesNotContain

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

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

صفحات

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

تولید صفحات

برای تولید یک شی صفحه، از 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.
*
* @return string
*/
public function url()
{
return '/login';
}

روش assert _

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

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

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

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

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

$browser->visitRoute('login');

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

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

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

$browser->refresh();

گاهی اوقات ممکن است قبلاً در یک صفحه مشخص باشید و نیاز داشته باشید انتخابگرها و روش های صفحه را در زمینه آزمایش فعلی "بارگیری" کنید. این امر در هنگام فشار دادن یک دکمه و هدایت مجدد به یک صفحه مشخص بدون پیمایش صریح به آن رایج است. در این شرایط، می توانید از 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
*/
public function elements()
{
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
*/
public static function siteElements()
{
return [
'@element' => '#selector',
];
}

روش های صفحه

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

<?php
 
namespace Tests\Browser\Pages;
 
use Laravel\Dusk\Browser;
 
class Dashboard extends Page
{
// Other page methods...
 
/**
* Create a new playlist.
*
* @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');
}
}

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

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.
*
* @return string
*/
public function selector()
{
return '.date-picker';
}
 
/**
* Assert that the browser page contains the component.
*
* @param Browser $browser
* @return void
*/
public function assert(Browser $browser)
{
$browser->assertVisible($this->selector());
}
 
/**
* Get the element shortcuts for the component.
*
* @return array
*/
public function elements()
{
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.
*
* @param \Laravel\Dusk\Browser $browser
* @param int $year
* @param int $month
* @param int $day
* @return void
*/
public function selectDate($browser, $year, $month, $day)
{
$browser->click('@date-field')
->within('@year-list', function ($browser) use ($year) {
$browser->click($year);
})
->within('@month-list', function ($browser) use ($month) {
$browser->click($month);
})
->within('@day-list', function ($browser) use ($day) {
$browser->click($day);
});
}
}

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

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

<?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.
*
* @return void
*/
public function testBasicExample()
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->within(new DatePicker, function ($browser) {
$browser->selectDate(2019, 1, 30);
})
->assertSee('January');
});
}
}

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

قبل از افزودن یک فایل پیکربندی یکپارچه سازی پیوسته، مطمئن شوید که .env.testing فایل شما دارای APP_URL ورودی با مقدار http://127.0.0.1:8000 .

CircleCI

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

version: 2
jobs:
build:
steps:
- run: sudo apt-get install -y libsqlite3-dev
- run: cp .env.testing .env
- run: composer install -n --ignore-platform-reqs
- run: php artisan key:generate
- run: php artisan dusk:chrome-driver
- 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
 
- store_artifacts:
path: tests/Browser/screenshots
 
- store_artifacts:
path: tests/Browser/console
 
- store_artifacts:
path: storage/logs

کدنویسی

برای اجرای تست های Dusk در Codeship ، دستورات زیر را به پروژه Codeship خود اضافه کنید. این دستورات فقط یک نقطه شروع هستند و شما می توانید در صورت نیاز دستورات اضافی اضافه کنید:

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

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 > /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 --no-suggest
- 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 &
 
script:
- php artisan dusk

اقدامات GitHub

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

name: CI
on: [push]
jobs:
 
dusk-php:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- 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 --no-suggest --prefer-dist --optimize-autoloader
- name: Generate Application Key
run: php artisan key:generate
- name: Upgrade Chrome Driver
run: php artisan dusk:chrome-driver `/opt/google/chrome/chrome --version | cut -d " " -f3 | cut -d "." -f1`
- name: Start Chrome Driver
run: ./vendor/laravel/dusk/bin/chromedriver-linux &
- name: Run Laravel Server
run: php artisan serve &
- name: Run Dusk Tests
env:
APP_URL: "http://127.0.0.1:8000"
run: php artisan dusk