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 اظهارات مختلفی را ارائه می دهد که ممکن است علیه برنامه خود بیان کنید. تمام ادعاهای موجود در فهرست زیر مستند شده است:
عنوان عنوان 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 ادعا منبع دارد عنوان منبع گم شده است assertSeeLink assertDontSeeLink assertInputValue assertInputValueIsNot ادعا بررسی شد assertNotChecked assertRadioSelected assertRadioNotSelected ادعا انتخاب شد assertNotSelected assertSelectHasOptions assertSelectMissingOption assertSelectMissingOptions assertSelectHasOption assertValue adsertAttribute assertAriaAttribute assertDataAttribute ادعا قابل مشاهده ادعای حاضر ادعای گمشده assertDialog باز شد assertEnabled ادعا غیرفعال است assertButtonEnabled assertButtonDisabled تاکید متمرکز assertNotFocused عنوان تایید شده است مدعی مهمان assertAuthenticatedAs assertVue assertVueIsNot assertVueContains assertVueDoesNotContain
عنوان عنوان
ادعا کنید که عنوان صفحه با متن داده شده مطابقت دارد:
$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');
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);
ادعا منبع دارد
تأیید کنید که کد منبع داده شده در صفحه موجود است:
$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);
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: 2jobs: 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.2cp .env.testing .envmkdir -p ./bootstrap/cachecomposer install --no-interaction --prefer-distphp artisan key:generatephp artisan dusk:chrome-drivernohup bash -c "php artisan serve 2>&1 &" && sleep 5php 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: CIon: [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