2014-06-13 23 views
0

在Django項目,我用這種方式訪問CKEditor的

CKEDITOR.replace('id_content', { 
    toolbar: 'Basic', 
    readOnly: {{ editing|yesno:"false,true" }} 
}); 

,並在我的casperjs腳本加載CKEditor的我試圖進入編輯器以這種方式

var ckeditor = this.evaluate(function() { 
     return document.querySelector('#id_content').contentWindow.CKEDITOR; 
}); 

ckeditor.instances.id_content.setData('<p>AAA bbb CCC</p>'); 

基於我在這個崗位access-javascript-ckeditor-object-within-an-iframe讀,但控制檯輸出如下

FAIL TypeError: 'null' is not an object (evaluating 'ckeditor.instances') 

任何想法?謝謝!

編輯:

如果我嘗試做所有的東西評價方法CKEditor的內容沒有變化。下面的代碼

var ckeditor = this.evaluate(function() { 
    var ckeditor = document.querySelector('#id_content').contentWindow.CKEDITOR; 
    ckeditor.instances.id_content.setData('<p>AAA bbb CCC </p>'); 
}); 

this.test.assertField('content', '<p>AAA bbb CCC</p>'); 

失敗的輸出

FAIL "content" input field has the value "<p>AAA bbb CCC</p>" 
# type: assertField 
# code: this.test.assertField('content', '<p>AAA bbb CCC</p>'); 
# subject: false 
# inputName: "content" 
# actual: "<p>In et qui nobis eos. Rem impedit ullam nihil placeat in. Et ea explicabo earum quam. Earum rerum ipsum ea soluta.</p>\n" 
# expected: "<p>AAA bbb CCC</p>" 

回答

1

你不可錯過的功能,並從頁面上下文中casperjs(和phantomjs)。您只能傳遞數字,字符串,[]和{}等基元。所以contentWindow.CKEDITOR可能是用new創建的對象。你需要做的頁面上下文裏面所有的東西,只是通過必要的字符串到頁面上下文:

var data = '<p>AAA bbb CCC</p>'; 
this.evaluate(function (contendata) { 
     var ckeditor = document.querySelector('#id_content').contentWindow.CKEDITOR; 
     ckeditor.instances.id_content.setData(contendata); 
}, data); 

要確保的CKEditor來得及做出的所有調整到頁面上,你可以wait一點:

this.thenEvaluate(function (contendata) { 
     var ckeditor = document.querySelector('#id_content').contentWindow.CKEDITOR; 
     ckeditor.instances.id_content.setData(contendata); 
}, data); 
this.wait(1000, function(){ 
    this.test.assertField('content', '<p>AAA bbb CCC</p>'); 
}); // sec 

甚至等待具體數據:

var x = require("casper").selectXPath; 
this.thenEvaluate(function (contendata) { 
     var ckeditor = document.querySelector('#id_content').contentWindow.CKEDITOR; 
     ckeditor.instances.id_content.setData(contendata); 
}, data); 
this.waitForSelector(x("//*[contains(text(),'AAA bbb CCC')]"), function(){ 
    this.test.assertField('content', '<p>AAA bbb CCC</p>'); 
}); 
+0

的建議是正確的,但內容依然不改。 –

+0

@SalvatoreAvanzo我不熟悉'ckeditor',所以我不知道這是你打的電話。另外,你如何檢查它是否不正確?你做了一個截圖嗎?在這之前你可能需要「等待」。 –