我是新的量角器,我想写一个测试,看看没有网址给出404错误的锚点。
我见过这个How to test html links with protractor?,但仅针对一个确定的链接,我想对页面中的所有链接进行此操作。
测试应该传递http状态200,如How to use protractor to get the response status code and response text?
所述我有两个问题:
答案 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);
}
}
检查错误页面,你可以得到你想要的东西。