Phantomjs: تعذر حذف ملف تعريف الارتباط عبر document.cookie من الصفحة المحلية

تم إنشاؤها على ٢٤ مايو ٢٠١٣  ·  5تعليقات  ·  مصدر: ariya/phantomjs

أعتقد أنني وجدت خطأ في التعامل مع ملفات تعريف الارتباط. يعمل بشكل جيد عندما أقوم بتقديم طلب http عن بعد إلى صفحة html الخاصة بي أو إذا قمت بتمرير جافا سكريبت الخاص بي مباشرة إلى phantomjs. ولكن عندما أستخدم أداة تحميل الصفحات لتحميل html / javascript محليًا ، لا يتم حذف ملفات تعريف الارتباط بشكل صحيح.

هذا هو كود الاختبار الخاص بي:

ملف "run.js":

var page = require('webpage').create();
var url = 'cookiebug.html';
page.onConsoleMessage = function(msg) {
        console.log(msg);
};
page.open(url, function (status) {
        phantom.exit();
});
ملف "cookiebug.html":
<script type="text/javascript">


function setCookie(name, val, timeout) {
        console.log("Setting cookie  " + name + " to value " + val);
        timeout = typeof timeout !== 'undefined' ? timeout : (100 * (86400 * 365)); // defaults to 100 years
        timeout *= 1000; // ms to seconds
        var d = new Date();
        d.setTime(d.getTime() + timeout);
        var cookie = name + "=" + encode(val) + ";expires=" + d.toUTCString() + ";path=/";
        document.cookie = cookie;
}

function getCookie(name) {
        var i, x, y, c = document.cookie.split(";");
        for (i = 0; i < c.length; i++) {
                x = c[i].substr(0, c[i].indexOf("="));
                y = c[i].substr(c[i].indexOf("=") + 1);
                x = x.replace(/^\s+|\s+$/g, "");
                if (x == name) {
                        return decode(y);
                }
        }
        return "";
}

function encode(val) {
        if (window.encodeURIComponent) {
                return encodeURIComponent(val);
        } else {
                //noinspection JSDeprecatedSymbols
                return escape(val);
        }
}

function decode(val) {
        if (window.decodeURIComponent(val)) {
                return decodeURIComponent(val);
        } else {
                //noinspection JSDeprecatedSymbols
                return unescape(val);
        }
}

function deleteCookie(name)
{
        console.log("Delete cookie: " + name);
        document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}

var testcookie = "testcookie";

console.log("Testing cookies");
setCookie(testcookie, "testValue", 300);
console.log("Cookie set");
console.log("Getting cookie: " + getCookie(testcookie));
deleteCookie(testcookie);
console.log("Getting cookie after delete: " + getCookie(testcookie));


</script>
ضع كلا الملفين في نفس الدليل ثم قم بتشغيله باستخدام: phantomjs run.js الناتج المتوقع هو طباعة السطر الأخير: "الحصول على ملف تعريف الارتباط بعد الحذف:" ولكنه في الواقع "الحصول على ملف تعريف الارتباط بعد الحذف: testValue" لقد وجدت هذا الخطأ لأن أنا أستخدم qunit runner.js لتحميل صفحة qunit html الخاصة بي ، ويقوم اختباري بمجموعة / الحصول على ملفات تعريف الارتباط الشاملة. إليك تشغيل مع --debug = نعم ، يظهر انتهاء الصلاحية غير الصحيح عند استدعاء deleteCookie:
 اختبار ملفات تعريف الارتباط
 تعيين ملف تعريف الارتباط الخاص باختبار ملف تعريف الارتباط على قيمة testValue
 2013-05-24T10: 37: 54 [DEBUG] CookieJar - محفوظ "testcookie = testValue ؛ تنتهي الصلاحية = الجمعة ، 24-مايو -2013 17:42:54 GMT ؛ المسار = /"
 مجموعة ملفات تعريف الارتباط
 الحصول على ملف تعريف الارتباط: testValue
 حذف ملف تعريف الارتباط: testcookie
 2013-05-24T10: 37: 54 [DEBUG] CookieJar - محفوظ "testcookie = testValue ؛ تنتهي الصلاحية = الجمعة ، 24-مايو -2013 17:42:54 GMT ؛ المسار = /"
 الحصول على ملف تعريف الارتباط بعد الحذف: testValue
 2013-05-24T10: 37: 54 [DEBUG] CookieJar - محفوظ "testcookie = testValue ؛ تنتهي الصلاحية = الجمعة ، 24-مايو -2013 17:42:54 GMT ؛ المسار = /"
stale

التعليق الأكثر فائدة

يعد PhantomJS أكثر صعوبة في إزالة مفاتيح ملفات تعريف الارتباط من document.cookie عند مقارنتها بمتصفح Firefox أو Chrome أو Safari. يجب عليك حذف القيم بجميع سمات ملفات تعريف الارتباط المناسبة التي قمت بتعيينها فيها.

في مثالك ، كادت تحصل عليه ، وقد واجهت موقفًا مشابهًا بنفسي. إلى جانب القيمة الفارغة وتاريخ انتهاء الصلاحية ، كان عليّ أيضًا تحديد المجال الذي تم تعيين ملف تعريف الارتباط حاليًا:

document.cookie = 'byebye_cookieval=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=127.0.0.1'

هذا مكنني من حذف مفتاح ملف تعريف الارتباط بنجاح.

ال 5 كومينتر

لقد واجهت مشكلة مماثلة. لا يمكنني فقط حذف ملفات تعريف الارتباط عبر اختبارات QUnit ، ولكن يتم تجاهل أي ملف تعريف ارتباط أقوم بتعيينه مع وقت انتهاء الصلاحية (لم يتم تعيينه).

أيضا لدينا هذه المشكلة.

يعد PhantomJS أكثر صعوبة في إزالة مفاتيح ملفات تعريف الارتباط من document.cookie عند مقارنتها بمتصفح Firefox أو Chrome أو Safari. يجب عليك حذف القيم بجميع سمات ملفات تعريف الارتباط المناسبة التي قمت بتعيينها فيها.

في مثالك ، كادت تحصل عليه ، وقد واجهت موقفًا مشابهًا بنفسي. إلى جانب القيمة الفارغة وتاريخ انتهاء الصلاحية ، كان عليّ أيضًا تحديد المجال الذي تم تعيين ملف تعريف الارتباط حاليًا:

document.cookie = 'byebye_cookieval=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=127.0.0.1'

هذا مكنني من حذف مفتاح ملف تعريف الارتباط بنجاح.

إذن machadolab يحتاج إلى تحديد نفس المسار؟ منطقي. نأمل أن تحتاج فقط إلى المجال إذا تجاوزته عند تعيين ملف تعريف الارتباط.

نظرًا لقدرتنا المحدودة جدًا على الصيانة ، نحتاج إلى إعطاء الأولوية لتركيز التطوير لدينا على المهام الأخرى. لذلك ، سيتم إغلاق هذه المشكلة تلقائيًا (انظر # 15395 لمزيد من التفاصيل). في المستقبل ، إذا رأينا الحاجة إلى معالجة هذه المشكلة مرة أخرى ، فسيتم إعادة فتحها. شكرا لمساهمتك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات