0

下面是我使用 casperjs 和 mockjax 的代码。但是,mockjax 不能拦截 ajax 调用。它返回 ajax 响应而不是模拟响应。此外, $.mockjax.mockedAjaxCalls().length 这不会打印任何东西。知道我在这里做什么吗?

除了外部评估上下文之外,有什么方法可以实际打印 $.mockjax.mockedAjaxCalls() 的值吗?请注意,mock4.png 确实显示了一个屏幕截图,表明 mockjax 回调没有发生。

var casper = require("casper").create({
    verbose: true,
    logLevel: 'error',
    clientScripts: ["jquery.mockjax.js", "jquery.js", "json2.js"]
});

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
})

casper.start('http://xyz:9000/abc', function() {
    this.evaluate(function() {
        this.capture('1.png')
        $.mockjax({
            url: '/foo1',
            responseTime: 100,
            dataType: 'json',
            responseText: {
                sessionTimeoutRedirectUrl: "https://foo/hello",
                errorCode: "error.session.timeout"
            }
        });
    });
    this.capture('xyz123.png');
});


casper.waitForSelector('#order-wrapper', function() {
    this.click('#method-field-cc');
    this.capture('mock2.png');
});
casper.waitForSelector('#cc-card-number', function() {

    this.capture('mock.png');
    this.fillSelectors('form[id="cc-form"]', {
        'input[id="cc-card-number"]': '4112344112344113',
        'input[id="cc-first-name"]': 'first',
        'input[id="cc-last-name"]': 'last',
        'select[id="cc-expiry-month"]': '10',
        'select[id="cc-expiry-year"]': '2016',
        'input[id="tax-field-postal-code"]': '95051',
        'input[id="cc-security-code"]': '123'
    }, true);
    this.click('#review-newcc');
    this.capture('mock3.png');

});

casper.wait(1000, function() {
    this.echo("I've waited for a second.");
    casper.evaluate(function() {
        this.echo("I've waited for a second." + $.mockjax.mockedAjaxCalls().length)
        console.log($.mockjax.mockedAjaxCalls());
    });


});
casper.evaluate(function() {
    this.echo("I've waited for a second." + $.mockjax.mockedAjaxCalls().length)
});
casper.wait(1000, function() {
    this.capture('mock4.png')

});

casper.run();
4

2 回答 2

0

casper.evaluate回调内部是页面上下文。外部的casper实例或任何其他变量在此处不可用。所以,thisinside 不是指casper实例,而是指window页面的实例。它不太可能具有captureecho功能。将这些调用移出evaluate回调到 casper 上下文。在您执行此操作之前,请注册该page.error事件并查看它们是否会产生错误。

另一个问题是您在添加 jQuery 之前添加了 mockjax。由于 mockjax 是一个 jQuery 插件,你至少应该将clientScripts. 完全删除可能会更好jquery.js,因为它会覆盖页面中的那个。

于 2015-01-11T10:07:08.143 回答
0

Mockjax 将覆盖 jQuery 的接口来捕获 ajax 调用,并返回预定义的响应。您需要将 mockjax 放在 jQuery.js clientScripts 之后: ["jquery.js", "json2.js", "jquery.mockjax.js"]

另一个更稳定和通用的解决方案是 JSMockServer。https://github.com/gaisanshi/JSMockServer

于 2015-06-24T22:10:12.190 回答