当前位置: 首页 > article >正文

Bruno运行登录接口遇到报错canot found module ‘htmlparser2’怎么解决

在Bruno环境中我得脚本是这样的 

const parser = require('htmlparser2');
const cssSelect = require('css-select')

const {parseDocument} = parser;

const dom = parseDocument(res.getBody());

const SAMLRequestElement = cssSelect.selectOne("input[name='SAMLRequest']", dom);
if (SAMLRequestElement) {
    const SAMLRequestValue = SAMLRequestElement.attribs.value;
    bru.setVar("SAMLRequest", decodeURIComponent(SAMLRequestValue));
} else {
    console.error("SAMLRequest input element not found");
}

const SignatureElement = cssSelect.selectOne("input[name='Signature']", dom);
if (SignatureElement) {
    const SignatureValue = SignatureElement.attribs.value;
    bru.setVar("Signature", decodeURIComponent(SignatureValue));
} else {
    console.log("Signature input element not found");
}

const SigAlgElement = cssSelect.selectOne("input[name='SigAlg']", dom);
if (SigAlgElement) {
    const SigAlgValue = SigAlgElement.attribs.value;
    bru.setVar("SigAlg", decodeURIComponent(SigAlgValue));
} else {
    console.error("SigAlg input element not found");
}

const RelayState = cssSelect.selectOne("input[name='RelayState']", dom).attribs.value;
bru.setVar("RelayState", RelayState)
console.log("RelayState is " + RelayState);

const authenticityToken = cssSelect.selectOne("input[name='authenticity_token']", dom).attribs.value;
bru.setVar("authenticityToken", authenticityToken)

const spId = cssSelect.selectOne("input[name='spId']", dom).attribs.value;
bru.setVar("spId", spId)

const spName = cssSelect.selectOne("input[name='spName']", dom).attribs.value;
bru.setVar("spName", spName)

const idpSSOEndpoint = cssSelect.selectOne("input[name='idpSSOEndpoint']", dom).attribs.value;
bru.setVar("idpSSOEndpoint", idpSSOEndpoint)

const xsrfProtection = cssSelect.selectOne("input[name='xsrfProtection']", dom).attribs.value;
bru.setVar("xsrfProtection", xsrfProtection)

let cookies = res.getHeader("set-cookie");

if (cookies && cookies.length > 0) {
    let cookieDict = {};

    cookies.forEach(cookie => {
        let parts = cookie.split(';'); 
        let [name, value] = parts[0].split('='); 
        name = name.trim();
        value = value.trim();
        cookieDict[name] = value;
    });

    let cookieString = Object.keys(cookieDict).map(name => {
        return `${name}=${cookieDict[name]}`;
    }).join('; ');

    bru.setVar("cookies", cookieString);
    console.log("Combined cookie string with latest values:", cookieString);
} else {
    console.error("No cookies found in the set-cookie header.");
}

由于 Bruno 是一个专注于 API 开发和测试的工具,它的脚本执行环境可能不支持典型的 Node.js 模块加载方式(如使用 require 来加载模块)。因此无法直接在 Bruno 中使用 Node.js 的 htmlparser2css-select。以下是一些可以在不使用 Node.js 模块的情况下,在 Bruno 中实现类似的功能:

1. 使用浏览器原生方法解析 HTML:

Bruno 的脚本环境类似于浏览器环境,可以使用浏览器提供的 API 来解析 HTML。

使用 DOMParser 解析 HTML:
// Assuming `res.getBody()` returns the entire HTML as a string
const parser = new DOMParser();
const doc = parser.parseFromString(res.getBody(), "text/html");

// Now you can use traditional DOM methods to find elements
const SAMLRequestElement = doc.querySelector("input[name='SAMLRequest']");
if (SAMLRequestElement) {
    const SAMLRequestValue = SAMLRequestElement.value;
    bru.setVar("SAMLRequest", decodeURIComponent(SAMLRequestValue));
} else {
    console.error("SAMLRequest input element not found");
}

// Continue similarly for other elements using `querySelector` or `querySelectorAll`

2. 检查和处理输入元素:

确保在尝试访问属性之前先检查元素是否存在。对于不存在的元素,打印适当的错误信息。

3. 处理 Cookies:

Bruno 脚本中的 Cookie 处理相对正常,因为它依赖于解析字符串来构建 Cookie 字典。确保字符串处理逻辑是正确的,这看起来已经做得很好。

4. 使用 Bruno 提供的 API:

确保您使用的 bru.setVar 在 Bruno 中被正确调用并且可用。可以通过 Bruno 的文档来确认使用方法。

总结:

  • 避免使用无法加载的 Node.js 模块:在 Bruno 中的脚本可能无法使用普通的 Node.js 模块,因此可以依靠原生浏览器 API 来操作 DOM。
  • 确保节点查找逻辑正确无误:使用 querySelectorquerySelectorAll 来定位和操作 HTML 元素。
  • 处理和管理变量:充分利用 bru.setVar 进行变量设置、测试和调试。

可以使用上文中的建议来修改和运行代码。调整后的代码不仅仅解决了模块加载的问题,还与浏览器环境下的原生功能保持一致。


http://www.kler.cn/a/572356.html

相关文章:

  • OpenHarmony多模输入子系统
  • 2025 自动代码审计工具灵脉 SAST 的应用实践
  • 【easy视频 | day02】管理端登录校验 + 分类管理 + 文件上传
  • ubuntu24.04-系统重装
  • 无人机陀螺仪原理与算法详解!
  • Android中使用Robolectric测试点击事件(不需要手机)
  • 智慧隧道:城市升级改造的地下动脉——塔能物联运维的核心驱动
  • 物联网数据中台 数据采集器 边缘盒子三者之间应用思考点
  • 【嵌入式】MQTT
  • python GUI之实现一个自定义的范围滑块控件:QRangeSlider
  • C++ 变量的输入输出教程
  • 进阶篇——深入解析数据库事务与锁机制:从原理到实战优化
  • 16.1STM32_ADC
  • C/C++跨平台SDK开发的注意事项
  • C# Unity 唐老狮 No.4 模拟面试题
  • C# 基础知识总结(持续更新中...)
  • 【线性代数的理解】 为什么说线性代数研究的是空间变换?旋转矩阵坐标转换矩阵
  • Dify部署-(零基础)(个人体验)(Linux)(白嫖)(可部署大模型)
  • MongoDB 查询语句详解:以 `db.fs.files.find().sort({ _id: -1 }).limit(10)` 为例
  • 期权适合什么类型的投资者交易?