亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用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,可以直接調用服務端來獲?。ㄇ疤崾悄阕约旱臉I(yè)務)。否則就只能老老實實的通過腳本來實現(xiàn)了(在瀏覽器端實現(xiàn)腳本相對容易)。

頁面打開

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

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ù)據
     */
    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)跳轉,并且我們還需要監(jiān)聽頁面的請求來檢查是不是正常。實現(xiàn)如下:

function setPageWatcher(page) {
    page.on('requestfailed', error => {
       if(error.url()&&error.url().includes('https://login.xxx.com')){
           console.log("跳轉到了登錄頁面:"+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)頁面遍歷的示例代碼的詳細內容,更多關于Puppeteer頁面遍歷的資料請關注腳本之家其它相關文章!

相關文章

  • Node.js中fs模塊實現(xiàn)配置文件的讀寫操作

    Node.js中fs模塊實現(xiàn)配置文件的讀寫操作

    在Node.js中, fs模塊提供了對文件系統(tǒng)的訪問功能,我們可以利用它來實現(xiàn)配置文件的讀取和寫入操作,這篇文章主要介紹了Node.js中fs模塊實現(xiàn)配置文件的讀寫,需要的朋友可以參考下
    2024-04-04
  • 如何使用puppet替換文件中的string

    如何使用puppet替換文件中的string

    今天小編就為大家分享一篇關于如何使用puppet替換文件中的string,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 利用node.js搭建簡單web服務器的方法教程

    利用node.js搭建簡單web服務器的方法教程

    本文主題是使用node來搭建最簡單的web服務器,其后可以自己根據需要深入了解,目前在開發(fā)過程中可以用來模擬與服務器進行簡單的交互,比如返回的資源控制等。需要的朋友可以參考學習,下面來一起看看吧。
    2017-02-02
  • Vue+Node服務器查詢Mongo數(shù)據庫及頁面數(shù)據傳遞操作實例分析

    Vue+Node服務器查詢Mongo數(shù)據庫及頁面數(shù)據傳遞操作實例分析

    這篇文章主要介紹了Vue+Node服務器查詢Mongo數(shù)據庫及頁面數(shù)據傳遞操作,結合實例形式分析了node.js查詢MongoDB數(shù)據庫及vue前臺頁面渲染等相關操作技巧,需要的朋友可以參考下
    2019-12-12
  • nodejs對express中next函數(shù)的一些理解

    nodejs對express中next函數(shù)的一些理解

    這篇文章主要介紹了nodejs對express中next函數(shù)的一些理解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 使用Node.js實現(xiàn)base64和png文件相互轉換的方法

    使用Node.js實現(xiàn)base64和png文件相互轉換的方法

    這篇文章主要介紹了使用Node.js實現(xiàn)base64和png文件相互轉換的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 帶你了解NodeJS事件循環(huán)

    帶你了解NodeJS事件循環(huán)

    這篇文章主要介紹NodeJS事件循環(huán),Node中代碼從上到下同步執(zhí)行,在執(zhí)行過程中會將不同的任務添加到相應的隊列中,那具體有的循環(huán)又是怎么回事呢,限免現(xiàn)編就帶大家學習該詳細內容,需要的朋友也可以參考一下
    2022-02-02
  • node.js使用express-fileupload中間件實現(xiàn)文件上傳

    node.js使用express-fileupload中間件實現(xiàn)文件上傳

    本文使用express作為服務端,使用express-fileupload庫提供的中間件函數(shù)來接受從客戶端傳來的圖片,并將圖片作為文件存儲在服務端,感興趣的可以了解一下
    2021-07-07
  • nodejs獲取微信小程序帶參數(shù)二維碼實現(xiàn)代碼

    nodejs獲取微信小程序帶參數(shù)二維碼實現(xiàn)代碼

    這篇文章主要介紹了nodejs獲取微信小程序帶參數(shù)二維碼實現(xiàn)代碼的相關資料,需要的朋友可以參考下
    2017-04-04
  • 一文詳解如何在IDEA中配置Node.js

    一文詳解如何在IDEA中配置Node.js

    idea中支持運行很多種編程語言,只需要在電腦中安裝好對應的語言環(huán)境,下面這篇文章主要給大家介紹了關于如何在IDEA中配置Node.js的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02

最新評論