Protractor中发起HTTP GET调用无响应且无报错如何解决?
问题修复方案
- 补全promise的状态变更逻辑:你声明了
deferred但全程没有调用deferred.fulfill()或者deferred.reject(),返回的promise永远处于pending状态,Protractor的控制流不会等待该请求执行,导致请求还没返回测试就已经推进到后续步骤,日志自然无法打印。
- 补全promise的状态变更逻辑:你声明了
- 添加请求错误监听:
http.request默认不会抛出请求阶段的异常(比如连接失败、超时、DNS解析错误),必须显式绑定error事件回调才能捕获异常,你当前代码吞掉了所有请求层面的错误。
- 添加请求错误监听:
- 修正变量名错误:回调参数名为
response,但你打印状态码用的是res.statusCode,未定义的res会抛出引用错误,这个异常也会因为没有错误监听被吞掉。
- 修正变量名错误:回调参数名为
- 不要在Node原生异步回调里直接调用Protractor的
browser方法:browser.sleep属于WebDriver控制流的异步方法,和Node原生http回调的执行上下文不兼容,会导致执行顺序混乱,你可以把日志直接放在回调最顶部,不需要加sleep。
- 不要在Node原生异步回调里直接调用Protractor的
- 把http请求接入Protractor的控制流:或者直接用Protractor推荐的
browser.executeAsyncScript或者支持promise的请求库(比如axios)配合Protractor的异步控制逻辑,避免回调地狱。
- 把http请求接入Protractor的控制流:或者直接用Protractor推荐的
修复后参考代码
var deferred = protractor.promise.defer(); var options = { method: "GET", hostname: hostname, port: 8080, path: '/v1/fis/'+fiId+'/businessCustomers/'+userAuthId+'/approvals', headers: { 'authorization': 'testclient', 'content-type': 'application/json', 'accept': 'application/json', } }; var req = http.request(options, function (response) { console.log('headers are:', options); console.log('hostname is: ', hostname); console.log('STATUS for approval API : ' + response.statusCode); var chunks = []; response.on("data", function (chunk) { console.log('in chunk block::'); chunks.push(chunk); }); response.on("end", function () { try { var body = Buffer.concat(chunks); var finaljson = JSON.parse(body.toString()); console.log('finaljson is:****', finaljson); successCallBack(finaljson.SuccessResponse); deferred.fulfill(finaljson.SuccessResponse); } catch (e) { console.error('Response parse error:', e); deferred.reject(e); } }); }); // 新增错误监听捕获请求异常 req.on('error', function (err) { console.error('Request failed with error:', err); deferred.reject(err); }); req.end(); return deferred.promise;
额外排查点
- 确认Protractor配置里的
controlFlow没有被禁用,如果你用的是较新版本的Protractor(5.0+)默认已经弃用了旧的控制流,建议你用async/await重写这段逻辑,兼容性更好。 - 确认测试环境的网络和Postman的网络一致,比如有没有代理配置,Postman默认会用系统代理,而Node的http模块默认不使用系统代理,如果你的API需要走代理访问,需要给http请求显式配置代理参数。
- 可以在请求发送前打印完整的
options配置,和Postman里的请求参数做逐一对比,包括hostname、path、header字段有没有拼写错误,变量fiId、userAuthId有没有正确赋值。
内容的提问来源于stack exchange,提问作者Neha M
相关产品推荐
相关产品推荐

