亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

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

2024-05-06 16:48:17
字體:
來源:轉載
供稿:網友

起因

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

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

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

功能設定

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

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

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

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

Puppeteer,前端,自動化測試

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

Puppeteer

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

文檔地址

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

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

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

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

訪問一個帶有ba認證的網站

puppeteer可以創建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參數,來確定滿足什么條件才認為頁面跳轉完成。包括以下事件:

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

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

waitFor

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

// wait for selectorawait page.waitFor('.foo');// wait for 1 secondawait page.waitFor(1000);// wait for predicateawait page.waitFor(() => !!document.querySelector('.foo'));

我們可以利用waitForSelector方法,當登錄框渲染成功后,才進行登錄操作

// 等待密碼輸入框渲染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)// 獲取cookiesconst cookies = await page.cookies()

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

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

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

進行錯誤和訪問監聽

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

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

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

最終功能

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

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

-> 訪問頁面2 ...

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

// 包含基本的測試方法,log輸出等class Base {}// 詳情頁單元,進行一些基本的單元測試class PageDetal extends Base {}// 頁面單元,進行基本的單元測試,并獲取并依次訪問詳情頁class Page extends PageDetal {}// 進行登錄等操作,并依次訪問頁面單元進行測試class Root extends Base {}

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

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

// 1. 獲取測試單元的元素const timeSwitch = await page.$('[test-role="time-switch"]');// 若頁面沒有timeSwitch, 則不用進行測試if (!timeSwitch) return// 2. time switch的切換按鈕const buttons = timeSwitch.$$('.time-switch-button')// 3. 對按鈕進行循環點擊for (let i = 0; i < buttons.length; i++) { const button = buttons[i] // 點擊按鈕 await button.click() // 重點! 等待對應的內容出現時,才認定頁面訪問成功 try {  await page.waitFor('[test-role="time-switch-content"]') } catch (error) {  reportError (error) } // 截圖 await page.screenshot()}

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

總結

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

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
奇米成人av国产一区二区三区| 国产成人av在线播放| 国产成人在线精品| 日韩电影在线观看免费| 97视频在线观看网址| 日韩亚洲在线观看| 在线亚洲欧美视频| 国产美女高潮久久白浆| 91高清免费在线观看| 欧美视频在线观看 亚洲欧| 久久久久免费视频| 午夜精品理论片| 久久久精品视频在线观看| 91大神福利视频在线| 欧美精品18videosex性欧美| 日韩av黄色在线观看| 欧美理论在线观看| 一本大道香蕉久在线播放29| 国产精品久久9| 久久久在线免费观看| 久久久久久美女| 国产精品中文字幕久久久| 色综合色综合网色综合| 精品女同一区二区三区在线播放| 亚洲免费影视第一页| 精品夜色国产国偷在线| 在线国产精品视频| 国内伊人久久久久久网站视频| 欧美在线视频一二三| 精品久久久久久国产| 国产欧美日韩中文字幕在线| 亚洲韩国日本中文字幕| 日韩在线视频一区| 欧美激情精品久久久久久蜜臀| 狠狠躁夜夜躁人人爽天天天天97| 亚洲欧美激情视频| 欧美日韩国产丝袜美女| 国内精品久久久久影院 日本资源| 亚洲精品一区二区三区不| 精品视频中文字幕| 亚洲国产精品人久久电影| 91精品久久久久久久久久入口| 久久中文字幕在线视频| 这里只有精品在线观看| 成人黄色午夜影院| 欧美视频二区36p| 亚洲男人第一网站| 亚洲另类激情图| 亚洲色图狂野欧美| 欧美人与物videos| 亚洲国产精品久久久久秋霞蜜臀| 色哟哟入口国产精品| 久久99亚洲热视| 亚洲最大av在线| 欧美福利视频在线| 国产在线拍揄自揄视频不卡99| 国产亚洲人成a一在线v站| 亚洲激情在线视频| 国产日韩欧美电影在线观看| 国产在线视频一区| 69久久夜色精品国产69| 欧美成人精品在线| 少妇高潮久久久久久潘金莲| 韩国三级日本三级少妇99| 欧美二区乱c黑人| 国产成人精品久久| 国产日韩精品入口| 国产精品视频精品视频| 欧美疯狂xxxx大交乱88av| 热久久99这里有精品| 成人网在线观看| 国产精品成人av性教育| 欧美最顶级的aⅴ艳星| 97视频在线观看成人| 精品久久久久久久大神国产| 欧美日本在线视频中文字字幕| 性色av一区二区三区红粉影视| 欧美黑人巨大xxx极品| 高清欧美一区二区三区| 国产精品嫩草视频| 亚洲人成伊人成综合网久久久| 欧洲精品在线视频| 欧美福利视频在线观看| 韩国19禁主播vip福利视频| 欧美成年人视频| 欧美伊久线香蕉线新在线| 欧美日韩成人免费| 亚洲成人久久网| 日韩高清电影免费观看完整版| 欧美电影免费观看高清完整| 欧美国产日韩视频| 亚洲精品国产综合区久久久久久久| 中文字幕v亚洲ⅴv天堂| 久久精品99久久久久久久久| 亚洲欧美日韩高清| 欧美精品在线看| 国产www精品| 国产精品美女www| 国产欧美日韩免费| 欧美成aaa人片免费看| 欧美国产欧美亚洲国产日韩mv天天看完整| 在线免费观看羞羞视频一区二区| 在线看福利67194| 91色琪琪电影亚洲精品久久| 日韩免费观看视频| 日韩中文字幕欧美| 亚洲精品视频免费| 国产精品久久久久久久7电影| 日韩一区二区在线视频| 久久国产精品久久久| 日韩欧美成人区| 国产国语刺激对白av不卡| 亚洲福利视频久久| 欧美超级免费视 在线| 日产日韩在线亚洲欧美| 国产精品中文字幕在线| 一级做a爰片久久毛片美女图片| 国产精品入口免费视| 91欧美激情另类亚洲| 91在线视频免费| 18性欧美xxxⅹ性满足| 午夜精品福利在线观看| 中日韩美女免费视频网址在线观看| 38少妇精品导航| 日韩av中文字幕在线免费观看| 欧美国产精品va在线观看| 国产91精品久久久久久| 欧美情侣性视频| 国产精品视频xxxx| 亚洲欧美综合v| 狠狠色狠狠色综合日日小说| 日韩风俗一区 二区| 欧美另类99xxxxx| 欧美性猛交xxxx久久久| 美日韩在线视频| 亚洲精品电影网在线观看| 欧美日韩精品国产| 美日韩精品视频免费看| 欧美精品www| 欧美在线视频播放| 国产精品毛片a∨一区二区三区|国| 九九久久精品一区| 高潮白浆女日韩av免费看| 久久久女人电视剧免费播放下载| 北条麻妃一区二区三区中文字幕| 国产视频亚洲视频| 亚洲欧美日韩久久久久久| 欧美激情奇米色| 日韩av手机在线| 久久中文精品视频| 国产精品免费小视频| 亚洲第一页在线| 国产日韩在线亚洲字幕中文| 欧美电影《睫毛膏》| 欧美电影免费观看电视剧大全| 在线观看日韩欧美| 国产成人拍精品视频午夜网站| 欧美成人免费小视频| 91wwwcom在线观看| 日韩精品极品视频免费观看| 91国内揄拍国内精品对白| 久久免费在线观看| 久久精品亚洲精品| 国产精品高精视频免费|