3

我正在使用 Test'em 和 Mocha(在 node.js 上运行)制作一个测试平台,以测试 PHP 网站。

我想要的是请求一些 URL(例如http://www.my-website/test.php)并获取 http 状态代码以及返回的内容。

我正在使用 node.js请求模块。

问题是:

我需要通过身份验证才能访问此页面,否则我将被重定向到登录页面。

那么,是否存在一种通过 Node.js 登录我的应用程序并保持会话打开以便能够在我想要的任何页面上链接测试的方法?

如果可能的话,我正在考虑在登录请求中获取 PHPSESSID。你觉得这是一个好的方向吗?

任何帮助将非常感激。

感谢您有一个愉快的一天 :)

迈克尔

4

3 回答 3

4

如果您jar: true选项中设置或使用您自己的自定义 cookie jar,那么request将记住服务器设置的 cookie,以便您可以在请求之间保持会话。

于 2014-05-26T15:34:06.620 回答
3

mscdex 感谢您的回答!但不幸的是,它对我不起作用:/

hyubs 也感谢你。

最后我继续使用 Mocha + Request。

基本上我所做的是:

  1. 通过 POST 请求连接到登录页面并获取响应标头中返回的 PHPSESSID cookie。

  2. 在下一个请求的标头中传递 cookie,这些请求以您必须记录的 URL 为目标。

这是我的代码:

var params = {
    email: 'your_username',
    password: 'your_password'
};
var paramsString = JSON.stringify(params);

// Login to the application
request.post('http://localhost/biings/front-end/rest/auth',
{ 
    headers: {
        "Content-Type" : "application/json",
        'Content-Length' : paramsString.length
    },
    body: paramsString,
},function (error, response, body) {
    // get the PHPSESSID (the last one) that is returned in the header. Sometimes more than one is returned
    var sessionCookie = response.headers['set-cookie'][response.headers['set-cookie'].length - 1];
    sessionCookie = sessionCookie.split(';');
    sessionCookie = sessionCookie[0];
    // Write it in a file (this is a quick trick to access it globally)
    // e.g.: PHPSESSID=ao9a1j0timv9nmuj2ntt363d92 (write it simply as a string)
    fs.writeFile('sessionCookie.txt', sessionCookie, function (err) 
    {
        if(err)
        {
            return console.log(err);
        } 
    });
});

// don't care about this it() function (it's for Mocha)
it("test 1", function(done)
{
    // Get the cookie
    fs.readFile('sessionCookie.txt','utf8', function (err, data) 
    {
        if(err)
        {
             throw err; 
        }
        else
        {
         // Launch a request that includes the cookie in the header
         request.get('http://localhost/biings/front-end/rest/group', 
         {
              headers: {"Cookie" : data},
         }, function (error, response, body) {
             // Check your request reaches the right page
                 expect(response.statusCode).equals(200);
             console.log(body);
                 done();
         });
        }
    }); 
});

它对我来说就像一个魅力。

如果您发现有问题或可以优化的地方,请告诉我 :)

迈克尔

于 2014-05-27T15:32:44.407 回答
1

不要使用请求模块,而是使用PhantomJSzombie.js等无头浏览器。您甚至可以模拟用户与这些的交互。

于 2014-05-26T15:37:53.613 回答