使用PhantomJS将自定义变量传递给onResourceRequested

时间:2017-02-28 12:53:01

标签: javascript phantomjs automated-tests build-automation headless

为了避免使用我们的分析标记进行回归,我想使用PhantomJS自动测试Adobe Analytics标记。

为此,我希望能够测试两件事:

  • HTML源代码中存在某些js变量声明
  • 将HTML源代码中的变量与对Adobe Analytics进行的Ajax调用进行比较,并确保它们具有相同的值

我想要间谍的HTML源代码中的变量的例子:

<script>s.events="event27";</script>

这是我到目前为止的js测试脚本:

"use strict";

if (!String.prototype.contains) {
    String.prototype.contains = function (arg) {
        return !!~this.indexOf(arg);
    };
}

var page = require('webpage').create();

page.onResourceRequested = function(request) {
    var obj = JSON.stringify(request, undefined, 4);

    var needle = '2o7';
    var url = request.url;

    if (url.contains(needle)) {
        var calledUrl = decodeURI(decodeURIComponent(url));
        console.log(calledUrl);
    }
};

page.onResourceReceived = function(response) {
    var jsonResponse = JSON.stringify(response, undefined, 4);
};

page.open('http://www.domain.com/page.html', function() {
    var s_account = page.evaluate(function () {
        return window.s_account;
    });

    var s_events = page.evaluate(function () {
        return window.s.events;
    });

    phantom.exit();
});

我希望能够将s_account和s_events变量传递给onResourceRequested函数,这样我就可以在这两个变量和_UET参数中声明相同的函数。

但我无法弄清楚该怎么做。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:-1)

我找到了办法。

我实际上从onResourceRequested回调中获取了window.s_account的内容:

page.onResourceRequested = function(request) {
    var obj = JSON.stringify(request, undefined, 4);

    var needle = '2o7';
    var url = request.url;

    var result = false;


    if (url.contains(needle)) {
        var s_account = page.evaluate(function () {
            return window.s_account;
        });

        result = true;
        var calledUrl = decodeURI(decodeURIComponent(url));

        console.log(s_account);
    }
};

这可能不是最优雅的方式,但它有效。