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');
AssertHasCookie
ادعا کنید که کوکی رمزگذاری شده موجود است:
$browser->assertHasCookie($name);
assertHasPlainCookie
ادعا کنید که کوکی رمزگذاری نشده موجود است:
$browser->assertHasPlainCookie($name);
اظهار کوکی گم شده است
ادعا کنید که کوکی رمزگذاری شده وجود ندارد:
$browser->assertCookieMissing($name);
assertPlainCookie Missing
ادعا کنید که کوکی رمزگذاری نشده ارائه شده وجود ندارد:
$browser->assertPlainCookieMissing($name);
assertCookieValue
ادعا کنید که یک کوکی رمزگذاری شده دارای یک مقدار مشخص است:
$browser->assertCookieValue($name, $value);
assertPlainCookieValue
ادعا کنید که یک کوکی رمزگذاری نشده دارای مقدار مشخصی است:
$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);
assertSeeLink
اطمینان حاصل کنید که پیوند داده شده در صفحه وجود دارد:
$browser->assertSeeLink($linkText);
assertDontSeeLink
اطمینان حاصل کنید که پیوند داده شده در صفحه وجود ندارد:
$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: CIon: [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.ymlversion: 1 environment: php: 8.2 node: 16 # Include Chrome in the build environmentservices: - dusk # Build all commitson: 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 مراجعه کنید .