成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Puppeteer前端自動(dòng)化測試的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Puppeteer前端自動(dòng)化測試的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Puppeteer前端自動(dòng)化測試的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)核心團(tuán)隊(duì)10余年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗(yàn),為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。

起因

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

  1. 在進(jìn)行代碼和功能改動(dòng)后,能夠自動(dòng)訪問各個(gè)功能的頁面,檢測問題

  2. 針對(duì)大量的數(shù)據(jù)內(nèi)容,進(jìn)行批量訪問,檢測對(duì)于不同數(shù)據(jù)的展示是否存在問題

  3. 測試與代碼功能盡量不耦合,避免每次上新功能都需要對(duì)測試用例進(jìn)行修改,維護(hù)成本太大

  4. 定期的測試任務(wù),及時(shí)發(fā)現(xiàn)數(shù)據(jù)平臺(tái)針對(duì)新數(shù)據(jù)的展示完備性

其中,最重要的問題,就是將測試代碼與功能解耦,避免每次迭代和修改都需要追加新的測試用例。我們?nèi)绾巫龅竭@一點(diǎn)呢?首先我們來梳理下測試平臺(tái)的功能。

功能設(shè)定

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

  1. 依次訪問各個(gè)頁面

  2. 訪問各個(gè)頁面的具體內(nèi)容,如時(shí)間切換、選項(xiàng)卡切換、分頁切換、表格展開行等等

  3. 針對(duì)數(shù)據(jù)表格中的詳情鏈接,選擇前100條進(jìn)行訪問,并進(jìn)行下鉆頁的繼續(xù)測試

  4. 捕獲在頁面中的錯(cuò)誤請(qǐng)求

  5. 對(duì)錯(cuò)誤信息進(jìn)行捕獲,統(tǒng)計(jì)和上報(bào)

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

  • 頁面單元,檢測各功能頁面訪問的穩(wěn)定性

  • 詳情頁單元,根據(jù)頁面的數(shù)據(jù)列表,進(jìn)行批量的詳情頁跳轉(zhuǎn),檢測不同參數(shù)下詳情頁的穩(wěn)定性

  • 功能單元,用于檢測頁面和詳情頁各種展示類型點(diǎn)擊切換后是否產(chǎn)生錯(cuò)誤

Puppeteer前端自動(dòng)化測試的示例分析

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

Puppeteer

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

文檔地址

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

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

  • 訪問頁面,進(jìn)行截圖

  • 自動(dòng)進(jìn)行鍵盤輸入,提交表單

  • 模擬點(diǎn)擊等用戶操作

  • 等等等等。。

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

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

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

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

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

訪問登陸頁面,并進(jìn)行登錄

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

waitUntil

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

  • load - 頁面的load事件觸發(fā)時(shí)

  • domcontentloaded - 頁面的DOMContentLoaded事件觸發(fā)時(shí)

  • networkidle0 - 不再有網(wǎng)絡(luò)連接時(shí)觸發(fā)(至少500毫秒后)

  • networkidle2 - 只有2個(gè)網(wǎng)絡(luò)連接時(shí)觸發(fā)(至少500毫秒后)

通過waitUnitl,我們可以當(dāng)頁面請(qǐng)求都完成之后,確定頁面已經(jīng)訪問完成。

waitFor

waitFor方法可以在指定動(dòng)作完成后才進(jìn)行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方法,當(dāng)?shù)卿浛蜾秩境晒?,才進(jìn)行登錄操作

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

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

await page.waitFor(2000)

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

針對(duì)列表內(nèi)容里的鏈接進(jìn)行批量訪問

主要利用到page實(shí)例的選擇器功能

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

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

進(jìn)行錯(cuò)誤和訪問監(jiān)聽

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

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

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

最終功能

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

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

-> 訪問頁面2 ...

所以,我們可以拆分出幾個(gè)大類,和幾個(gè)測試單元,來進(jìn)行各項(xiàng)測試

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

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

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

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

同時(shí),我們?nèi)绾卧诠δ茼撁孀兓瘯r(shí),跟蹤到測試的變化呢,我們可以針對(duì)我們測試的功能,為其添加自定義標(biāo)簽test-role,測試時(shí),根據(jù)自定義標(biāo)簽進(jìn)行測試邏輯的編寫。

例如針對(duì)時(shí)間切換單元,我們做一下簡單的介紹:

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

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

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

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

 // 點(diǎn)擊按鈕
 await button.click()

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

 // 截圖
 await page.screenshot()
}

上面只是進(jìn)行了一個(gè)簡單的訪問內(nèi)容測試,我們可以根據(jù)我們的用例單元書寫各自的測試邏輯,在我們?nèi)粘i_發(fā)時(shí),只需要對(duì)需要測試的內(nèi)容,加上對(duì)應(yīng)的test-role即可。

以上是“Puppeteer前端自動(dòng)化測試的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文標(biāo)題:Puppeteer前端自動(dòng)化測試的示例分析-創(chuàng)新互聯(lián)
標(biāo)題來源:http://jinyejixie.com/article16/djesdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站內(nèi)鏈、微信小程序、自適應(yīng)網(wǎng)站、ChatGPT小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
三都| 龙里县| 平远县| 隆回县| 广东省| 利津县| 曲阜市| 社会| 陇川县| 公安县| 体育| 正镶白旗| 玉溪市| 平陆县| 京山县| 新平| 绍兴市| 清远市| 西畴县| 当阳市| 金山区| 射阳县| 扬中市| 华宁县| 金川县| 黄冈市| 团风县| 进贤县| 滨海县| 英吉沙县| 三江| 日喀则市| 金塔县| 双流县| 穆棱市| 耿马| 孝感市| 鄂伦春自治旗| 马边| 潜江市| 北京市|