【问题标题】:How to check status-code of URL of the application in protractor test?如何在量角器测试中检查应用程序 URL 的状态码?
【发布时间】:2025-12-05 15:20:06
【问题描述】:

我正在使用请求包来请求 url 并使用延迟承诺:

getMonitoredPageName = function () {
    var deferredExecutor = protractor.promise.defer();
    var defer = protractor.promise.defer();

    request('http://google.com',
    function (error, response, body) {
        if (error || response.statusCode ==400) {
            defer.reject(response.statusCode);
        } else {
            defer.fulfill(response.statusCode);
        }
    });

    return defer.promise;        
}

我从测试中调用上述函数:

  it('should log the page name of every page view in the wizard', function () {

    // We opened the first page of the wizard and we expect it to have been logged
    expect(heartBeatNotification.getMonitoredPageName()).toBeTruthy(true);
    //expect(heartBeatNotification.getMonitoredPageName()).toBe(400);
    //browser.controlFlow().execute(heartBeatNotification.getMonitoredPageName);

})

问题是无论 url 给出什么,测试用例总是成功的。需要编写测试用例来检查应用程序是否正在运行。

【问题讨论】:

    标签: javascript jquery angular jasmine protractor


    【解决方案1】:

    任何非零状态代码都是“真实的”,因此您需要调整您的测试用例。让它检查响应是否明确为 200,或者甚至只是检查它的任何 2xx,因为这仍然是成功的。

    expect(heartBeatNotification.getMonitoredPageName()).toEqual(200);
    

    或者只是检查它是否大于 200 或小于 300 等等。

    expect(heartBeatNotification.getMonitoredPageName()).toBeGreaterThanOrEqual(200);
    expect(heartBeatNotification.getMonitoredPageName()).toBeLessThan(300);
    

    另外,请注意,您可能需要查看您的第一个 if 块的逻辑。

        if (error || response.statusCode ==400) {
            defer.reject(response.statusCode);
        }
    

    如果有错误,可能没有response.statusCode(不是肯定的)。可能会更好地拒绝错误本身

    【讨论】:

      【解决方案2】:

      我能够以这种方式进行测试。它比您尝试做的事情稍微简化了一点,但它应该可以帮助您弄清楚。需要注意的一件事是,您的 if 块设置方式存在问题。如果responseundefined,则测试将超时并且promise 将永远不会返回。无论如何,这就是我能够让你的测试工作的方法。

      it('should return status code 200', async () => {
          const url = 'http://google.com';
          await heartBeatNotification.getMonitoredPageName(url).then(statusCode => {
              expect(statusCode).toEqual(200);
          }, () => {
              fail('app not started');            
          });
      });
      

      这里是函数:

      getMonitoredPageName = (url) => {
          const defer = protractor.promise.defer();
      
          request(url, (err, response, body) => {            
              if(err) {
                  defer.reject();
              } else {
                  defer.fulfill(response.statusCode);
              }
          });
      
          return defer.promise;
      }
      

      【讨论】:

      • 它适用于公共站点。我的网站在 Intranet 中,响应未定义
      • 另外,如果我将 url 作为googleasdasdasd.com 发送,那么该函数正在等待很长时间的响应。
      • 我对 if 块做了一些更改。试试看它是否有效。现在应该好多了。