介紹
Laravel Dusk提供了一種優(yōu)雅的、易于使用的瀏覽器自動化測試API。
默認情況下,Dusk不要求您在機器上安裝JDK或Selenium。
相反,Dusk使用獨立的ChromeDriver安裝。但是,您可以隨意使用任何其他兼容Selenium的驅動程序。
安裝
要開始,您應該將Composer依賴項laravel/dusk
添加到項目中:
composer require laravel/dusk
一旦Dusk安裝,您應該注冊服務提供商。
您應該在您的方法中注冊提供商,以限制Dusk的可用環(huán)境,因為它暴露了以其他用戶身份登錄的能力:
Laravel\Dusk\DuskServiceProvider
register
AppServiceProvider
use Laravel\Dusk\DuskServiceProvider;
/**
* Register any application services.
*
* @return void
*/
public function register(){
if ($this->app->environment('local', 'testing')) {
$this->app->register(DuskServiceProvider::class);
}
}
接下來,運行Artisan命令dusk:install
:
php artisan dusk:install
一個Browser
目錄將您的中創(chuàng)建tests
目錄,將包含一個示例測試。接下來,在.env文件中配置APP_URL
的環(huán)境變量。此值應與您用于在瀏覽器中訪問應用程序的URL匹配。
要運行測試,請使用dusk
Artisan命令。dusk
命令接受被phpunit
命令接受的任意參數(shù)。
php artisan dusk
使用其他瀏覽器
默認情況下,Dusk使用Google Chrome和獨立的ChromeDriver安裝程序來運行瀏覽器測試。
但是,您可以啟動自己的Selenium服務器,并針對你想用的任何瀏覽器運行測試。
要開始,打開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', DesiredCapabilities::phantomjs()
);
}
入門
生成測試
要生成Dusk測試,請使用Artisan命令dusk:make
。
生成的測試將放在tests/Browser
目錄中:
php artisan dusk:make LoginTest
運行測試
要運行瀏覽器測試,請使用dusk
Artisan命令:
php artisan dusk
這個dusk
命令接受通常情況下PHPUnit測試運行器接受的任何參數(shù),允許您僅給指定的組運行測試等:
php artisan dusk --group=foo
手動啟動ChromeDriver
默認情況下,Dusk將自動嘗試啟動ChromeDriver。如果這不適用于您的特定系統(tǒng),則可以在運行dusk命令之前手動啟動ChromeDriver 。
如果您選擇手動啟動ChromeDriver,您應該注釋掉以下tests/DuskTestCase.php
文件中的以下行:
/**
* Prepare for Dusk test execution.
*
* @beforeClass
* @return void
*/
public static function prepare( ){
// static::startChromeDriver( );
}
另外,如果您在9515以外的端口啟動ChromeDriver,您應該修改driver同一個類的方法:
/**
* Create the RemoteWebDriver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function driver(){
return RemoteWebDriver::create(
'http://localhost:9515', DesiredCapabilities::chrome()
);
}
環(huán)境處理
要在運行測試時強制Dusk使用自己的環(huán)境文件,請在項目的根目錄中創(chuàng)建一個.env.dusk.{environment}
文件。
例如,如果您將從本地環(huán)境啟動dusk命令,則應創(chuàng)建一個.env.dusk.local
文件。
運行測試時,Dusk將備份您的.env
文件并重命名您的Dusk環(huán)境.env
。
測試完成后,您的.env
文件將被還原。
創(chuàng)建瀏覽器
我們從寫一個驗證登錄我們應用程序的測試來開始測試。
生成測試后,我們可以修改它,導航到登錄頁面,輸入一些憑據(jù),然后點擊“登錄”按鈕。
要創(chuàng)建瀏覽器實例,請調用browse
方法:
<?php
namespace Tests\Browser;
use App\User;
use Tests\DuskTestCase;
use Laravel\Dusk\Chrome;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends DuskTestCase
{
use DatabaseMigrations;
/**
* 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', 'secret')
->press('Login')
->assertPathIs('/home');
});
}
}
如上例所示,browse
方法接收回調。
瀏覽器實例將自動被Dusk傳遞給這個回調,并且是用于與您的應用程序進行交互和斷言的主要對象。
創(chuàng)建多個瀏覽器
有時您可能需要多個瀏覽器才能正確地進行測試。
例如,可能需要多個瀏覽器來測試與websockets交互的聊天屏幕。
要創(chuàng)建多個瀏覽器,只需在提交給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');
});
驗證
通常,您將測試的頁面需要身份驗證。您可以使用Dusk的loginAs
方法,以避免在每次測試期間需要進行登錄操作。該loginAs
方法接收用戶ID或用戶模型實例:
$this->browse(function ($first, $second) {
$first->loginAs(User::find(1))
->visit('/home');
});
互動元素
點擊鏈接
要點擊鏈接,您可以使用瀏覽器實例上的clickLink
方法。該clickLink方法將單擊具有給定顯示文本的鏈接:
$browser->clickLink($linkText);
文本,值和屬性
檢索和設置值
Dusk提供了幾種方法來與頁面元素的當前顯示文本,值和屬性進行交互。
例如,要獲取與給定選擇器匹配的元素的“值”,請使用以下value
方法:
// Retrieve the value...
$value = $browser->value('selector');
// Set the value...
$browser->value('selector', 'value');
檢索文本
text
方法可用于檢索與給定選擇器匹配的元素的顯示文本:
$text = $browser->text('selector');
檢索屬性
最后,attribute
方法可用于檢索與給定選擇器匹配的元素的屬性:
$attribute = $browser->attribute('selector', 'value');
使用表單
鍵入值
Dusk提供了與表單和輸入元素交互的各種方法。
首先,我們來看一個在輸入字段中輸入文本的例子:
$browser->type('email', 'taylor@laravel.com');
請注意,盡管如果需要,該方法可以接收一個 CSS 選擇器 ,但我們不需要將CSS選擇器傳遞給type
方法。
如果沒有提供CSS選擇器,Dusk將搜索具有給定name
屬性的輸入字段。
最后,Dusk將試圖在給定的name屬性中找到一個textarea
。
您可以使用以下clear
方法“清除”輸入的值:
$browser->clear('email');
下拉列表
要在下拉列表框中選擇一個值,您可以使用該select
方法。和type
方法一樣,select
方法不需要一個完整的CSS選擇器。將值傳遞給select
方法時,您應該傳遞底層選項值而不是顯示文本:
$browser->select('size', 'Large');
您可以通過省略第二個參數(shù)來選擇一個隨機選項:
$browser->select('size');
(未完待續(xù)...)