Laravel 5.4 -- Laravel Dusk(更新中)

介紹

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

運行測試

要運行瀏覽器測試,請使用duskArtisan命令:

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)建瀏覽器.png

創(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);
點擊鏈接.png

文本,值和屬性

檢索和設置值

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ù)...)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容