最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Puppeteer前端自動化測試實踐

 更新時間:2019年02月21日 09:27:02   作者:Athon  
這篇文章主要介紹了詳解Puppeteer前端自動化測試實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

起因

目前我們在持續(xù)開發(fā)著一個幾十個頁面,十萬+行代碼的項目,隨著產品的更迭,總會出現(xiàn)這樣的問題。在對某些業(yè)務邏輯或者功能進行添加或者修改的時候(尤其是通用邏輯),這些通用的邏輯或者組件往往會牽扯到一些其他地方的問題。由于測試人員受限,我們很難在完成一個模塊單元后,對所有功能重新測試一遍。
同時,由于環(huán)境及數(shù)據(jù)的區(qū)別,(以及在開發(fā)過程中對代碼完備性的疏忽),代碼會在某些特殊數(shù)據(jù)的解析和和展示上出現(xiàn)問題,在開發(fā)和測試中很難去發(fā)現(xiàn)??偟膩碚f,我們希望有一個這樣的工具,幫我們解決上述幾個問題:

  1. 在進行代碼和功能改動后,能夠自動訪問各個功能的頁面,檢測問題
  2. 針對大量的數(shù)據(jù)內容,進行批量訪問,檢測對于不同數(shù)據(jù)的展示是否存在問題
  3. 測試與代碼功能盡量不耦合,避免每次上新功能都需要對測試用例進行修改,維護成本太大
  4. 定期的測試任務,及時發(fā)現(xiàn)數(shù)據(jù)平臺針對新數(shù)據(jù)的展示完備性

其中,最重要的問題,就是將測試代碼與功能解耦,避免每次迭代和修改都需要追加新的測試用例。我們如何做到這一點呢?首先我們來梳理下測試平臺的功能。

功能設定

由于我們的平臺主要是進行數(shù)據(jù)展示,所以我們在測試過程中,主要以日常的展示數(shù)據(jù)為重心即可,針對一些復雜的表單操作先不予處理。針對上述的幾個問題,我們針對自動化測試工具的功能如下:

  1. 依次訪問各個頁面
  2. 訪問各個頁面的具體內容,如時間切換、選項卡切換、分頁切換、表格展開行等等
  3. 針對數(shù)據(jù)表格中的詳情鏈接,選擇前100條進行訪問,并進行下鉆頁的繼續(xù)測試
  4. 捕獲在頁面中的錯誤請求
  5. 對錯誤信息進行捕獲,統(tǒng)計和上報

根據(jù)以上的梳理,我們可以把整個應用分為幾個測試單元

  • 頁面單元,檢測各功能頁面訪問的穩(wěn)定性
  • 詳情頁單元,根據(jù)頁面的數(shù)據(jù)列表,進行批量的詳情頁跳轉,檢測不同參數(shù)下詳情頁的穩(wěn)定性
  • 功能單元,用于檢測頁面和詳情頁各種展示類型點擊切換后是否產生錯誤

通過這樣的劃分,我們針對各個單元進行具體的測試邏輯書寫用例,這樣就可以避免再添加新功能和頁面時,頻繁對測試用例進行修改了。

Puppeteer

帶著上面我們的需求,我們來看下Puppeteer的功能和特性,是否能夠滿足我們的要求。

文檔地址

Puppeteer是一個Node庫,它提供了一個高級 API 來通過 DevTools 協(xié)議控制 Chromium 或 Chrome。Puppeteer 默認以 headless 模式運行,但是可以通過修改配置文件運行“有頭”模式。

我們可以使用Puppeteer完成以下工作:

  • 訪問頁面,進行截圖
  • 自動進行鍵盤輸入,提交表單
  • 模擬點擊等用戶操作
  • 等等等等。。

我們來通過一些小案例,來介紹他們的基本功能:

訪問一個帶有ba認證的網(wǎng)站

puppeteer可以創(chuàng)建page實例,并使用goto方法進行頁面訪問,page包含一系列方法,可以對頁面進行各種操作。

(async () => {
 const browser = await puppeteer.launch();
 const page = await browser.newPage();
 // ba認證
 await page.authenticate({
  username,
  password
 });
 // 訪問頁面
 await page.goto('https://example.com');
 // 進行截圖
 await page.screenshot({path: 'example.png'});

 await browser.close();
})();

訪問登陸頁面,并進行登錄

首先,對于SPA(單頁面應用),我們都知道,當頁面進入后,客戶端代碼才開始進行渲染工作。我們需要等到頁面內容渲染完成后,再進行對應的操作。我們有以下幾種方法來使用

waitUntil

puppeteer針對頁面的訪問,切換等,提供了waitUntil參數(shù),來確定滿足什么條件才認為頁面跳轉完成。包括以下事件:

  • load - 頁面的load事件觸發(fā)時
  • domcontentloaded - 頁面的DOMContentLoaded事件觸發(fā)時
  • networkidle0 - 不再有網(wǎng)絡連接時觸發(fā)(至少500毫秒后)
  • networkidle2 - 只有2個網(wǎng)絡連接時觸發(fā)(至少500毫秒后)

通過waitUnitl,我們可以當頁面請求都完成之后,確定頁面已經訪問完成。

waitFor

waitFor方法可以在指定動作完成后才進行resolve

// wait for selector
await page.waitFor('.foo');
// wait for 1 second
await page.waitFor(1000);
// wait for predicate
await page.waitFor(() => !!document.querySelector('.foo'));

我們可以利用waitForSelector方法,當?shù)卿浛蜾秩境晒?,才進行登錄操作

// 等待密碼輸入框渲染
await page.waitFor('#password');
// 輸入用戶名
await page.type('input#username', "username");
// 輸入密碼
await page.type('input#password', "testpass");

// 點擊登錄按鈕
await Promise.all([
 page.waitForNavigation(), // 等跳轉完成后resolve
 page.click('button.login-button'), // 點擊該鏈接將間接導致導航(跳轉)
]);

await page.waitFor(2000)

// 獲取cookies
const cookies = await page.cookies()

針對列表內容里的鏈接進行批量訪問

主要利用到page實例的選擇器功能

const table = await page.$('.table')
const links = await table.$$eval('a.link-detail', links =>
 links.map(link => link.href)
);

// 循環(huán)訪問links
...

進行錯誤和訪問監(jiān)聽

puppeteer可以監(jiān)聽在頁面訪問過程中的報錯,請求等等,這樣我們就可以捕獲到頁面的訪問錯誤并進行上報啦,這也是我們進行測試需要的基本功能~

// 當發(fā)生頁面js代碼沒有捕獲的異常時觸發(fā)。
page.on('pagerror', () => {})
// 當頁面崩潰時觸發(fā)。
page.on('error', () => {})
// 當頁面發(fā)送一個請求時觸發(fā)
page.on('request')
// 當頁面的某個請求接收到對應的 response 時觸發(fā)。
page.on('response')

通過以上的幾個小案例,我們發(fā)現(xiàn)Puppeteer的功能非常強大,完全能夠滿足我們以上的對頁面進行自動訪問的需求。接下來,我們針對我們的測試單元進行個單元用例的書寫

最終功能

通過我們上面對測試單元的規(guī)劃,我們可以規(guī)劃一下我們的測試路徑

訪問網(wǎng)站 -> 登陸 -> 訪問頁面1 -> 進行基本單元測試 -> 獲取詳情頁跳轉鏈接 -> 依次訪問詳情頁 -> 進行基本單元測試

-> 訪問頁面2 ...

所以,我們可以拆分出幾個大類,和幾個測試單元,來進行各項測試

// 包含基本的測試方法,log輸出等
class Base {}

// 詳情頁單元,進行一些基本的單元測試
class PageDetal extends Base {}

// 頁面單元,進行基本的單元測試,并獲取并依次訪問詳情頁
class Page extends PageDetal {}

// 進行登錄等操作,并依次訪問頁面單元進行測試
class Root extends Base {}

同時,我們如何在功能頁面變化時,跟蹤到測試的變化呢,我們可以針對我們測試的功能,為其添加自定義標簽test-role,測試時,根據(jù)自定義標簽進行測試邏輯的編寫。

例如針對時間切換單元,我們做一下簡單的介紹:

// 1. 獲取測試單元的元素
const timeSwitch = await page.$('[test-role="time-switch"]');

// 若頁面沒有timeSwitch, 則不用進行測試
if (!timeSwitch) return

// 2. time switch的切換按鈕
const buttons = timeSwitch.$$('.time-switch-button')

// 3. 對按鈕進行循環(huán)點擊
for (let i = 0; i < buttons.length; i++) {
 const button = buttons[i]

 // 點擊按鈕
 await button.click()

 // 重點! 等待對應的內容出現(xiàn)時,才認定頁面訪問成功
 try {
  await page.waitFor('[test-role="time-switch-content"]')
 } catch (error) {
  reportError (error)
 }

 // 截圖
 await page.screenshot()
}

上面只是進行了一個簡單的訪問內容測試,我們可以根據(jù)我們的用例單元書寫各自的測試邏輯,在我們日常開發(fā)時,只需要對需要測試的內容,加上對應的test-role即可。

總結

根據(jù)以上的功能劃分,我們很好的將一整個應用拆分成各個測試單元進行單元測試。需要注意的是,我們目前僅僅是對頁面的可訪問性進行測試,僅僅驗證當用戶進行各種操作,訪問各個頁面單元時頁面是否會出錯。并沒有對頁面的具體展示效果進行測試,這樣會和頁面的功能內容耦合起來,就需要單獨的測試用例的編寫了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • nodejs個人博客開發(fā)第七步?后臺登陸

    nodejs個人博客開發(fā)第七步?后臺登陸

    這篇文章主要為大家詳細介紹了nodejs個人博客開發(fā)的后臺登陸功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Node解決簡單重復問題系列之Excel內容的獲取

    Node解決簡單重復問題系列之Excel內容的獲取

    這篇文章主要給大家介紹了關于利用Node解決簡單重復問題系列之Excel內容獲取的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧。
    2018-01-01
  • Windows下Node.js安裝及環(huán)境配置方法

    Windows下Node.js安裝及環(huán)境配置方法

    這篇文章主要為大家介紹一下Node.js安裝及環(huán)境配置方法,這也是腳本之家小編發(fā)現(xiàn)的比較詳細的教程了,從安裝到配置都很詳細,想學習Node.js的朋友可以參考一下
    2017-09-09
  • 150行Node.js實現(xiàn)的dns代理工具

    150行Node.js實現(xiàn)的dns代理工具

    這篇文章主要介紹了150行Node.js實現(xiàn)的dns代理工具,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 對node通過fs模塊判斷文件是否是文件夾的實例講解

    對node通過fs模塊判斷文件是否是文件夾的實例講解

    今天小編就為大家分享一篇對node通過fs模塊判斷文件是否是文件夾的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • NodeJS中配置請求代理服務器方式

    NodeJS中配置請求代理服務器方式

    這篇文章主要介紹了NodeJS中配置請求代理服務器方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Nodejs實現(xiàn)爬蟲抓取數(shù)據(jù)實例解析

    Nodejs實現(xiàn)爬蟲抓取數(shù)據(jù)實例解析

    這篇文章主要介紹了Nodejs實現(xiàn)爬蟲抓取數(shù)據(jù)實例解析,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • 淺談Node.js輕量級Web框架Express4.x使用指南

    淺談Node.js輕量級Web框架Express4.x使用指南

    本篇文章主要介紹了淺談Node.js輕量級Web框架Express4.x使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • node腳本實現(xiàn)自動化簽到和抽獎功能

    node腳本實現(xiàn)自動化簽到和抽獎功能

    本文主要介紹了node腳本實現(xiàn)自動化簽到和抽獎功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 從零開始學習Node.js

    從零開始學習Node.js

    這篇文章主要介紹了從零開始學習Node.js結合具體實例形式分析了使用方法與相關注意事項,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09

最新評論

富顺县| 孟津县| 龙门县| 安塞县| 唐山市| 元阳县| 福清市| 农安县| 肃南| 扬中市| 宁乡县| 彭州市| 息烽县| 社旗县| 西充县| 邵武市| 朔州市| 拉孜县| 达日县| 都兰县| 蓬莱市| 城步| 贵德县| 额敏县| 加查县| 修武县| 兰溪市| 康定县| 晋中市| 奉节县| 新闻| 河南省| 如东县| 洞口县| 六安市| 自贡市| 财经| 阜宁县| 新宁县| 青海省| 巩留县|