来自 Protractor 测试的裸 HTTP 调用
Posted
技术标签:
【中文标题】来自 Protractor 测试的裸 HTTP 调用【英文标题】:Bare HTTP calls from Protractor tests 【发布时间】:2014-01-30 02:43:24 【问题描述】:我的量角器测试需要一些数据设置,我想通过对正在运行的服务器进行一系列 POST 和 PUT 来实现这些设置。
所以,问题是:如何从 Protractor 测试中执行“裸”HTTP 调用?
我发现的一种方法是使用 Node Http 模块,但它有点笨拙。我想知道这些问题通常是如何解决的——量角器会暴露什么吗?使用 Http(和其他需要时的 Node 模块)是可行的方法吗?还有其他方法吗?
【问题讨论】:
【参考方案1】:如果你的 Angular 应用中有一个服务,你可以调用它来创建你的测试对象,那么我在这里描述了一个技巧:
Accessing Angular inside Protractor Test
几周前我做了一个关于 Protractor 的演讲。这是该技术的一个示例:
https://github.com/andresdominguez/protractor-meetup/blob/master/test/e2e/member3-spec.js#L25 https://github.com/andresdominguez/protractor-meetup/blob/master/test/e2e/api-helper.js
你也可以看看这个帖子: http://eitanp461.blogspot.com/2014/01/advanced-protractor-features.html
你可以用量角器注入一个模块,然后调用它。
【讨论】:
如果我理解正确,这个技巧只能在我的页面已经有 Angular 的情况下使用,对吗?如果我想在测试之前真正做到这一点,在与我的登录页面(没有 Angular)交互之前,这不是很好。 没错。加载页面时需要角度。【参考方案2】:不依赖于 Angular 的另一种方法是在 browser.executeAsyncScript
内手动创建一个 XMLHttpRequest
。如果您需要在 Angular 加载或导航到页面之前作为测试设置的一部分进行调用,这将特别有用。
See this example in the Protractor docs:
示例 #3:注入 XMLHttpRequest 并等待结果。在此示例中,注入脚本是使用函数文字指定的。使用这种格式时,函数被转换为字符串进行注入,因此它不应引用任何未定义在被测页面范围内的符号。
driver.executeAsyncScript(function()
var callback = arguments[arguments.length - 1];
var xhr = new XMLHttpRequest();
xhr.open("GET", "/resource/data.json", true);
xhr.onreadystatechange = function()
if (xhr.readyState == 4)
callback(xhr.responseText);
xhr.send('');
).then(function(str)
console.log(JSON.parse(str)['food']);
);
【讨论】:
【参考方案3】:要从量角器进行裸 http 调用,您需要使用 node js 中的 HTTP 模块...这是我们在这种情况下使用的简单解决方案
-
量角器测试脚本从休息端点获取数据
量角器测试脚本从网页获取数据
protract 测试脚本根据网页上的数据验证此数据
那么如何对休息端点进行 HTTP 调用,
使用此文档https://nodejs.org/api/http.html#http_http_get_options_callback
这是代码sn-p
你需要
var http=require('http');
it('MAKEHTTPCALL', function()
var gotResponse=false;
var myResponse=;
//this function to wait the rest to respond back
function waitForBackend()
browser.wait(function()
//console.log(myResponse);
console.log(gotResponse);
return gotResponse;
, 5000);
var options =
hostname: 'yourhostname.com',
port: 8081,
path: '/yourendpoint/path/XXXX',
method: 'GET',
headers:
'token':'XXXXXXXX'
;
var req = http.request(options, function(res)
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk)
console.log('BODY: ' + chunk);
gotResponse = true;
myResponse=JSON.parse(chunk);
/*
TO DO
Add the script validations here…..
*/
);
);
req.on('error', function(e)
console.log('problem with request: ' + e.message);
);
req.on('connect', function(res, socket, head)
console.log('got connected!');
);
req.end();
waitForBackend();
);
【讨论】:
以上是关于来自 Protractor 测试的裸 HTTP 调用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Protractor 中创建和操作 Promise?