量角器中的404,用于已知的非根Angular工作页面

时间:2019-06-20 14:30:39

标签: angular protractor npm-request

下面的代码为什么会为http://localhost:4200/page生成404状态代码却为http://localhost:4200生成200状态代码?

当Protractor运行时,我可以打开另一个浏览器窗口,然后在地址栏中键入http://localhost:4200/page,然后按Enter,它就可以工作。但是量角器中的request给出了404。

import * as Request from 'request';
describe('Link', () => {
  it('should work', async () => {
    const href = 'http://localhost:4200'; // works
    // const href = 'http://localhost:4200/page'; // doesn't work, even though this works outside of Protractor while Protractor is running
    const statusCode = await new Promise<number>((resolve, reject) => {
      Request(href, (error, response, body) => {
        if (error) {
          reject(error);
        } else {
          resolve(response.statusCode);
        }
      });
    });
    if (typeof(statusCode) !== 'number') {
      throw new Error(`Failed to request ${href}`);
    }
    if (statusCode < 200 || statusCode >= 300) {
      throw new Error(`Bad status code ${statusCode} for ${href}`);
    }
  });
});

这是一个完整的,最小的,可验证的副本:https://drive.google.com/uc?export=download&id=1S2It1jA1bTR1hUoqdd_QC_Qa6BB3wnDS

  1. 运行ng serve并直接在您选择的浏览器中导航至http://localhost:4200/page,以查看页面是否存在
  2. 先运行npm install,然后运行ng e2e,以观察http://localhost:4200/page URL上的失败
  3. 修改E2E测试以延迟很长时间,以便您可以执行以下操作:
    1. ng e2e
    2. 当量角器仍在运行长时间延迟的测试时,请直接在您选择的浏览器中导航至http://localhost:4200/page,以观察在量角器运行时该页面确实存在

请注意,zip中包含Git历史记录。

1 个答案:

答案 0 :(得分:0)

404来自缺少的Accept: text/html标头。添加该标头,您将获得200。

就像DublinDev pointed out一样,它在Postman中也不起作用,因此也不是request问题。但是它确实可以在Chrome中运行。闻起来像标题问题。果不其然,在将标题弄乱了一点之后,我将其缩小到了这个范围。

这是最终产品:

const statusCode = await new Promise<number>((resolve, reject) => {
  Request({
    url: href,
    headers: {
      'Accept': 'text/html'
    }
  }, (error, response, body) => {
    if (error) {
      reject(error);
    } else {
      resolve(response.statusCode);
    }
  });
});

因此,总而言之:该标头是必需的,因为Angular站点是在E2E测试期间由Angular的dev服务器托管的,而dev服务器显然具有此怪癖。