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

时间:2015-08-25 12:56:43

标签: angularjs testing protractor e2e-testing

我是新的量角器,我想写一个测试,看看没有网址给出404错误的锚点。

我见过这个How to test html links with protractor?,但仅针对一个确定的链接,我想对页面中的所有链接进行此操作。

测试应该传递http状态200,如How to use protractor to get the response status code and response text?

所述

我有两个问题:

  • 这个测试在量角器中是否有意义?
  • 可以测试一下吗?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:3)

我想将其作为页面对象实现,因此我可以为每个页面规范文件使用简单的一行expect语句。在事后的想法中我认为这可以通过使用API​​测试框架(例如cheerio.js)以更简单的方式实现,但这里是如何使用量角器和jasmine实现它(使用ES2015语法,因此update node到当前版本)!请记住安装请求,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);
});

答案 1 :(得分:2)

我认为它绝对可行并且如果范围有限则可以这样做,因为这不是使用selenium-webdriver的典型UI测试。您可以执行类似的操作,查找所有链接,获取URL下方并使用request等模块发出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');
       });
    }
});

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

在这里,我写了一个可能符合您要求的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);
}
}

检查错误页面,你可以得到你想要的东西。