如何调试未捕获的异常:testcafe报告没有堆栈跟踪的错误

时间:2020-06-17 13:15:45

标签: testing automation automated-tests e2e-testing testcafe

我想找到一种方法来调试testcafe报告的JavaScript错误。在本地这不是一个大问题,我们可以在其中浏览浏览器的控制台并读取错误。在无头浏览器中的持续集成环境中,情况要复杂一些。

目前正在运行测试:

  • 本地//总是成功,这个问题不存在
  • 在docker本地// //总是成功,问题不存在
  • docker中的循环//有时会失败

如上所述,测试始终在本地成功,并且无论它们在docker内部还是外部运行都无关紧要。问题是在circleci上运行的测试有时会失败。它们由于未捕获的JavaScript错误而失败,并且testcafe报告如下错误:

<failure>
  <![CDATA[
    1) Uncaught exception:

       Error:

       Browser: HeadlessChrome 77.0.3865 / Linux 0.0.0
  ]]>
</failure>

没有堆栈跟踪,没有消息,没有信息,没有屏幕截图。真的很难调试,因为它仅发生在circleci环境中。

我试图使用testcafe中的内置客户端代码注入来绑定到onerror / addEventListener('error')中,例如此处的示例:#1,{{3 }}。不幸的是,没有任何报道。

此刻,我这边的日志记录机制看起来像这样

fixture('Profile - remove account')
  .page(url('/sign-up'))
  .beforeEach(resize)
  .afterEach(async t => {
    console.log(await t.getBrowserConsoleMessages());
  });

test(`should:
  ▹ Sign up
  ▹ Visit /profile/account
  ▹ Remove current account
  ▹ Visit /login
`, async t => {

log.js

window.addEventListener('error', function (error) {
    console.error('Got uncaught error');
    console.error(error.message);

    try {
        console.error(JSON.stringify(error, undefined, 2));
    catch (_) {
    }
});

CLI

docker-compose run --rm e2e \
  "chromium:headless --no-sandbox --disable-dev-shm-usage" \
  tests/e2e/src \
  --cs=tests/e2e/log.js \
  --skip-js-errors \
  -S -s /tests/screenshots \
  -r xunit:/tests/test-results/testcafe/results.xml

已经多次报告此问题:

我正在使用https://github.com/DevExpress/testcafe/issues/4708

1 个答案:

答案 0 :(得分:1)

我认为显示空错误堆栈的原因有两个:

  • 该错误与任何TestCafe操作(clicktypeText等)都不相关。
  • 该错误具有非标准属性。

此错误在服务器端引发,因此window.addEventListener('error')处理程序无助于查找问题的原因。

在开始测试之前,您需要通过以下方式记录Node.js错误:

export function registerErrorHandlers () {
    process.on('unhandledRejection', e => console.error(e));
    process.on('uncaughtException', e => console.error(e);
}

如果发现有问题的案例,请在GitHub的TestCafe存储库中的this问题中添加有关此问题的信息。