木偶戏与测试相结合的问题

时间:2020-06-30 14:52:55

标签: javascript node.js npm puppeteer

我有问题。我是JavaScript新手,无法真正解决此错误。

我正在通过puppeteer从一个网站获取数据,然后我想测试它是否正确:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://6mr2n.csb.app/#');

    header = await page.evaluate(() => {
        header = document.querySelector('header[class="header"]').innerText;
        return header;
    });

    console.info(`The header is: ${header}`);
    await browser.close
    module.exports = header;
})();

我的测试文件(笑话)是:

const index = require('./index');

test('Hallo', () => {
    expect(index.header).toEqual('todos');
  });

可能我只是愚蠢,但是我确实做了很多尝试来解决这个问题。运行主文件可以运行,但是运行测试(npm run test)可以得到以下结果:

expect(received).toEqual(expected) // deep equality

Expected: "todos"
Received: undefined

  4 | 
  5 | test('Hallo', () => {
> 6 |     expect(index.header).toEqual('todos');
    |                          ^
  7 |   });

  at Object.<anonymous> (index.test.js:6:26)

还有:

Cannot log after tests are done. Did you forget to wait for something async in your test?
Attempted to log "The header is: todos".

2 个答案:

答案 0 :(得分:1)

您可以在操纵up的脚本中使用命名的异步函数(例如:header()),该函数返回所需的标头值,并最终将其导出为module.exports.header = header到主函数之外。

const puppeteer = require('puppeteer')

const header = async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://6mr2n.csb.app/#')

  const headerVal = await page.evaluate(() => {
    headerVal = document.querySelector('header[class="header"]').innerText
    return headerVal
  })

  await browser.close()
  console.info(`The header is: ${headerVal}`)
  return headerVal
}

module.exports.header = header

您的测试也需要异步功能,因此您可以等待它,例如:

const index = require('./index')

test('Hallo', async () => {
  const headerVal = await index.header()
  expect(headerVal).toEqual('todos')
})

注意::您需要browser.close()才能关闭浏览器实例。

注释2:您也可以像这样检索innerText:

const headerVal = await page.evaluate(el => el.innerText, await page.$('.header'))

答案 1 :(得分:0)

您在module.exports函数中设置了async,但是require('./index')不等待该设置并返回空对象。 (顺便说一句,您需要module.exports.header = header才能使用index.header)。

要解决此问题,您可以尝试返回Promise并等待它:

const puppeteer = require('puppeteer');

module.exports = (async () => { /* ... */ return header; })();
const headerPromise = require('./index');

(async function main() {
  const header = await headerPromise;
  test('Hallo', () => {
    expect(header).toEqual('todos');
  });
})();