来自 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 e2e 测试登录重定向

如何在 Protractor 中创建和操作 Promise?

protractor端到端测试例子

使用 Protractor+AXIOS 进行 API 测试

使用 Selenium / Protractor 进行测试时从网站获取注入的 javascript

我无法使用 protractor-perf 运行测试示例