1. 程式人生 > 程式設計 >分析五個Laravel Dusk的使用技巧

分析五個Laravel Dusk的使用技巧

1. 填充隱藏欄位

在測試某些 js 元件時 (例如自動完成,日期選擇器等) ,可能需要編寫動作模擬操作與這些元件互動。猶豫這些元件中的大多數最終都會將值儲存到隱藏欄位中。那麼將值直接填寫到隱藏欄位中可能更加方便。這可以防止不穩定的測試,並確保我們不測試自己不擁有 / 控制的東西 (第三方元件)。

儘管 Laravel Dusk 沒有為我們提供類似$browser->fillHidden($field,$value)的方法,但我們可以使用Dusk Browser Macros來實現。

//將以下程式碼新增到 serviceprovider.php 中
 
Browser::macro('fillHidden',function ($name,$value) {
    $this->script("document.getElementsByName('$name')[0].value = '$value'");
    return $this;
});
 
// 然後你可以像這樣使用
 
/** @test */
public function fill_hidden_fields()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('https://website.com/form')
                ->type('input.name',$name)
                ->type('input.address',$address)
                ->fillHidden('checkin_date',$date)
                ->click('#Submit')
                ->waitForText('Orders');
    });
}

2. 模擬 HTML 地理位置

我曾經不得不http://www.cppcns.com測試一個頁面,該頁面需要 HTML 網站提供地理位置,以便它可以顯示一些結果。沒有可用的直接模擬方法,因此我不得不重寫 getCurrentPosition 方法,該方法最終將由頁面呼叫。

/** @test */
public function test_geo_location()
{
    $faker = Faker\Factory::create();
    $latitude = $faker->latitude;
    $longitude = $faker->longitude;
 
    $this->browse(function (Browser $browser) use($latitude,$longitude) {
        $browser->visit(new Homepage)
            ->assertOnPage();
 
        $browser->driver->executeScript(
            "window.navigator.geolocation.getCurrentPosition = function(onSuccessCallback) {
                var position = {
                    'coords': { 'latitude': {$latitude},'longitude': {$longitude} }
                };
                onSuccessCallback(position);
            }"
        );
 
        $browser->click('#geolocate-button')
                ->assertSee('Longitude: $longitude')
                ->assertSee('Latitude: Latitude')
    });
}

3. 使用 XPath 選擇器

有時,我會遇到無法使用 css 選擇器來定位元素的情況。這些通常發生在動態表格中,或者在我無法修改的第三方 js 元件中。但是,Laravel Dusk 不直接支援 XPath 選擇器,並且經常需要訪問基礎 WebDriver 例項。

$browser->driver->findElement( WebDriverBy::xpath("//table[@class=程式設計客棧'x-grid3-row-table']/tbody/tr/td/div/a[contains(text(),'$value')]") )
                ->click();

這種方法的唯一問題就是 [問題不大] 可能會終端$browser鏈式呼叫.*

4. 整頁截圖

Laravel dusks 為我們提供了失敗測試的螢幕截圖,這對於瞭解測試失敗的原因非常有幫助。但是,有時錯誤或有問題的元素可能在螢幕顯示區域以外。

要在 Laravel Dusk 中建立完整的螢幕截圖,我們必須在我們的 tests \ DuskTestCase.php 中建立一個 captureFailuresFor() 方法,它將覆蓋最初在 Laravel\Dusk\Concerns\ProvidesBrowser 中定義的一個方法。

protected function captureFailuresFor($browsers)
{
    $browsers->each(function (Browser $browser,$key) {
        $body = $browser->driver->findElement(WebDriverBy::tagName('body'));
        if (!empty($body)) {
            $currentSize = $body->getSize();
            $size = new WebDriverDimension($currentSize->getWidth(),$currentSize->getHeight());
            $browser->driver->manage()->window()->setSize($size);
        }
        $name =imBqECBIG str_replace('\\','_',get_class($this)).'_'.$this->getName(false);
 
        $browser->screenshot('failure-'.$name.'-'.$key);
    });
}

現在,無論何時我們呼叫$browser->screenshot('$shotname'),發生錯誤時我們都將獲得完整的螢幕截圖

5. 訪問瀏覽器錯誤日誌

這個沒什麼問題,只是我發現的一些有趣的東西。我們可以通過呼叫 $browser->driver->manage()->getLog(‘browser') 來訪問瀏覽器控制檯日誌。

http://www.cppcns.com

這將在瀏覽器的控制檯中返回一系列日誌。例如,對於頁面上沒有 javascript 錯誤的測試而言,它可能很有用。

@test
public function no_browser_errors()
{
    $this->browse(function ($browser) {
        $this-&程式設計客棧gt;assertEmpty($browser->driver->manage()->getLog('browser'));
    });
}

但是請注意,它不包含console.log呼叫的輸出

以上就是分析五個Laravel Dusk的使用技巧的詳細內容,更多關於五個Laravel Dusk的使用技巧的資料請關注我們其它相關文章!