使用Axios+NightwatchJS测试URL时无法输出失败URL的问题
我使用NightwatchJS结合Axios包,测试大量URL是否返回正确的状态码,初始代码如下:
var axios = require('axios'); module.exports = { '@tags': ['siteMapTesting'], 'Sitemap test for Parkers pages': async (browser) => { var result = await alasql.promise('select URL from xlsx("./testUrls.xlsx",{sheetid:"QA-245-xmlSiteMap"})'); var xcelData = result.map(item => { return item.URL; }); async function siteMapUrlsTestArr(item) { var response = await axios.get(browser.launch_url + item); console.log('Sitemap test URL =', (browser.launch_url + item + ' status code = ' + response.status)); browser.verify.equal(response.status, 200); } for (let index = 0; index < 1000; index++) { var xmlTestUrl = xcelData[Math.floor(Math.random()*xcelData.length)]; await siteMapUrlsTestArr(xmlTestUrl); } }, 'Closing the browser': function (browser) { browser.browserEnd(); }, };
当URL返回200时代码运行正常,但测试失败时,错误信息仅提示状态码错误,无法得知具体是哪个URL出问题:
Site Map/ QA 245 Xml Site Map] Sitemap test for Parkers pages (556ms)
AxiosError: Request failed with status code 404
at BrotliDecompress.emit (node:events:525:35)
at endReadableNT (node:internal/streams/readable:1359:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
TEST FAILURE: 1 error during execution; 0 assertions failed, 1 passed (4.029s)✖ siteMap/QA-245-xmlSiteMap – Sitemap test for Parkers pages (556ms)
AxiosError: Request failed with status code 404
at BrotliDecompress.emit (node:events:525:35)
at endReadableNT (node:internal/streams/readable:1359:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)SKIPPED:
- Closing the browser
我曾尝试修改代码手动抛出错误,但仍无法在错误中显示对应URL:
var alasql = require('alasql'); var axios = require('axios'); module.exports = { '@tags': ['siteMapTesting'], 'Sitemap test for Parkers pages': async (browser) => { var result = await alasql.promise('select URL from xlsx("./testUrls.xlsx",{sheetid:"QA-245-xmlSiteMap"})'); var xcelData = result.map(item => { return item.URL; }); async function siteMapUrlsTestArr(item) { var response = await axios.get(browser.launch_url + item); if (response.status !== 200) { throw new Error('Sitemap fail URL =', (browser.launch_url + item + ' status code = ' + response.status)); } } for (let index = 0; index < 5; index++) { var xmlTestUrl = xcelData[Math.floor(Math.random()*xcelData.length)]; await siteMapUrlsTestArr(xmlTestUrl); } }, 'Closing the browser': function (browser) { browser.browserEnd(); }, };
解决方案
通过捕获Axios请求的错误并自定义错误信息,同时保留断言的失败标记,修改后的代码如下:
var alasql = require('alasql'); var axios = require('axios'); module.exports = { '@tags': ['siteMapTesting'], 'Sitemap test for Parkers pages': async (browser) => { var result = await alasql.promise('select URL from xlsx("./testUrls.xlsx",{sheetid:"QA-245-xmlSiteMap"})'); var xcelData = result.map(item => item.URL); async function siteMapUrlsTestArr(item) { const fullUrl = browser.launch_url + item; try { const response = await axios.get(fullUrl); console.log(`Sitemap test URL = ${fullUrl} status code = ${response.status}`); // 执行断言,自定义失败提示信息 browser.verify.equal(response.status, 200, `URL ${fullUrl} 返回状态码${response.status},预期200`); } catch (error) { // 打印失败详情到控制台 let errorMsg = `URL ${fullUrl} 测试失败: `; if (error.response) { // Axios请求成功但返回非2xx状态码 errorMsg += `状态码${error.response.status}`; console.log(`Sitemap fail URL = ${fullUrl} status code = ${error.response.status}`); } else { // 请求发起失败或断言失败 errorMsg += error.message; } // 抛出带URL的错误,让Nightwatch标记测试失败 throw new Error(errorMsg); } } for (let index = 0; index < 1000; index++) { const xmlTestUrl = xcelData[Math.floor(Math.random()*xcelData.length)]; await siteMapUrlsTestArr(xmlTestUrl); } }, 'Closing the browser': function (browser) { browser.browserEnd(); }, };
关键修改说明
- 用try/catch包裹整个请求和断言逻辑:捕获Axios的请求错误(如404、500)和Nightwatch断言的失败错误
- 在错误信息中注入完整URL:无论是哪种错误,都能在错误日志中看到具体的问题URL
- 自定义断言提示信息:
browser.verify.equal的第三个参数直接添加URL相关提示,断言失败时直观显示问题URL - 保留控制台打印:失败时仍会在控制台输出URL和状态码,方便快速排查
内容的提问来源于stack exchange,提问作者Darren Harley

