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

使用Puppeteer實現(xiàn)頁面遍歷的示例代碼

 更新時間:2023年06月26日 11:40:48   作者:日拱一車  
很多時候我們需要遍歷我們的頁面來檢查頁面是否存在問題,以更好的保證可用性和安全性,下面就來講講如何使用puppeteer來實現(xiàn)頁面遍歷的功能吧

前言

很多時候我們需要遍歷我們的頁面來檢查頁面是否存在問題,以更好的保證可用性和安全性,所以遍歷一個給定頁面是比較通用的能力,是很多高級功能的基礎。下面就介紹怎么使用puppeteer來實現(xiàn)頁面遍歷的功能。

基本算法

實現(xiàn)頁面的遍歷功能,我們需要實現(xiàn)幾個基礎的方法,如下:

  • 怎么獲取到登錄態(tài)
  • 頁面如何打開
  • 獲取到頁面的可點擊節(jié)點
  • 頁面的滑動,點擊,截圖等基礎功能
  • 頁面請求的攔截,識別
  • 頁面返回/退出

上述能力實現(xiàn)之后,將他們組合起來,就可以實現(xiàn)一個頁面的遍歷功能,我們分別講解每個功能如何實現(xiàn)。

功能實現(xiàn)

登錄態(tài)

不同的帳號有不同的登錄方式,最通用的就是專門寫一個腳本來實現(xiàn)登錄功能。對于需要掃碼登錄的頁面,其實是從服務端獲取登錄token,可以直接調(diào)用服務端來獲?。ㄇ疤崾悄阕约旱臉I(yè)務)。否則就只能老老實實的通過腳本來實現(xiàn)了(在瀏覽器端實現(xiàn)腳本相對容易)。

頁面打開

puppeteer提供了專門的方法來打開頁面,我們只要初始化之后,調(diào)用這個功能就可以了。代碼如下:

async function openUrl( targetUrl ){
    //const browser = await puppeteer.connect(config.browserLaunchOptions);
    const browser = await puppeteer.launch(config.browserLaunchOptions);
    console.log("userAgent:"+JSON.stringify(await browser.userAgent()));
    const page = await browser.newPage();
    interactor(page)
    /**
     * 開啟監(jiān)聽頁面請求數(shù)據(jù)
     */
    await setPageWatcher(page);
    await page.emulate(config.pageEmulateOptions);
    await page.goto(targetUrl, {timeout:config.timeoutMillSeconds, waitUntil: config.waitUntilStr}).catch(err => {});
    await page.waitFor(10000);
    await waitForPageComplete(page,2);
    await setBrowserWatcher(browser);
    loginPageUrl = targetUrl;
    return page;
}

獲取頁面的可點擊點

拿到一個頁面之后我們需要獲取到他可點擊的點位信息,以便我們后續(xù)遍歷的時候操作,所以需要一個獲取頁面可點擊點的方法。實現(xiàn)如下:

async function getClickableElements( targetFrame ){
    try{
        let sections = await targetFrame.$$('[data-clickable=true],.tr-tabbar-item')
        return sections;
    } catch (e) {
        console.log(e);
        return null;
    }
}

頁面的滑動,點擊,截圖等基礎功能

對于頁面的滑動,點擊和截圖,有專門的方法來實現(xiàn),代碼如下:

function screenshot( page,picName ){
    return new Promise((resolve, reject) => {
        setTimeout(async () => {
            var newPage=null;
            try {
                var buf=null;
                if( newPagePromise ){
                    console.log('新開了一個頁面');
                    newPage = await newPagePromise;
                    await newPage.waitFor(6000);
                    var currentUrl=await newPage.url();
                    console.log("new-Page-Url:"+currentUrl);
                    if(currentUrl&&currentUrl.includes('https://login.xxx.com/login.htm?redirectURL=')){
                       currentUrl = currentUrl.replace('https://login.xxx.com/login.htm?redirectURL=',config.loginUrl);
                       console.log("newUrl="+currentUrl);
                        await openTargetUrl(newPage,currentUrl);
                    }
                    buf = await newPage.screenshot({
                    })
                    await newPage.close();
                    newPagePromise = null;
                    await page.bringToFront();
                } else {
                    buf = await page.screenshot({
                    })
                }
                if(buf){
                    console.log('截圖完成,開始上傳');
                    var picUrl =await util.uploadImageWithRetry(picName,buf);
                    console.log("截圖成功:"+picUrl);
                    resolve(picUrl)
                }
                resolve(null);
            } catch (e) {
                if (newPage) {
                    await newPage.close();
                }
                newPagePromise = null;
                await page.bringToFront();
                console.log(e);
                reject(null)
            }
        })
    })
}
// 元素點擊
await element.tap(2000);

頁面請求的攔截,識別

在執(zhí)行過程中頁面可能出現(xiàn)跳轉(zhuǎn),并且我們還需要監(jiān)聽頁面的請求來檢查是不是正常。實現(xiàn)如下:

function setPageWatcher(page) {
    page.on('requestfailed', error => {
       if(error.url()&&error.url().includes('https://login.xxx.com')){
           console.log("跳轉(zhuǎn)到了登錄頁面:"+error);
           needReLogin = true;
       }
    })
    page.on('error', (error) => {
        //console.log(chalk.red('?? whoops! there was an error'))
        //console.log(error)
    })
    page.on('pageerror', (error) => {
        //console.log(error)
    })
    page.on('response',(response) => {
        if( "image"==response.request().resourceType() && response.url() && response.headers()['content-length'] && response.headers()['content-length'] >200 ){
            allResource.push({
                size: response.headers()['content-length'],
                type: response.request().resourceType(),
                url: response.url()
            });
        }
    })
    page.on('dialog', async dialog => {
        console.log("dialog");
        await dialog.accept();
        console.log(dialog.message());
        //await dialog.dismiss();
    });
}

頁面返回/退出

代碼如下:

function pageBack( page, frameInfo,num ){
???????     console.log("開始回到首頁");
     return new Promise((resolve, reject) => {
         setTimeout(async () => {
             try {
                 let backIcons = await frameInfo.backIconFrame.$$('.backIcon');
                 if(backIcons.length>0&&!needReLogin){
                     try{
                         console.log("回到首頁");
                         await backIcons[0].tap(2000);
                         await page.waitFor(2000);
                         resolve(frameInfo);
                     }catch (e) {
                         resolve(reloadPage(page,num));
                     }
                 } else {
                     resolve(reloadPage(page,num));
                 }
             } catch (e) {
                 console.log('回到首頁出錯!',e);
                 resolve(reloadPage(page,num))
             }
         })
     })
}

以上基本功能就實現(xiàn)了,歡迎交流

以上就是使用Puppeteer實現(xiàn)頁面遍歷的示例代碼的詳細內(nèi)容,更多關于Puppeteer頁面遍歷的資料請關注腳本之家其它相關文章!

相關文章

  • Nest 復雜查詢示例解析

    Nest 復雜查詢示例解析

    這篇文章主要為大家介紹了Nest 復雜查詢示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 使用nodejs連接mySQL寫接口全過程(增刪改查)

    使用nodejs連接mySQL寫接口全過程(增刪改查)

    這篇文章主要給大家介紹了關于使用nodejs連接mySQL寫接口(增刪改查)的相關資料,MySQL是一種常用的關系型數(shù)據(jù)庫,它與Node.js的結(jié)合可以提供強大的數(shù)據(jù)存儲和檢索功能,需要的朋友可以參考下
    2023-12-12
  • 基于Node.js實現(xiàn)大文件斷點續(xù)傳的完整方案

    基于Node.js實現(xiàn)大文件斷點續(xù)傳的完整方案

    本文介紹了Vue前端和Node.js后端實現(xiàn)大文件斷點續(xù)傳的方法,前端通過分片上傳、計算文件哈希、記錄已上傳分片索引實現(xiàn)斷點續(xù)傳;后端提供檢查和上傳分片、合并文件的接口,通過并發(fā)控制、錯誤重試等技術提高上傳效率和穩(wěn)定性,需要的朋友可以參考下
    2026-04-04
  • Node多進程的實現(xiàn)方法

    Node多進程的實現(xiàn)方法

    我們都知道?Node.js?是以單線程的模式運行的,但它使用的是事件驅(qū)動來處理并發(fā),這樣有助于我們在多核?cpu?的系統(tǒng)上創(chuàng)建多個子進程,從而提高性能
    2022-08-08
  • Node.js學習教程之Module模塊

    Node.js學習教程之Module模塊

    這篇文章主要給大家介紹了關于Node.js學習教程之Module模塊的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Node.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • 整理幾個關鍵節(jié)點深入理解nodejs

    整理幾個關鍵節(jié)點深入理解nodejs

    這篇文章主要介紹了整理幾個關鍵節(jié)點深入理解nodejs,文章圍繞主題展開詳細的內(nèi)容介紹,需要的小伙伴可以參考一下,需要的小伙伴可以參考一下
    2022-07-07
  • nodejs log4js 使用詳解

    nodejs log4js 使用詳解

    這篇文章主要介紹了nodejs log4js 使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Node.js包管理器npm的具體使用

    Node.js包管理器npm的具體使用

    Node.js安裝包中都帶有一個重要的工具 包管理器npm,本文主要介紹了Node.js包管理器npm的具體使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法

    在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法

    這篇文章主要介紹了在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • Node.js API詳解之 readline模塊用法詳解

    Node.js API詳解之 readline模塊用法詳解

    這篇文章主要介紹了Node.js API詳解之 readline模塊用法,結(jié)合實例形式詳細分析了Node.js API中readline模塊基本函數(shù)、功能、用法及操作注意事項,需要的朋友可以參考下
    2020-05-05

最新評論

饶阳县| 太和县| 开封市| 新晃| 四子王旗| 山东省| 讷河市| 六枝特区| 深圳市| 龙州县| 桂林市| 团风县| 临猗县| 隆安县| 陆丰市| 车致| 临安市| 屏边| 绍兴县| 天台县| 赤城县| 乌拉特中旗| 微博| 抚顺县| 五常市| 乌兰察布市| 宁海县| 贡嘎县| 麟游县| 清涧县| 九寨沟县| 井研县| 高要市| 山东省| 思南县| 丹阳市| 和平区| 星子县| 满城县| 祥云县| 隆回县|