3

:) 我选择了 Cypress.io 进行自动化测试工具。我需要对我的 sitemap.xml 文档进行一些测试,但我不知道该怎么做:(

我试过安装一个 npm 包 libxmljs

npm install libxmljs --save

并将其作为插件加载到 cypress/plugins/index.js

const libxmljs = require('libxmljs');

但这有一个问题。它显示一个错误

The plugins file is missing or invalid.

Your pluginsFile is set to /home/my-app/cypress/plugins/index.js, but
either the file is missing,
it contains a syntax error, or threw an error when required.

The pluginsFile must be a .js or .coffee file.

Please fix this, or set pluginsFile to false if a plugins file is not
necessary for your project.

Error: The module '/home/my-app/node_modules/libxmljs/build/Release/xmljs.node'

请帮助我,我如何在 Cypress.io 中使用 libxmljs,或者我应该如何在这个端到端测试工具中为 Sitemap.xml 编写测试。

谢谢你的时间!:)

4

4 回答 4

6

尽管@NoriSte 的回答是正确的,但我找到了一个更简单的替代方案,不需要任何第 3 方代码。

赛普拉斯 API 公开了所有必要的方法:

  • 加载文件(在您的情况下为sitemap.xmlcy.request ) :。
  • 解析 XML 文件(它公开了jQuery API):Cypress.$
  • 检查页面是否成功加载(带有 200 状态代码):cy.visit

这是我用来测试站点地图中声明的所有页面是否正在加载的以下测试(并确保它不指向任何 404):

    describe('Sitemap', () => {
      // initialize the url array
      let urls = []

      // be sure to get the url list before executing any tests
      before(async () => {
        // getch the sitemap content
        const response = await cy.request('sitemap.xml')

        // convert sitemap xml body to an array of urls
        urls = Cypress.$(response.body)
          // according to the sitemap.xml spec,
          // the url value should reside in a <loc /> node
          // https://www.google.com/sitemaps/protocol.html 
          .find('loc')
          // map to a js array
          .toArray()
          // get the text of the <loc /> node
          .map(el => el.innerText)
      })

      it('should succesfully load each url in the sitemap', () => {
        urls.forEach(cy.visit)
      })
    })
于 2020-04-29T10:26:05.913 回答
2

如果你想用来libxmljs解析你的站点地图,你应该

  • 使用cy.request读取站点地图本身
  • 向赛普拉斯添加自定义任务(因为libxmljs它是一个节点库,cy.task是从赛普拉斯测试中使用 Node.js 脚本的唯一方法)
  • 从您的任务中返回解析的数据
  • 在赛普拉斯测试中断言它

这些是您需要执行的高级步骤

于 2019-03-11T17:31:52.660 回答
1

为了增加gion_13的一个很好的答案,这是他的解决方案重构为使用 Cypress 类似承诺的命令而不是异步调用。

describe('Sitemap', () => {
  let urls = [];

  before(() => {
    cy.request('sitemap.xml')
    .as('sitemap')
    .then((response) => {
      urls = Cypress.$(response.body)
            .find('loc')
            .toArray()
            .map(el => el.innerText);
    });
  });

  it('should succesfully load each url in the sitemap', () => {
    urls.forEach(cy.visit);
  });
});

在赛普拉斯中使用异步可能会引发错误“赛普拉斯检测到您在测试中返回了一个承诺,但还在该承诺中调用了一个或多个 cy 命令”。

于 2021-03-07T02:49:59.553 回答
0
describe('Sitemap', () => {
  let urls = [];

  before(() => {
    const parser = new DOMParser();

    cy.request('/sitemap.xml').then((response) => {
      const document = parser.parseFromString(response.body, 'application/xml');
      const parsedUrls = document.getElementsByTagName('loc');

      urls = Array.from(parsedUrls).map((item) => item.innerHTML);
    });
  });

  it('Should load each url from the sitemap', () => {
    urls.forEach(cy.visit);
  });
});

于 2021-11-01T19:40:39.887 回答