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

发布于:2025-03-06 ⋅ 阅读:(18) ⋅ 点赞:(0)

在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 进行变量设置、测试和调试。

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