我对CasperJS进行了以下测试:
this.fillSelectors("#registration-form", {
"#first-name": "Bob",
"#last-name": "Smith",
"#email-address": RANDOM_EMAIL,
"#password": PASSWORD,
"#password-confirm": PASSWORD
}, true);
我希望能够与此一起发送HTTP标头。如果没有“手动”发布表单,我似乎找不到找到这种方法的方式,这不是我想要的测试。
有一种比下面的方法更简单的方法。您可以访问casper.page.customHeaders
PhantomJS的Webpage实例的属性。
casper.then(function() {
casper.page.customHeaders = {
"CuStOm": "Header"
}; // set headers
this.fillSelectors("#registration-form", { /*...*/ }, true);
});
casper.then(function() {
casper.page.customHeaders = {}; // reset headers
});
问题在于,此方法会将您的自定义标头添加到每个请求,直到再次禁用它为止。您可以尝试基于setTimeout
或直接在后面重置标题fillSelectors
。
您无法在浏览器中设置表单提交的标题。__utils__.sendAJAX
也没有提供自定义标头。
您将需要使用XMLHttpRequest发送请求。以下函数替换表单的提交处理程序以发送Ajax调用并等待:
casper.thenFormToXHR = function(formSelector, data, customHeaders){
this.thenEvaluate(function(formSelector, customHeaders){
// see https://stackoverflow.com/a/19838177/1816580
function submitForm(oFormElement) {
window.__requestDone = false;
var xhr = new XMLHttpRequest();
for(var header in customHeaders) {
xhr.setRequestHeader(header, customHeaders[header]);
}
xhr.onload = function(){
window.__requestDone = true;
};
xhr.open (oFormElement.method, oFormElement.action, true);
xhr.send (new FormData(oFormElement));
return false;
}
document.querySelector(formSelector).onsubmit = submitForm;
}, formSelector, customHeaders);
this.then(function(){
this.fillSelectors(formSelector, data, true);
});
this.waitFor(function check(){
return this.evaluate(function(){
return window.__requestDone;
});
});
};
然后可以像这样调用:
casper.thenFormToXHR("#registration-form", {
"#first-name": "Bob",
"#last-name": "Smith",
"#email-address": RANDOM_EMAIL,
"#password": PASSWORD,
"#password-confirm": PASSWORD
}, {
"X-Requested-With": "XMLHttpRequest" // here should be your custom headers
});
如果您不需要等待XHR完成,则可以减少代码:
casper.formToXHR = function(formSelector, data, customHeaders){
this.evaluate(function(formSelector, customHeaders){
// see https://stackoverflow.com/a/19838177/1816580
function submitForm(oFormElement) {
var xhr = new XMLHttpRequest();
for(var header in customHeaders) {
xhr.setRequestHeader(header, customHeaders[header]);
}
xhr.open (oFormElement.method, oFormElement.action, true);
xhr.send (new FormData(oFormElement));
return false;
}
document.querySelector(formSelector).onsubmit = submitForm;
}, formSelector, customHeaders);
this.fillSelectors(formSelector, data, true);
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句