我們把等待加載的 API 分為三類進行介紹。
一、加載導航頁面
page.goto:打開新頁面
page.goBack :回退到上一個頁面
page.goForward :前進到下一個頁面
page.reload :重新加載頁面
page.waitForNavigation:等待頁面跳轉
Pupeeteer 中的基本上所有的操作都是異步的,以上幾個 API 都涉及到關於打開一個頁面,什么情況下才能判斷這個函數執行完畢呢,這些函數都提供了兩個參數 waitUtil 和 timeout。
waitUtil 表示直到什么出現就算執行完畢;
timeout 表示如果超過這個時間還沒有結束就拋出異常。
使用示例
await page.goto('https://www.baidu.com', { timeout: 30 * 1000, waitUntil: [ 'load', //等待 “load” 事件觸發 'domcontentloaded', //等待 “domcontentloaded” 事件觸發 'networkidle0', //在 500ms 內沒有任何網絡連接 'networkidle2' //在 500ms 內網絡連接個數不超過 2 個 ] });
以上 waitUtil 有四個事件,業務可以根據需求來設置其中一個或者多個觸發才以為結束,networkidle0 和 networkidle2 中的 500ms 對時間性能要求高的用戶來說,還是有點長的
二、等待元素、請求、響應
page.waitForXPath:等待 xPath 對應的元素出現,返回對應的 ElementHandle 實例
page.waitForSelector :等待選擇器對應的元素出現,返回對應的 ElementHandle 實例
page.waitForResponse :等待某個響應結束,返回 Response 實例
page.waitForRequest:等待某個請求出現,返回 Request 實例
使用示例
await page.waitForXPath('//img'); await page.waitForSelector('#uniqueId'); await page.waitForResponse('https://d.youdata.netease.com/api/dash/hello'); await page.waitForRequest('https://d.youdata.netease.com/api/dash/hello');
三、自定義等待
如果上面提供的等待方式都不能滿足我們的需求,puppeteer 還提供我們提供兩個函數:
page.waitForFunction:等待在頁面中自定義函數的執行結果,返回 JsHandle 實例
page.waitFor:設置選擇器 或者 方法 或者 等待時間
使用示例:
await page.goto(url, { timeout: 120000, waitUntil: 'networkidle2' }); //可以在頁面中定義自己認為加載完的事件,在合適的時間點我們將該事件設置為 true //以下是我們項目在觸發截圖時的判斷邏輯,如果 renderdone 出現且為 true 那么就截圖,如果是 Object,說明頁面加載出錯了,我們可以捕獲該異常進行提示 let renderdoneHandle = await page.waitForFunction('window.renderdone', { polling: 120 }); const renderdone = await renderdoneHandle.jsonValue(); if (typeof renderdone === 'object') { console.log(`加載頁面失敗:報表${renderdone.componentId}出錯 -- ${renderdone.message}`); }else{ console.log('頁面加載成功'); }