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

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

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

前言

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

基本算法

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

  • 怎么獲取到登錄態(tài)
  • 頁面如何打開
  • 獲取到頁面的可點(diǎn)擊節(jié)點(diǎn)
  • 頁面的滑動(dòng),點(diǎn)擊,截圖等基礎(chǔ)功能
  • 頁面請(qǐng)求的攔截,識(shí)別
  • 頁面返回/退出

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

功能實(shí)現(xiàn)

登錄態(tài)

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

頁面打開

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

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)聽頁面請(qǐng)求數(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;
}

獲取頁面的可點(diǎn)擊點(diǎn)

拿到一個(gè)頁面之后我們需要獲取到他可點(diǎn)擊的點(diǎn)位信息,以便我們后續(xù)遍歷的時(shí)候操作,所以需要一個(gè)獲取頁面可點(diǎn)擊點(diǎn)的方法。實(shí)現(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;
    }
}

頁面的滑動(dòng),點(diǎn)擊,截圖等基礎(chǔ)功能

對(duì)于頁面的滑動(dòng),點(diǎn)擊和截圖,有專門的方法來實(shí)現(xiàn),代碼如下:

function screenshot( page,picName ){
    return new Promise((resolve, reject) => {
        setTimeout(async () => {
            var newPage=null;
            try {
                var buf=null;
                if( newPagePromise ){
                    console.log('新開了一個(gè)頁面');
                    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)
            }
        })
    })
}
// 元素點(diǎn)擊
await element.tap(2000);

頁面請(qǐng)求的攔截,識(shí)別

在執(zhí)行過程中頁面可能出現(xiàn)跳轉(zhuǎn),并且我們還需要監(jiān)聽頁面的請(qǐng)求來檢查是不是正常。實(shí)現(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('回到首頁出錯(cuò)!',e);
                 resolve(reloadPage(page,num))
             }
         })
     })
}

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

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

相關(guān)文章

  • Nest 復(fù)雜查詢示例解析

    Nest 復(fù)雜查詢示例解析

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

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

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

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

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

    Node多進(jìn)程的實(shí)現(xiàn)方法

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

    Node.js學(xué)習(xí)教程之Module模塊

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

    整理幾個(gè)關(guān)鍵節(jié)點(diǎn)深入理解nodejs

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

    nodejs log4js 使用詳解

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

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

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

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

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

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

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

最新評(píng)論

如皋市| 西华县| 石首市| 沙坪坝区| 西乌珠穆沁旗| 安溪县| 安陆市| 平泉县| 赤水市| 临颍县| 石河子市| 扎囊县| 河北区| 昌邑市| 黄陵县| 宝清县| 防城港市| 秀山| 扎兰屯市| 婺源县| 麟游县| 绵竹市| 资阳市| 晋江市| 肇州县| 布尔津县| 吉木萨尔县| 和硕县| 柞水县| 阳新县| 灌云县| 信阳市| 青浦区| 甘肃省| 南康市| 曲沃县| 石首市| 赞皇县| 青州市| 陕西省| 和政县|