使用 Puppeteer 设置 Cookies 并实现自动化分页操作:前端实战教程

使用 Puppeteer 设置 Cookies 并自动化分页操作

在现代的 Web 自动化中,使用 Puppeteer 进行浏览器自动化是一个非常方便的选择。本篇文章将介绍如何使用 Puppeteer 设置 Cookies、模拟用户行为、获取网页内容,并且遍历分页获取所有数据。

一、项目初始化

首先,我们需要安装 Puppeteer。你可以通过 npm 来安装:

bash 复制代码
npm install puppeteer

然后创建一个 JavaScript 文件,例如 puppeteer.js,以若依测试。并添加以下代码:

二、代码实现

javascript 复制代码
const puppeteer = require('puppeteer');
const fs = require('fs'); // 导入文件系统模块

// 设置延时的工具函数
function waitForTimeout(time) {
    return new Promise((resolve, reject) => setTimeout(resolve, time));
}

(async () => {
  // 启动 Puppeteer 浏览器实例
  const browser = await puppeteer.launch({
    headless: false // 设置为 false 以便查看操作
  });

  try {
    const page = await browser.newPage();
    await page.setViewport({ width: 1920, height: 800 });

    // 导航到需要设置 cookie 的页面
    await page.goto('http://localhost:8093/admin');

    // 定义多个 cookie 对象并存储在数组中
    const cookies = [
      {
        "name":"Admin-Token",
        "value":"eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjYzYWNmZTVmLWUyNGItNDYwNi05ZjdhLTBkYmU5ZDBhZWJmZCJ9.RqZDMMiRTGUwVSLal9dx2mDyHwkY_vk4Vs2bMSegph7P0eTnKDknN5DOP3wRu18e2NVk5OdVSfJcLmC0N1HHHQ"
      }
      // 可以继续添加更多 cookie 对象
    ];

    // 使用 page.setCookie 方法设置多个 cookie
    await page.setCookie(...cookies);
    
    // 打印当前页面的 cookies
    const cookies1 = await page.cookies();
    console.log('当前页面的 cookies:', cookies1);

    // 导航到目标页面
    await page.goto('http://localhost:8093/category');

    // 使用 XPath 选择带有特定文本的按钮
    const xpathSelectorC = '//span[text()="50条/页"]';
    await page.waitForXPath(xpathSelectorC);

    // 获取符合条件的元素并模拟点击操作
    const [element] = await page.$x(xpathSelectorC);
    if (element) {
        await element.evaluate(element => element.click());
        console.log('已选择 "50条/页"');
    } else {
        console.log('未找到 "50条/页"');
    }

    // 等待分页元素加载完成
    await page.waitForSelector('ul.el-pager');

    // 获取分页的所有 <li> 元素
    const liElements = await page.$$('ul.el-pager li');
    const lastLiElement = liElements[liElements.length - 1];
    let lastLiText = 0;

    if (lastLiElement) {
        lastLiText = await page.evaluate(li => li.textContent, lastLiElement);
        console.log('最后一个 <li> 元素的内容:', lastLiText);
    } else {
        console.log('未找到 <li> 元素');
    }

    // 定义表格和分页按钮选择器
    const tableSelector = 'table';
    const nextButtonSelector = 'button.btn-next';

    // 等待下一页按钮可见
    await page.waitForSelector(nextButtonSelector, { visible: true, timeout: 5000 });
    const totalPages = parseInt(lastLiText); // 获取总页数
    let currentPage = 1;
    let allTableHTML = ''; // 用于保存所有表格的 HTML 内容

    // 遍历所有分页
    while (currentPage <= totalPages) {
      const buttonElement = await page.$(nextButtonSelector);
      const tableElements = await page.$$(tableSelector);

      if (buttonElement) {
        // 点击"下一页"按钮
        await buttonElement.click();
        await waitForTimeout(3000); // 等待加载

        // 获取当前页面的表格内容并保存
        for (const tableElement of tableElements) {
          const tableHTML = await tableElement.evaluate(element => element.outerHTML);
          allTableHTML += tableHTML;
        }

        currentPage++; // 增加当前页数
      } else {
        console.log('未找到按钮');
        break; // 如果按钮不存在,退出循环
      }
    }

    console.log('已浏览到第 ' + totalPages + ' 页');
    
    // 你可以将 allTableHTML 保存为文件或进一步处理
    fs.writeFileSync('allTables.html', allTableHTML);

    // 完成后关闭浏览器
    await browser.close();

  } catch (e) {
    console.log("发生错误:" + e);
  }
})();

三、代码说明

  1. 启动浏览器实例

    使用 puppeteer.launch() 启动一个浏览器实例。headless: false 表示我们希望看到浏览器的操作界面,便于调试。

  2. 设置 Cookies

    使用 page.setCookie(...cookies) 设置多个 Cookie。我们通过传递一个包含多个 cookie 对象的数组来设置 Cookies。

  3. 等待和选择元素

    使用 page.waitForXPath() 和 page.waitForSelector() 来确保元素加载完成后进行交互。特别是通过 XPath 选择"50条/页"按钮,并模拟点击它。

  4. 分页操作

    使用 page.$(nextButtonSelector) 和 page.$$(tableSelector) 获取"下一页"按钮和表格元素,进行分页处理。每一页的数据都通过 tableElement.evaluate() 获取 HTML 内容,并累积到 allTableHTML 中。

  5. 文件保存

    最后,所有页面表格的 HTML 内容保存在一个文件 allTables.html 中,使用 Node.js 的 fs 模块来实现文件保存。

四、总结

通过以上代码,你可以模拟在 Web 页面上设置 Cookies、模拟用户行为并自动化分页操作。你可以根据具体需求对该代码进行修改,以实现更复杂的自动化任务。

Puppeteer 是一个强大的浏览器自动化工具,适用于多种 Web 数据抓取和自动化任务。希望本文的示例代码能帮助你入门 Puppeteer,并加速你在自动化测试和 Web 数据抓取方面的工作。

相关推荐
Decay__4 分钟前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子2 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
蜗牛攻城狮2 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
万联WANFLOW3 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
她说可以呀3 小时前
Vue插槽
前端·javascript·vue.js
qq_448011163 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
ZhuoAIStage4 小时前
舞台工艺多专业审图提速:用 AI 智能体编排 A+B+C+G 四段读图流水线
人工智能·自动化·工作流编排·舞台工艺·审图智能体
aixingpan4 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352904 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
Ruiery5 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器