Tìm kiếm trang web

javascript - Cách tải JSON qua get vào biến trong script CasperJS


Tôi đang sử dụng đoạn mã sau để tải một số dữ liệu JSON vào một biến trong kịch bản casperJS của tôi:

var casper = require("casper").create({
    verbose: true,
    logLevel: 'debug',
    pageSettings: {
        userName: 'dev',
        password: 'devpass',
    } 
});
var baseUrl = 'http://mysite.com/';

casper.start().then(function() {
    this.open(baseUrl + 'JSON-stuff', {
        method: 'get',
        headers: {
            'Accept': 'application/json'
        }
    });
});

casper.run(function() {
    var journalJson = JSON.parse(this.getPageContent());
    require('utils').dump(journalJson);  //this returns my json stuff as expected
    this.exit();
});

Điều này hoạt động như tôi muốn - tôi có đối tượng journalJson mà tôi cần để thực hiện xử lý của mình. Tuy nhiên, tôi không chắc làm thế nào để tiếp tục với việc kiểm tra của mình. Các hàm khác được thêm vào casper.run() không thực thi như mong đợi... ví dụ, nếu tôi thay đổi hàm casper run thành:

casper.run(function() {
    var journalJson = JSON.parse(this.getPageContent());
    require('utils').dump(journalJson);
    this.open(baseUrl).then(function () {
        this.assertExists('#header');
    });
    this.exit();
});

sau đó phantomjs ghi lại rằng URL đã được yêu cầu, nhưng bài kiểm tra không bao giờ được chạy.

Câu hỏi của tôi: Làm thế nào để tôi có thể truy cập JSON thông qua get, và sau đó sử dụng nó để thực hiện các bài kiểm tra? Tôi nghĩ rằng tôi đang thiếu điều gì đó ở đây...

Câu trả lời #1

Bạn đang gọi casper.exit() trước khi callback then của bạn có thể được thực hiện.

Thử cái gì đó như thế này thay vào đó:

casper.then(function() { // <-- no more run() but then()
    var journalJson = JSON.parse(this.getPageContent());
    require('utils').dump(journalJson);
});

casper.thenOpen(baseUrl, function() {
    this.test.assertExists('#header'); // notice: this.test.assertExists, not this.assertExists
});

casper.run(function() {
    this.test.done();
});