javascript - 在表单提交 CasperJS 中发送 http header

标签 javascript http-headers phantomjs form-submit casperjs

我有一个 CasperJS 的测试步骤,它执行以下操作:

this.fillSelectors("#registration-form", {
    "#first-name": "Bob",
    "#last-name": "Smith",
    "#email-address": RANDOM_EMAIL,
    "#password": PASSWORD,
    "#password-confirm": PASSWORD
}, true);

我希望能够与此一起发送 HTTP header 。如果不“手动”发布表单,我似乎无法找到执行此操作的方法,这不是我想要的那种测试。

最佳答案

有一种比下面的方法更简单的方法。您可以访问 casper.page.customHeaders PhantomJS 的网页实例的属性。

casper.then(function() {
    casper.page.customHeaders = {
        "CuStOm": "Header"
    }; // set headers
    this.fillSelectors("#registration-form", { /*...*/ }, true);
});

casper.then(function() {
    casper.page.customHeaders = {}; // reset headers
});

问题是此方法会将您的自定义 header 添加到每个请求,直到您再次禁用它为止。您可以尝试根据 setTimeout 或直接在 fillSelectors 后面重置 header 。


cannot set headers for a form submission在浏览器中。 __utils__.sendAJAX也不提供自定义 header 。

您将需要使用 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);
};

关于javascript - 在表单提交 CasperJS 中发送 http header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268647/

相关文章:

javascript - 5x5显示屏上的平滑点,如何避免阶梯效应?

javascript - 折叠 JSON 字符串以在 header 变量中发送 - Mailgun

ruby-on-rails - Capybara、Poltergeist 和 Reactjs - 'undefined' 不是函数

javascript - Javascript 中哈希的 Rails 哈希

javascript - Angular 6 promise

linux - HTTP header 和错误页面 - NGINX

java - spring-boot报 "400 bad request"错误,具体如下

javascript - PhantomJS javascript 等待函数完成

c# - (502) 网关 PhantomJS 驱动程序初始化错误

javascript - Instruments:UI Automation:iPhone app - 如何使用 NSRect 参数点击 "null"按钮?