来自量角器测试的裸HTTP调用

时间:2014-01-10 22:54:18

标签: javascript node.js angularjs protractor

My Protractor测试需要一些数据设置,我想通过向运行的服务器发送一系列POST和PUT来实现。

所以,问题是:如何从Protractor测试中执行“裸”HTTP调用?

我发现的一种方法是使用Node Http模块,但它有点笨拙。我想知道这些问题通常是如何解决的 - 量角器是否暴露了什么?是否可以使用Http(以及其他需要的Node模块)?还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

如果您在Angular应用程序中有一项服务可以调用以创建测试对象,那么我在此处描述了一个技巧:

Accessing Angular inside Protractor Test

几周前,我做了关于量角器的演讲。以下是该技术的一个示例:

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

您可以使用量角器注入模块,然后调用它。

答案 1 :(得分:2)

不依赖于Angular的另一种方法是在XMLHttpRequest内手动创建browser.executeAsyncScript。如果您需要在角度加载之前或导航到页面之前作为测试设置的一部分进行调用,这将特别有用。

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']);
});

答案 2 :(得分:0)

为了从量角器进行裸http调用,你需要使用来自节点js的HTTP模块......这是我们在这种情况下使用的简单解决方案

  1. 量角器测试脚本从休息终点获取数据
  2. 量角器测试脚本从网页获取数据
  3. protract测试脚本根据网页上的数据验证此数据
  4. 那么如何让HTTP调用休息终点

    使用此文档https://nodejs.org/api/http.html#http_http_get_options_callback

    这是代码段

    你需要

    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();
        });