ego (lite) बस एक ब्राउज़र है, ego आपके सभी डिवाइस पर आपका पर्सनल एजेंट है।
वेटलिस्ट में शामिल हों
PlaywrightstorageStateकुकीज़localStorageब्राउज़र ऑटोमेशनego (lite)

Playwright storageState: JSON क्या स्टोर करता है, उसे कैसे लोड करें, और कैसे साबित करें कि काम किया

18 सित॰ 202611 मिनट का रीड
हरा ego (lite) मस्कॉट ताले लगे नीले स्टोरेज यूनिट के बगल में, अनिश्चित कि स्नैपशॉट किस यूनिट में है

Playwright storageState फ़ाइल पूरी दिख सकती है, और फिर भी उस स्टेट को restore न कर पाए जिस पर ऐप असल में निर्भर करता है। कुकीज़ हो सकती हैं, localStorage हो सकता है, JSON पूरी तरह मान्य दिख सकता है, लेकिन sessionStorage डिफ़ॉल्ट से गायब है। अगर ऐप अपने सत्र का हिस्सा वहाँ रखता है, तो फ़ाइल नए context में लोड करने से वह स्टेट वापस नहीं आएगा।

यह फ़र्क इसलिए मायने रखता है क्योंकि storageState स्नैपशॉट है, पूरा ब्राउज़र प्रोफ़ाइल नहीं। Playwright उस स्नैपशॉट को एक्सपोर्ट, लोड, अकाउंट से अलग और जाँचना आसान बनाता है। लेकिन जब काम ऐसे ब्राउज़र स्टेट पर निर्भर करे जो फ़ाइल में साफ़ नहीं बैठता, जैसे sessionStorage, एक्सटेंशन, पहले से साइन-इन प्रोफ़ाइल, या MFA पूरा करता कोई व्यक्ति, तो ego (lite) दूसरा रास्ता लेता है: JSON से दोबारा बनाने की कोशिश के बजाय असली Chromium एनवायरनमेंट जगह पर रखें।

यह गाइड स्नैपशॉट पर ही टिकी रहती है: storageState में क्या है, उसे कैसे बनाएँ और लोड करें, अकाउंट और एनवायरनमेंट कैसे अलग रखें, और कैसे साबित करें कि restore हुआ स्टेट असल में चला। लॉगिन लूप और अपने-आप re-authentication अलग समस्या हैं। यहाँ सवाल सरल है: फ़ाइल ने सच में क्या सेव किया, और क्या छोड़ दिया?

Playwright storageState क्या है?

Playwright storageState एक ब्राउज़र context का सेव किया कुकी और localStorage स्नैपशॉट है। आप उसे तब एक्सपोर्ट करते हैं जब context में पहले से वह स्टेट हो जो आप चाहते हैं, फिर बाद के context को सीड करते हैं ताकि वह खाली jar के बजाय उस स्नैपशॉट से शुरू हो।

आधिकारिक Playwright authentication डॉक्स इस फ़ाइल पर टेस्ट सेटअप बनाते हैं। वह स्नैपशॉट का उपभोक्ता है, स्नैपशॉट की परिभाषा नहीं। यह पेज फ़ाइल पर ही रहता है।

X और LinkedIn की लॉगिन दीवारें यहाँ कवर हैं: लॉगिन दीवारों के पीछे AI स्क्रैपिंग

JavaScript स्क्रैप रूटिंग यहाँ कवर है: JavaScript से वेब स्क्रैपिंग

storageState फ़ाइल में असल में क्या होता है?

फ़ाइल cookies और origins वाला JSON है। cookies, cookie ऑब्जेक्ट का ऐरे है। origins, origin रिकॉर्ड का ऐरे है, हर एक में localStorage name/value जोड़े। Playwright का storageState API path देने पर वह आकार लिखता है, और न देने पर वही ऑब्जेक्ट लौटाता है।

स्टोरstorageState में डिफ़ॉल्ट से?इसका क्या मतलब है
cookiesहाँहर एंट्री name, value, domain, path, expires, httpOnly, secure और sameSite ले जा सकती है।
localStorageहाँ, origins के नीचेorigin से keyed। https://quotes.toscrape.com पर सेव key दूसरे origin पर नहीं दिखती।
sessionStorageनहींJSON में डिफ़ॉल्ट से कोई sessionStorage key नहीं होती। Restore हुए पेज sessionStorage को null पढ़ते हैं।

हमने वह फ़ाइल आकार 2026-09-18 को OpenCode से टेस्ट किया। quotes.toscrape.com पर headed Chromium ने cookies और origins टॉप-लेवल key के साथ storageState एक्सपोर्ट किया। d05-demo, origins localStorage में था। JSON स्ट्रिंग में sessionStorage या d05-session नहीं था।

OpenCode, quotes.toscrape.com पर headed Chromium के बगल में Playwright storageState एक्सपोर्ट कर रहा है
एक्सपोर्ट चरण: बाईं ओर OpenCode, दाईं ओर स्वतंत्र Chromium। कोई लॉगिन फ़ॉर्म नहीं। स्नैपशॉट सार्वजनिक पेज से डमी key के साथ लिया गया है।

Playwright की authentication गाइड कुछ सेटअप में reused स्टेट में IndexedDB और passkeys का भी ज़िक्र करती है। ब्लॉग पोस्ट में लिखे होने से यह न मानें कि वे key मौजूद हैं। जो फ़ाइल आपने बनाई उसे खोलें और टॉप-लेवल key पढ़ें।

Expires या Max-Age के बिना session कुकीज़ प्रोफ़ाइल डायरेक्टरी में अलग जाल हैं। वह डिस्क व्यवहार यहाँ आता है: पर्सिस्टेंट ब्राउज़र सत्र। storageState JSON में कुकी expiry हर कुकी पर एक स्पष्ट फ़ील्ड है। शून्य या बीता timestamp बताता है कि कुकी अगला कैलेंडर दिन नहीं सहेगी।

storageState बनाकर लोड कैसे करें?

उस context से बनाएँ जिसमें पहले से वह स्टेट हो जो आप चाहते हैं। जिस पेज को उसकी ज़रूरत है उसे खोलने से पहले नए context में लोड करें। एक origin से एक्सपोर्ट करके दूसरे origin का localStorage आने की उम्मीद न करें।

import { chromium } from "playwright";

const browser = await chromium.launch();
const setup = await browser.newContext();
const page = await setup.newPage();
await page.goto("https://quotes.toscrape.com/");
await page.evaluate(() => {
  localStorage.setItem("d05-demo", "local-only");
  sessionStorage.setItem("d05-session", "session-only");
});
await setup.storageState({ path: "playwright/.auth/user.json" });
await setup.close();

const reused = await browser.newContext({
  storageState: "playwright/.auth/user.json",
});
const next = await reused.newPage();
await next.goto("https://quotes.toscrape.com/");
const restored = await next.evaluate(() => ({
  local: localStorage.getItem("d05-demo"),
  session: sessionStorage.getItem("d05-session"),
}));
console.log(restored);
await browser.close();

वह स्निपेट पूरा तंत्र है। आधिकारिक Playwright authentication डॉक्स इसे setup प्रोजेक्ट में लपेटते हैं ताकि टेस्ट लॉगिन UI छोड़ दें। रैपर वैकल्पिक है। दोनों कॉल नहीं।

अगर ऐप session token सिर्फ़ sessionStorage में रखता है, तो यह फ़ाइल उसे नहीं ले जाएगी। page.evaluate से sessionStorage कॉपी करें, प्रोसेस ज़िंदा रखें, या असली प्रोफ़ाइल इस्तेमाल करें।

हमने restore उसी OpenCode सत्र में टेस्ट किया। उस फ़ाइल से लोड हुए नए context ने local = local-only और session = null प्रिंट किया।

OpenCode, quotes.toscrape.com पर headed Chromium के बगल में restore हुआ localStorage और खाली sessionStorage दिखा रहा है
Restore जाँच: localStorage वापस आया, sessionStorage नहीं। OpenCode बाईं ओर है, सार्वजनिक quotes पेज दाईं ओर।

कैसे साबित करें कि restore हुआ स्टेट लागू हो गया?

जो key आपने लिखी उसे पढ़कर restore साबित करें, या ऐसे authenticated URL से जिसे सिर्फ़ सेव कुकीज़ खोल सकें। 'लॉगिन फ़ॉर्म गायब है' को सबूत न मानें। Redirect बग भी फ़ॉर्म छिपा सकता है।

await page.goto("https://quotes.toscrape.com/");
const local = await page.evaluate(() => localStorage.getItem("d05-demo"));
if (local !== "local-only") {
  throw new Error("storageState did not restore localStorage");
}

असली अकाउंट के लिए ऐसे URL पर जाएँ जो कुकी मान्य होने पर ही 200 लौटाए, फिर दिखता साइन-इन लेबल assert करें। अगर आप /login पर पहुँचें, तो स्नैपशॉट पुराना है। Re-auth कहीं और है। यहाँ सिर्फ़ फेल चाहिए: इस JSON ने सत्र restore नहीं किया।

जाँचपासफेल
localStorage की keyवह वैल्यू पढ़ता है जो आपने सेव कीलोड के बाद null
sessionStorage की keynull, जब तक आपने खुद कॉपी न की होयह मानना कि localStorage बचा इसलिए यह भी बचा
कुकी expiryजिन कुकीज़ की ज़रूरत है उन पर expires भविष्य में हैexpires 0 है या पहले ही बीत चुका है

अकाउंट और एनवायरनमेंट कैसे अलग रखें?

हर अकाउंट, हर एनवायरनमेंट, हर उस ब्राउज़र context के लिए एक फ़ाइल जिसे आप दोबारा इस्तेमाल करना चाहते हैं। user.json में staging और प्रोडक्शन कुकीज़ मिलाना गलत tenant टेस्ट करने का तरीका है।

JSON में origin, origin-scoped हैं। https://quotes.toscrape.com पर सेव localStorage key, http://quotes.toscrape.com पर नहीं दिखेगी। Scheme, host और port सभी गिने जाते हैं।

playwright/.auth/staging-admin.json
playwright/.auth/staging-viewer.json
playwright/.auth/prod-readonly.json

समानांतर worker को अपनी फ़ाइल या अपना context चाहिए। एक JSON दो context में साझा करना जो फिर वापस लिखें, रेस है। सेटअप के बाद एक्सपोर्ट करें, रन के दौरान read-only लोड करें, और नई फ़ाइल सिर्फ़ समर्पित refresh जॉब से लिखें।

सेव हुआ स्टेट समाप्त कैसे पहचानें?

फ़ाइल मान्य दिख सकती है जबकि साइट सत्र पहले ही रद्द कर चुकी हो। JSON में cookie expires जाँचें, फिर उस लाइव URL को जाँचें जिसे वह कुकी चाहिए।

expires: -1 या 0 वाली कुकी स्नैपशॉट में session कुकी है। वह उसी रन में चल सकती है और बाद में गायब हो सकती है, यह ब्राउज़र उसे कैसे मानता है इस पर निर्भर करता है। बीता timestamp पहले से मरा है। भविष्य का timestamp सर्वर साइड अभी भी रद्द हो सकता है।

लाइव जाँच वही है जो मायने रखती है। लोड के बाद authenticated रूट खोलें। अगर लॉगिन पेज, 401 या anonymous शेल मिले, तो स्नैपशॉट खर्च हो चुका है। फ़ाइल ताज़ा करें। इस पेज पर login-once मशीन न बाँधें।

storageState सुरक्षित कैसे रखें?

JSON को पासवर्ड की तरह रखें। Playwright की अपनी auth गाइड कहती है कि उसमें कुकीज़ और headers हो सकते हैं जो आपका रूप धारण करें। इसे git, लॉग, CI आर्टिफ़ैक्ट और मॉडल कॉन्टेक्स्ट से बाहर रखें।

# .gitignore
playwright/.auth/

CI जॉब शुरू पर सीक्रेट स्टोर से फ़ाइल इंजेक्ट कर सकता है और जॉब खत्म पर मिटा सकता है। प्रिंट न करें। फेल-टेस्ट zip से न जोड़ें। 'सत्र डिबग' करने के लिए एजेंट प्रॉम्प्ट में पेस्ट न करें।

असली ब्राउज़र प्रोफ़ाइल कब दोबारा इस्तेमाल करें?

जब ऐप को कुकीज़ और localStorage से ज़्यादा चाहिए: एक्सटेंशन, sessionStorage, डिवाइस संकेत, या MFA बैठता कोई व्यक्ति, तो असली Chromium प्रोफ़ाइल दोबारा इस्तेमाल करें। JSON फ़ाइल वह नहीं ले जा सकती।

यहीं ego (lite) 0.5.0.32 बैठता है। एजेंट मशीन पर पहले से मौजूद रोज़ के ब्राउज़र प्रोफ़ाइल के ख़िलाफ़ अलग Space में चलता है। टैब देखा जा सकता है, प्रॉम्प्ट पर नियंत्रण लिया जा सकता है, और काम रोका जा सकता है। उस वर्शन का changelog 2026-09-12 को ego (lite) चेंजलॉग पर है। यह storageState एक्सपोर्टर नहीं है। यह वह रास्ता है जो फ़ाइल गलत आकार की हो तो उसे छोड़ देता है।

हमने वह आइसोलेशन ego (lite) में OpenCode से टेस्ट किया। Spaces ओवरव्यू ने quotes काम को उसके अपने चलते Space में रखा, बाकी काम अलग Space में, सत्र को JSON से दोबारा बनाने के बजाय।

quotes storageState काम अपने Space में चलते हुए, ego (lite) Spaces ओवरव्यू के बगल में OpenCode
असली ब्राउज़र जगह पर रहता है। एक Space quotes काम चलाता है; बाकी काम दूसरे Space में रहता है।

हमने वही सार्वजनिक URL उन Space में से एक के अंदर टेस्ट किया। Space 6, quotes.toscrape.com पर एजेंट नियंत्रण में रहा, Take over और Stop दिख रहे थे। ब्राउज़र एनवायरनमेंट जगह पर रहा, JSON स्नैपशॉट से दोबारा बनाए जाने के बजाय।

OpenCode, ego-browser चलाते हुए quotes.toscrape.com पर एक ego (lite) Space के बगल में, Agent is in control, Take over और Stop के साथ
देखी जा रही प्रोफ़ाइल का रास्ता: बाईं ओर OpenCode, दाईं ओर एक ego (lite) Space, सार्वजनिक quotes पेज पर अभी भी एजेंट नियंत्रण में।

अगर localStorage वापस आए और sessionStorage null हो, तो फ़ाइल ने अपना काम किया। गायब लॉगिन फ़ॉर्म को सबूत न मानें। 2026-09-18 को restore हुए context ने डमी key से local = local-only और session = null प्रिंट किया, बिना पासवर्ड फ़ॉर्म के।

चुनौतियाँ और सीमाएँ क्या हैं?

फ़ाइल पूरी दिखती है और फिर भी वह स्टोर छोड़ देती है जिसका ऐप असल में उपयोग करता है। यही डिफ़ॉल्ट फेलियर है।

Origin मिसमैच दूसरा है। localhost:3000 पर सेव करें, 127.0.0.1:3000 पर लोड करें, और localStorage खाली होता है जबकि कुकीज़ domain के हिसाब से अभी भी चिपक सकती हैं।

तीसरा, इस पेज को लॉगिन कोरियोग्राफी से भर देना। 401 पहचानना, /login पर उछालना, और स्नैपशॉट ताज़ा करना असली काम हैं। वे इस फ़ाइल का काम नहीं हैं।

अक्सर पूछे जाने वाले प्रश्न

क्या Playwright storageState में कुकीज़ होती हैं?

हाँ। cookies JSON में टॉप-लेवल ऐरे है। हर कुकी में name, value, domain, path, expires, httpOnly, secure और sameSite हो सकते हैं।

क्या storageState में localStorage होता है?

हाँ, origins के नीचे। हर origin रिकॉर्ड उसी origin के localStorage name/value जोड़े रखता है।

क्या storageState में sessionStorage होता है?

डिफ़ॉल्ट से नहीं। पेज sessionStorage लिख सकता है, storageState एक्सपोर्ट कर सकता है, और फिर भी बिना sessionStorage key का JSON बना सकता है। Restore हुआ context उस स्टोर को खाली पढ़ता है। 2026-09-18 को headed रन ने local = local-only और session = null restore किया।

storageState फ़ाइल कैसे बनाऊँ?

जब context में पहले से वे कुकीज़ और localStorage हों जो आप चाहते हैं, तब await context.storageState({ path: 'playwright/.auth/user.json' }) कॉल करें।

नए context में storageState कैसे लोड करूँ?

browser.newContext में storageState: 'playwright/.auth/user.json' पास करें। जिस पेज को स्नैपशॉट चाहिए उस पर नेविगेट करने से पहले लोड करें।

कैसे पता चले कि restore हुआ स्टेट चला?

जो localStorage key आपने सेट की उसे पढ़ें, या ऐसा URL खोलें जिसे सिर्फ़ सेव कुकीज़ पहुँच सकें। गायब लॉगिन chrome सबूत नहीं है।

क्या storageState git में commit करूँ?

नहीं। playwright/.auth/ को .gitignore में डालें। फ़ाइल उस अकाउंट का रूप धारण कर सकती है जिसे उसने कैप्चर किया।

क्या दो टेस्ट एक storageState फ़ाइल साझा कर सकते हैं?

वे वही स्नैपशॉट read-only लोड कर सकते हैं। समानांतर worker को एक ही फ़ाइल लिखने न दें। अकाउंट अलग हों तो हर भूमिका की एक फ़ाइल रखें।

असली ब्राउज़र प्रोफ़ाइल कब इस्तेमाल करूँ?

जब ऐप को sessionStorage, एक्सटेंशन, या MFA के लिए व्यक्ति चाहिए। ego (lite) वह काम आपके रोज़ के Chromium प्रोफ़ाइल के ख़िलाफ़ किसी Space में चलाता है।

क्या storageState, user data directory के बराबर है?

नहीं। storageState JSON स्नैपशॉट है। user data directory डिस्क पर प्रोफ़ाइल है।

अगर अगले काम को JSON स्नैपशॉट के बजाय असली साइन-इन ब्राउज़र चाहिए, तो ego (lite) मुफ़्त डाउनलोड करें