Angularjs 量角器:可以测试我的应用程序中没有404吗?

Angularjs 量角器:可以测试我的应用程序中没有404吗?,angularjs,testing,protractor,e2e-testing,Angularjs,Testing,Protractor,E2e Testing,我是新来的量角器,我想写一个测试,看看有没有锚与URL给出404错误 我已经看过了,但是只针对一个确定的链接,我想对页面中的所有链接都这样做 测试应该通过http状态200,如下所述 我有两个问题: 这个测试在量角器中有意义吗 有可能测试这个吗?如果是,怎么做 我认为这绝对是可行的,如果范围有限,那么这样做是有意义的,因为这不是SeleniumWebDriver用于的典型UI测试。您可以做一些类似的事情,查找所有链接,在url下面获取,并使用类似的模块发出get请求。这是一个伪代码 var r

我是新来的量角器,我想写一个测试,看看有没有锚与URL给出404错误

我已经看过了,但是只针对一个确定的链接,我想对页面中的所有链接都这样做

测试应该通过http状态200,如下所述

我有两个问题:

  • 这个测试在量角器中有意义吗
  • 有可能测试这个吗?如果是,怎么做

我认为这绝对是可行的,如果范围有限,那么这样做是有意义的,因为这不是SeleniumWebDriver用于的典型UI测试。您可以做一些类似的事情,查找所有链接,在url下面获取,并使用类似的模块发出get请求。这是一个伪代码

var request = require('request');
var assert = require('assert');
element.all(by.tagName('a')).then(function(link) {
   var url = link.getAttribute('href');
   if(url) {
       request(url, function (error, response, body) {
           assert.equal(response.statusCode, 200, 'Status code is not OK');
       });
    }
});

在这里,我编写了一个java演示,它可能满足您的需求。此外,我不熟悉量角器,但希望这能有所帮助

package com.selenium.webdriver.test;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class Traverse {

   private WebDriver driver;
   private String baseUrl;
   private Map<String, String> tMap;

public Traverse(String url) {
    driver = new HtmlUnitDriver();
    baseUrl = url;
    tMap = new HashMap<String,String>();
}


//get status code.
public int getRespStatusCodeByGet(String url) throws HttpException, IOException {
    GetMethod method = new GetMethod(url);
    HttpClient client = new HttpClient();

    client.executeMethod(method);

    return method.getStatusCode();
}

//single page traversal
public boolean search(String url) throws HttpException, IOException {
    if(getRespStatusCodeByGet(url) != 200) {
        System.out.println("Bad page " + url);
        return false;
    }
    driver.get(url);

    List<WebElement> elements = driver.findElements(By.tagName("a"));

    for(int i=0;  i<elements.size(); i++) {
        String cUrl = elements.get(i).getAttribute("href");
        String cText = elements.get(i).getText();

        if(cUrl != null && cUrl.startsWith("http") && !tMap.containsKey(cText)) {

            tMap.put(cText, cUrl);

            System.out.println(cUrl);

            search(cUrl);


        }

    }
    return true;
}

//client
public static void main(String[] args) throws HttpException, IOException {
    Traverse t = new Traverse("http://www.oktest.me/");
    t.search(t.baseUrl);
}
}
package com.selenium.webdriver.test;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入org.apache.commons.httpclient.httpclient;
导入org.apache.commons.httpclient.HttpException;
导入org.apache.commons.httpclient.methods.GetMethod;
导入org.openqa.selenium.By;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.WebElement;
导入org.openqa.selenium.htmlunit.HtmlUnitDriver;
公共类遍历{
私有网络驱动程序;
私有字符串baseUrl;
专用地图tMap;
公共遍历(字符串url){
driver=新的HtmlUnitDriver();
baseUrl=url;
tMap=newhashmap();
}
//获取状态代码。
public int getRespStatusCodeByGet(字符串url)抛出HttpException、IOException{
GetMethod=新的GetMethod(url);
HttpClient=新的HttpClient();
客户端执行方法(方法);
返回方法。getStatusCode();
}
//单页遍历
公共布尔搜索(字符串url)引发HttpException、IOException{
如果(getRespStatusCodeByGet(url)!=200){
System.out.println(“坏页”+url);
返回false;
}
获取(url);
列表元素=driver.findElements(按.tagName(“a”));

对于(inti=0;i我想将其实现为一个页面对象,这样我就可以为每个页面规范文件使用一个简单的一行expect语句。事后我认为,这可以通过使用API测试框架(例如)以更简单的方式实现,但下面是如何使用量角器和jasmine实现它(使用ES2015语法,以便更新到当前版本)!请记住安装request、bluebird和request promise npm软件包

PageObject.js

crawlLinks(){

    const request = require('request');
    const Promise = require('bluebird');
    const rp = require('request-promise');

    return $$('a').then(function(elems){
      return Promise.map(elems, elem => {
        return elem.getAttribute("href").then(function(url){
          if(url){
            var options = {
              method: 'GET',
              uri: url,
              resolveWithFullResponse: true
            };
            return rp(options).then(function(response){
              console.log('The response code for ' + url + ' is ' + response.statusCode);
              return response.statusCode === 200;
            });
          }
        });
      }).then((allCodes) => {
        console.log(allCodes);
        return Promise.resolve(allCodes);
      });
    });
  }
测试

it("should not have broken links", function(){
     expect(pageObject.crawlLinks()).not.toContain(false);
});

404错误出现在浏览器控制台中(至少在chrome中是这样),您可以从量角器访问该错误

browser.manage().logs().get('browser').then(function(browserLogs) {
   browserLogs.forEach(function(log){
      expect(log).toBeFalsy();
   });
});

上面的代码将导致所有控制台消息被视为测试失败,您可以根据需要对其进行调整。您可以在所有测试的
中放置类似的代码。

问题是特定于javascript/量角器的。我得到错误->类型错误:无法读取请求时未定义的属性“statusCode”。\u回调该建议告诉我你有一个
错误
。你能打印错误吗?在我看来,
承诺
蓝鸟
的使用是过时的。这不是直接在量角器5.x中解决的吗?我在量角器5.x发布之前回答了这个问题,所以是的,非常过时。