目錄
- 1. 填充隱藏字段
- 2. 模擬 HTML 地理位置
- 3. 使用 XPath 選擇器
- 4. 整頁截屏
- 5. 訪問瀏覽器錯誤日志
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 地理位置
我曾經不得不測試一個頁面,該頁面需要 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("http://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 = str_replace('\\', '_', get_class($this)).'_'.$this->getName(false);
$browser->screenshot('failure-'.$name.'-'.$key);
});
}
現在,無論何時我們調用$browser->screenshot('$shotname'),發生錯誤時我們都將獲得完整的屏幕截圖
5. 訪問瀏覽器錯誤日志
這個沒什么問題,只是我發現的一些有趣的東西。我們可以通過調用 $browser->driver->manage()->getLog(‘browser') 來訪問瀏覽器控制臺日志。
這將在瀏覽器的控制臺中返回一系列日志。例如,對于頁面上沒有 javascript 錯誤的測試而言,它可能很有用。
@test
public function no_browser_errors()
{
$this->browse(function ($browser) {
$this->assertEmpty($browser->driver->manage()->getLog('browser'));
});
}
但是請注意,它不包含console.log調用的輸出
以上就是分析五個Laravel Dusk的使用技巧的詳細內容,更多關于五個Laravel Dusk的使用技巧的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- 淺談Laravel中使用Slack進行異常通知
- 如何用Laravel包含你自己的幫助函數
- 詳解Laravel框架的依賴注入功能
- php+laravel 掃碼二維碼簽到功能
- laravel的數據表填充器使用詳解
- laravel ajax curd 搜索登錄判斷功能的實現
- Laravel中Kafka的使用詳解
- laravel使用redis隊列實例講解
- Laravel的加密解密與哈希實例講解
- Laravel中10個有用的用法小結