[{"data":1,"prerenderedAt":665},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"doc-\u002Fdocs\u002Fconcepts\u002Fbrowser-context-page":17,"docs-nav":559,"nav-compare":633,"editor-9za70s":643,"editor-1nfvzvd":645,"editor-1rmnpix":647,"editor-svb620":649,"editor-1ylj6cl":651,"editor-ng7dil":653,"editor-itxzg0":655,"editor-aer7i5":657,"editor-1xi81aq":659,"editor-1ihp755":661,"editor-jz13n8":663},["Island",4],{"key":5,"result":6},"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0",{"head":7},{"style":8},[9,11,13,15],{"innerHTML":10},".site-footer[data-v-8bb1d4ae]{border-top:1px solid var(--line);background:var(--chrome);padding:var(--sp-8) var(--gutter) var(--sp-10);gap:var(--sp-6);flex-direction:column;display:flex}.links[data-v-8bb1d4ae]{gap:var(--sp-4);grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));max-width:62rem;display:grid}.links a[data-v-8bb1d4ae]{align-items:flex-start;gap:var(--sp-3);padding:var(--sp-3);border-bottom:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);border:1px solid var(--line);display:flex}.links a[data-v-8bb1d4ae]:focus-visible,.links a[data-v-8bb1d4ae]:hover{border-color:var(--line-strong)}.links[data-v-8bb1d4ae] .mark,.links[data-v-8bb1d4ae] .rf-mark{width:1.35rem;height:1.35rem;color:var(--dim);flex:none;margin-top:.1rem}.links a[data-v-8bb1d4ae]:hover .mark,.links a[data-v-8bb1d4ae]:hover .rf-mark{color:var(--red)}.links span[data-v-8bb1d4ae]{flex-direction:column;gap:2px;min-width:0;display:flex}.links b[data-v-8bb1d4ae]{font-family:var(--font-display);font-size:.85rem;font-weight:400}.links small[data-v-8bb1d4ae]{color:var(--faint);font-size:.78rem}.colophon[data-v-8bb1d4ae]{color:var(--faint);margin:0;font-size:.75rem}@supports (corner-shape:bevel){.links a[data-v-8bb1d4ae]{corner-shape:bevel}}",{"innerHTML":12},".mark[data-v-cc0d96a5]{vertical-align:-.125em;flex:none;width:1em;height:1em}",{"innerHTML":14},".mark[data-v-26f5673d]{vertical-align:-.125em;flex:none;width:1em;height:1em}",{"innerHTML":16},".rf-mark[data-v-26317b3e]{fill:currentColor;stroke:none;flex:none}",{"id":18,"title":19,"body":20,"description":550,"extension":551,"meta":552,"navigation":553,"order":83,"path":554,"section":555,"seo":556,"stem":557,"__hash__":558},"docs\u002Fdocs\u002Fconcepts\u002Fbrowser-context-page.md","Browser, context and page",{"type":21,"value":22,"toc":536},"minimark",[23,27,38,41,46,51,54,59,62,72,86,94,99,118,127,131,134,137,146,149,152,192,199,218,221,236,240,250,254,257,294,310,335,339,345,354,359,363,370,376,379,404,419,435,439,453,460,464,479,489,493,497,500,504,532],[24,25,26],"p",{},"Browser works in three layers. Almost every question about isolation, speed, or\n\"why is this test seeing the previous test's login\" is answered by knowing which\nlayer you are on.",[28,29,35],"pre",{"className":30,"code":32,"language":33,"meta":34},[31],"language-text","Browser · chromium\n│\n├── Context 1 · alice\n│   ├── Page · tab\n│   └── Page · tab\n│\n└── Context 2 · bob\n    └── Page · tab\n","text","",[36,37,32],"code",{"__ignoreMap":34},[24,39,40],{},"One browser process, two signed-in users, three tabs. The two contexts share\nnothing — separate cookies, separate storage, separate permissions — which is\nthe whole reason the layers are worth learning.",[42,43],"doc-table",{":head":44,":rows":45},"[\"Layer\",\"Is\",\"Costs\",\"Opened with\"]","[[\"**Browser**\",\"A Chromium, Firefox or WebKit process\",\"Slowest\",\"`New Browser`\"],[\"**Context**\",\"An isolated session inside it\",\"Cheapest\",\"`New Context`\"],[\"**Page**\",\"A tab, with its own history\",\"Cheap\",\"`New Page`\"]]",[47,48,50],"h2",{"id":49},"the-browser","The browser",[24,52,53],{},"One process, one engine. Three are available, and between them they cover what\npeople actually use:",[42,55],{":head":56,":rows":57,":nowrap":58},"[\"Engine\",\"Ships in\"]","[[\"`chromium`\",\"Google Chrome, Microsoft Edge, Opera\"],[\"`firefox`\",\"Mozilla Firefox\"],[\"`webkit`\",\"Safari on macOS and iOS\"]]","[0]",[24,60,61],{},"Playwright brings its own binaries, so there is no geckodriver, no chromedriver,\nand no driver version to keep in step with a browser version. The same three\nengines run on Windows, Linux and macOS.",[24,63,64,67,68,71],{},[36,65,66],{},"New Browser"," starts headless unless you say otherwise — ",[36,69,70],{},"Open Browser",", being a\ndebugging tool, starts headful:",[28,73,77],{"className":74,"code":75,"language":76,"meta":34,"style":34},"language-robot-repl shiki shiki-themes github-light github-dark","New Browser    chromium    headless=False\n","robot-repl",[36,78,79],{"__ignoreMap":34},[80,81,84],"span",{"class":82,"line":83},"line",1,[80,85,75],{},[24,87,88,89,93],{},"The browser layer is where the ",[90,91,92],"em",{},"environment"," is decided: which engine, headless\nor not, a proxy, a slow-motion delay, the browser's own timeout, extra launch\narguments.",[95,96,98],"h3",{"id":97},"browsers-are-reused","Browsers are reused",[24,100,101,103,104,106,107,110,111,114,115,117],{},[36,102,66],{}," with the same arguments as an earlier ",[36,105,66],{}," call does not\nstart a second process — it switches to that one. That is what makes it safe to\ncall in a suite setup that runs many times. A browser that ",[36,108,109],{},"New Page"," or\n",[36,112,113],{},"New Context"," created implicitly is not a reuse candidate, so an explicit\n",[36,116,66],{}," after them does start a second process. To force a new one\ndeliberately:",[28,119,121],{"className":74,"code":120,"language":76,"meta":34,"style":34},"New Browser    chromium    reuse_existing=False\n",[36,122,123],{"__ignoreMap":34},[80,124,125],{"class":82,"line":83},[80,126,120],{},[47,128,130],{"id":129},"the-context","The context",[24,132,133],{},"A context is an independent session inside an already-running browser: its own\ncookies, its own storage, its own permissions. Two contexts share nothing. The\nclosest everyday equivalent is a fresh incognito window.",[24,135,136],{},"This is the layer worth understanding, because it is where Browser is\nstructurally faster than the older tools. With tools that give you one session per browser process, an isolated session\ncosts a process start. Here it is one call inside a process that is already\nwarm:",[28,138,140],{"className":74,"code":139,"language":76,"meta":34,"style":34},"New Context    # a clean slate, in a few milliseconds\n",[36,141,142],{"__ignoreMap":34},[80,143,144],{"class":82,"line":83},[80,145,139],{},[24,147,148],{},"So \"log in as a different user\" costs a few milliseconds of context creation\nrather than a browser start, and so does \"start this test from a known-clean\nstate\". You do not clear cookies; you throw the context away and open another.",[24,150,151],{},"The context is also where the interesting configuration lives:",[28,153,155],{"className":74,"code":154,"language":76,"meta":34,"style":34},"New Context    viewport={'width': 1920, 'height': 1080}\nNew Context    locale=de-DE    timezoneId=Europe\u002FBerlin\nNew Context    geolocation={'latitude': 48.86, 'longitude': 2.35}\nNew Context    httpCredentials={'username': '$user', 'password': '$pwd'}\nNew Context    acceptDownloads=True\nNew Context    colorScheme=dark\n",[36,156,157,162,168,174,180,186],{"__ignoreMap":34},[80,158,159],{"class":82,"line":83},[80,160,161],{},"New Context    viewport={'width': 1920, 'height': 1080}\n",[80,163,165],{"class":82,"line":164},2,[80,166,167],{},"New Context    locale=de-DE    timezoneId=Europe\u002FBerlin\n",[80,169,171],{"class":82,"line":170},3,[80,172,173],{},"New Context    geolocation={'latitude': 48.86, 'longitude': 2.35}\n",[80,175,177],{"class":82,"line":176},4,[80,178,179],{},"New Context    httpCredentials={'username': '$user', 'password': '$pwd'}\n",[80,181,183],{"class":82,"line":182},5,[80,184,185],{},"New Context    acceptDownloads=True\n",[80,187,189],{"class":82,"line":188},6,[80,190,191],{},"New Context    colorScheme=dark\n",[24,193,194,195,198],{},"Downloads are accepted by default. Pass ",[36,196,197],{},"acceptDownloads=False"," if you want the\nbrowser to refuse them.",[24,200,201,202,205,206,209,210,213,214,217],{},"The ",[36,203,204],{},"$user"," and ",[36,207,208],{},"$pwd"," above are not a typo. ",[36,211,212],{},"httpCredentials"," refuses a plain\nvalue — it takes the ",[36,215,216],{},"$name"," placeholder form, and resolves the names from\nvariables, so the password never reaches the log.",[24,219,220],{},"Tracing and video recording are context-level too, which is why a trace covers\nexactly one session:",[28,222,224],{"className":74,"code":223,"language":76,"meta":34,"style":34},"New Context    tracing=True\nNew Context    recordVideo={'dir': '${OUTPUT_DIR}\u002Fvideo'}\n",[36,225,226,231],{"__ignoreMap":34},[80,227,228],{"class":82,"line":83},[80,229,230],{},"New Context    tracing=True\n",[80,232,233],{"class":82,"line":164},[80,234,235],{},"New Context    recordVideo={'dir': '${OUTPUT_DIR}\u002Fvideo'}\n",[95,237,239],{"id":238},"persistent-contexts","Persistent contexts",[24,241,242,245,246,249],{},[36,243,244],{},"New Persistent Context"," is the exception to the shape: it takes a user data\ndirectory and creates its own browser, so state ",[90,247,248],{},"survives"," between runs. Useful\nwhen a real profile is the thing under test, and the wrong tool for isolation —\na browser opened this way cannot host additional contexts.",[47,251,253],{"id":252},"the-page","The page",[24,255,256],{},"A page is a tab. It holds the document and its own history, and it is where every\nselector resolves.",[28,258,262],{"className":259,"code":260,"language":261,"meta":34,"style":34},"language-robot shiki shiki-themes github-light github-dark","*** Test Cases ***\nStarting A Browser With A Page\n    New Browser    chromium    headless=False\n    New Context    viewport={'width': 1920, 'height': 1080}\n    New Page       https:\u002F\u002Frobotframework-browser.org\n    Get Title      *=    Robot Framework Browser\n","robot",[36,263,264,269,274,279,284,289],{"__ignoreMap":34},[80,265,266],{"class":82,"line":83},[80,267,268],{},"*** Test Cases ***\n",[80,270,271],{"class":82,"line":164},[80,272,273],{},"Starting A Browser With A Page\n",[80,275,276],{"class":82,"line":170},[80,277,278],{},"    New Browser    chromium    headless=False\n",[80,280,281],{"class":82,"line":176},[80,282,283],{},"    New Context    viewport={'width': 1920, 'height': 1080}\n",[80,285,286],{"class":82,"line":182},[80,287,288],{},"    New Page       https:\u002F\u002Frobotframework-browser.org\n",[80,290,291],{"class":82,"line":188},[80,292,293],{},"    Get Title      *=    Robot Framework Browser\n",[24,295,296,297,301,302,305,306,309],{},"A popup, a target-blank link or a second tab is another page in the same\ncontext, so it shares the login. It does ",[298,299,300],"strong",{},"not"," become the active page on its\nown — reach it with ",[36,303,304],{},"Switch Page",", given ",[36,307,308],{},"NEW",", which returns the id of the page\nyou came from:",[28,311,313],{"className":74,"code":312,"language":76,"meta":34,"style":34},"Click          text=Open report\n${previous} =    Switch Page    NEW\nGet Title      *=    Report\nSwitch Page    ${previous}\n",[36,314,315,320,325,330],{"__ignoreMap":34},[80,316,317],{"class":82,"line":83},[80,318,319],{},"Click          text=Open report\n",[80,321,322],{"class":82,"line":164},[80,323,324],{},"${previous} =    Switch Page    NEW\n",[80,326,327],{"class":82,"line":170},[80,328,329],{},"Get Title      *=    Report\n",[80,331,332],{"class":82,"line":176},[80,333,334],{},"Switch Page    ${previous}\n",[47,336,338],{"id":337},"you-rarely-open-all-three","You rarely open all three",[24,340,341,342,344],{},"The layers fill themselves in downwards. ",[36,343,109],{}," with nothing open starts a\nbrowser and a context first, using defaults:",[28,346,348],{"className":74,"code":347,"language":76,"meta":34,"style":34},"New Page    https:\u002F\u002Frobotframework-browser.org\n",[36,349,350],{"__ignoreMap":34},[80,351,352],{"class":82,"line":83},[80,353,347],{},[24,355,356,358],{},[36,357,70],{}," does all three in one call. It is built for experiments and\ndebugging; when you care about the context, open the three yourself.",[47,360,362],{"id":361},"what-is-open-right-now","What is open right now",[24,364,365,366,369],{},"Every browser, context and page has an id, and ",[36,367,368],{},"Get Browser Catalog"," returns the\nwhole tree:",[28,371,374],{"className":372,"code":373,"language":33,"meta":34},[31],"Browser  chromium  browser=94c1…   activeBrowser: true\n                             activeContext: context=7f2a…\n├── Context  context=7f2a…   activePage: page=3dce…\n│   ├── Page  page=3dce…  \u002Flogin\n│   └── Page  page=8b17…  \u002Fcart\n└── Context  context=b3d9…   activePage: page=1f60…\n    └── Page  page=1f60…  \u002Fadmin\n\nBrowser  firefox  browser=1ae8…\n└── Context  context=5c04…   activePage: page=42aa…\n    └── Page  page=42aa…  about:blank\n",[36,375,373],{"__ignoreMap":34},[24,377,378],{},"Drawn as a tree here for readability; the keyword returns a list of\ndictionaries, one per browser, each carrying its contexts and their pages.",[24,380,201,381,384,385,388,389,392,393,396,397,400,401,403],{},[36,382,383],{},"active*"," fields are the part worth reading, and they are not all the same\nshape: ",[36,386,387],{},"activeBrowser"," is a boolean on the browser, while ",[36,390,391],{},"activeContext"," and\n",[36,394,395],{},"activePage"," hold ",[90,398,399],{},"ids"," — and every browser and context carries one, whether or\nnot it is the active branch. So ",[36,402,387],{}," is what picks the branch the\nnext keyword will act on.",[24,405,406,407,410,411,414,415,418],{},"This is the fastest way to answer \"what does the library think is running\" when\na suite has drifted from what you expected. ",[36,408,409],{},"Get Browser Ids",", ",[36,412,413],{},"Get Context Ids","\nand ",[36,416,417],{},"Get Page Ids"," return the pieces individually.",[24,420,421,422,425,426,410,429,205,432,434],{},"Keywords act on the ",[90,423,424],{},"active"," browser, context and page unless you say otherwise,\nand ",[36,427,428],{},"Switch Browser",[36,430,431],{},"Switch Context",[36,433,304],{}," move that pointer.",[47,436,438],{"id":437},"when-things-close","When things close",[24,440,441,442,445,446,449,450,452],{},"By default, the ",[298,443,444],{},"contexts and pages"," a test opened are closed when the test\nends. Browsers are not: no auto-closing level closes a browser per test or per\nsuite, so a browser lives until execution ends or you call ",[36,447,448],{},"Close Browser",". The\none exception is a browser opened by ",[36,451,244],{}," — it is closed\ntogether with its context.",[24,454,455,456,459],{},"That setting is ",[36,457,458],{},"auto_closing_level",", and it has four values:",[42,461],{":head":462,":rows":463,":nowrap":58},"[\"Level\",\"Contexts and pages are closed\"]","[[\"`TEST`\",\"At the end of the test that created them (the default). Anything created in suite setup lives until suite teardown.\"],[\"`SUITE`\",\"At the end of the suite that created them\"],[\"`MANUAL`\",\"Never during the run — everything closes when execution ends\"],[\"`KEEP`\",\"Never, not even at the end. The node process stays alive too.\"]]",[28,465,467],{"className":259,"code":466,"language":261,"meta":34,"style":34},"*** Settings ***\nLibrary    Browser    auto_closing_level=SUITE\n",[36,468,469,474],{"__ignoreMap":34},[80,470,471],{"class":82,"line":83},[80,472,473],{},"*** Settings ***\n",[80,475,476],{"class":82,"line":164},[80,477,478],{},"Library    Browser    auto_closing_level=SUITE\n",[24,480,481,484,485,488],{},[36,482,483],{},"KEEP"," leaves processes running on purpose — it exists so you can poke at a page\nafter a failing test while writing it. ",[298,486,487],{},"Never set it in CI",", or runs will leak\nbrowser processes until the machine gives up.",[47,490,492],{"id":491},"which-layer-for-which-job","Which layer for which job",[42,494],{":head":495,":rows":496},"[\"You want\",\"Open\"]","[[\"A second user session\",\"A new **context**\"],[\"A popup or a second tab in the same session\",\"A new **page**\"],[\"A clean slate between tests\",\"A new **context** — not a new browser\"],[\"A different engine, or a GUI\",\"A new **browser**\"],[\"A proxy\",\"Either — `proxy` is an argument on **both** `New Browser` and `New Context`\"],[\"A profile that survives the run\",\"`New Persistent Context`\"],[\"A mobile device profile\",\"A new **context** from `Get Device`\"]]",[24,498,499],{},"The third row is the one that decides how long your suite takes. Reaching for a\nnew browser where a new context would do is the single most common reason a\nBrowser suite runs slower than it needs to.",[47,501,503],{"id":502},"in-short","In short",[505,506,507,511,514,519,526],"ul",{},[508,509,510],"li",{},"Browser = process, context = session, page = tab.",[508,512,513],{},"Contexts are the cheap unit of isolation. Use them freely.",[508,515,516,518],{},[36,517,109],{}," opens whatever is missing underneath it.",[508,520,521,522,525],{},"Cookies, storage, permissions, viewport, locale, tracing and video all belong\nto the ",[298,523,524],{},"context",".",[508,527,528,531],{},[36,529,530],{},"auto_closing_level=KEEP"," is for writing tests, never for running them.",[533,534,535],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":34,"searchDepth":164,"depth":164,"links":537},[538,541,544,545,546,547,548,549],{"id":49,"depth":164,"text":50,"children":539},[540],{"id":97,"depth":170,"text":98},{"id":129,"depth":164,"text":130,"children":542},[543],{"id":238,"depth":170,"text":239},{"id":252,"depth":164,"text":253},{"id":337,"depth":164,"text":338},{"id":361,"depth":164,"text":362},{"id":437,"depth":164,"text":438},{"id":491,"depth":164,"text":492},{"id":502,"depth":164,"text":503},"The three layers Playwright is built on — and why a new context is the cheapest clean slate you will ever get.","md",{},true,"\u002Fdocs\u002Fconcepts\u002Fbrowser-context-page","concepts",{"title":19,"description":550},"docs\u002Fconcepts\u002Fbrowser-context-page","QW-F6qPTKHyW6jKLV4h-xlKrGDv7-r3ldp69co5UThU",[560,564,568,569,573,577,581,586,590,594,598,603,607,611,616,620,624,628],{"path":561,"title":562,"description":563,"section":555,"order":182},"\u002Fdocs\u002Fconcepts\u002Farchitecture","How Browser works","Python, a Node process and Playwright — what runs where, and which installation to choose.",{"path":565,"title":566,"description":567,"section":555,"order":170},"\u002Fdocs\u002Fconcepts\u002Fassertions","Assertions","Almost every getter can assert, every assertion retries, and each return type allows different operators. The complete AssertionEngine reference.",{"path":554,"title":19,"description":550,"section":555,"order":83},{"path":570,"title":571,"description":572,"section":555,"order":188},"\u002Fdocs\u002Fconcepts\u002Flogging","Logging and debugging","Four places Browser tells you what happened — log.html, the Playwright log, traces and coverage.",{"path":574,"title":575,"description":576,"section":555,"order":164},"\u002Fdocs\u002Fconcepts\u002Fselectors","Finding elements","Which selector strategy to reach for, why the order matters, and how to chain across iframes and shadow DOM.",{"path":578,"title":579,"description":580,"section":555,"order":176},"\u002Fdocs\u002Fconcepts\u002Fwaiting","Waiting and promises","Most waiting is already done for you. This is the rest of it — Wait For Condition, and how to run keywords in parallel with Promise To.",{"path":582,"title":583,"description":584,"section":585,"order":164},"\u002Fdocs\u002Fextending\u002Fjavascript-basics","Just enough JavaScript","The JavaScript you need to write extensions and Evaluate JavaScript, for people who write Python.","extending",{"path":587,"title":588,"description":589,"section":585,"order":170},"\u002Fdocs\u002Fextending\u002Fjavascript-extensions","JavaScript extensions","Add keywords that run on the Node side with full Playwright access — and attach a debugger to them.",{"path":591,"title":592,"description":593,"section":585,"order":83},"\u002Fdocs\u002Fextending\u002Fpython-plugins","Python plugins","Add or replace keywords from Python, with access to the library's own API and to the Node side.",{"path":595,"title":596,"description":597,"section":585,"order":176},"\u002Fdocs\u002Fextending\u002Ftranslations","Translating keywords","Using a translation package to get keyword names and documentation in your language, and writing one for a language nobody has covered yet.",{"path":599,"title":600,"description":601,"section":602,"order":164},"\u002Fdocs\u002Fmobile\u002Fdevices","Emulating a device","Device descriptors, what the six or seven properties they set actually change, and the one that emulation cannot give you.","mobile",{"path":604,"title":605,"description":606,"section":602,"order":83},"\u002Fdocs\u002Fmobile\u002Fresponsive","Testing responsive pages","Why a browser at a phone-sized viewport tests responsiveness properly, what emulation cannot tell you, and where real devices actually belong.",{"path":608,"title":609,"description":610,"section":602,"order":170},"\u002Fdocs\u002Fmobile\u002Ftouch","Touch, permissions and location","Tap and why it needs hasTouch, granting camera or notifications without a dialog, faking where the user is, and the gestures Browser has no keyword for.",{"path":612,"title":613,"description":614,"section":615,"order":170},"\u002Fdocs\u002Foperations\u002Fdocker","Running in Docker","The published Browser image, the four docker run flags that matter, and why running as root breaks Chromium.","operations",{"path":617,"title":618,"description":619,"section":615,"order":176},"\u002Fdocs\u002Foperations\u002Fdocker-images","Building your own image","Extending the published image with your dependencies, the version lock between Browser and Playwright, and using it as a CI job container.",{"path":621,"title":622,"description":623,"section":615,"order":164},"\u002Fdocs\u002Foperations\u002Fenvironment-variables","Environment variables","The variables that change how Browser behaves, which of them are safe in production, and the import parameters that should usually be preferred.",{"path":625,"title":626,"description":627,"section":615,"order":83},"\u002Fdocs\u002Foperations\u002Fnode-process","The Node process","Browser starts a Node process to talk to Playwright. What that costs, how to share one across parallel runs, and how to pass it Node flags.",{"path":629,"title":630,"description":631,"section":632,"order":83},"\u002Fdocs\u002Fstart\u002Fgetting-started","Getting started","Install Browser, write a first test, and run it.","start",[634,637,640],{"to":635,"label":636},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":638,"label":639},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":641,"label":642},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",[644],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    chromium    headless=False\u003C\u002Fspan>\u003C\u002Fspan>",[646],"\u003Cspan class=\"line\">\u003Cspan>Browser · chromium\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>│\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>├── Context 1 · alice\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>│   ├── Page · tab\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>│   └── Page · tab\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>│\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>└── Context 2 · bob\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>    └── Page · tab\u003C\u002Fspan>\u003C\u002Fspan>",[648],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    chromium    reuse_existing=False\u003C\u002Fspan>\u003C\u002Fspan>",[650],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">    # a clean slate, in a few milliseconds\u003C\u002Fspan>\u003C\u002Fspan>",[652],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    viewport={'width': 1920, 'height': 1080}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    locale=de-DE    timezoneId=Europe\u002FBerlin\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    geolocation={'latitude': 48.86, 'longitude': 2.35}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    httpCredentials={'username': '$user', 'password': '$pwd'}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    acceptDownloads=True\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    colorScheme=dark\u003C\u002Fspan>\u003C\u002Fspan>",[654],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    tracing=True\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    recordVideo={'dir': '\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">OUTPUT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">\u002Fvideo'}\u003C\u002Fspan>\u003C\u002Fspan>",[656],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Test Cases ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Starting A Browser With A Page\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    chromium\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    headless=False\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Context\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    viewport={'width': 1920, 'height': 1080}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Page\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">       https:\u002F\u002Frobotframework-browser.org\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Get Title\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">      *=\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    Robot Framework Browser\u003C\u002Fspan>\u003C\u002Fspan>",[658],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">          text=Open report\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">previous\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Switch Page\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    NEW\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Get Title\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">      *=    Report\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Switch Page\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">previous\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",[660],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">New Page\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    https:\u002F\u002Frobotframework-browser.org\u003C\u002Fspan>\u003C\u002Fspan>",[662],"\u003Cspan class=\"line\">\u003Cspan>Browser  chromium  browser=94c1…   activeBrowser: true\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>                             activeContext: context=7f2a…\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>├── Context  context=7f2a…   activePage: page=3dce…\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>│   ├── Page  page=3dce…  \u002Flogin\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>│   └── Page  page=8b17…  \u002Fcart\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>└── Context  context=b3d9…   activePage: page=1f60…\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>    └── Page  page=1f60…  \u002Fadmin\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>Browser  firefox  browser=1ae8…\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>└── Context  context=5c04…   activePage: page=42aa…\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>    └── Page  page=42aa…  about:blank\u003C\u002Fspan>\u003C\u002Fspan>",[664],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Settings ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">Library\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    auto_closing_level=SUITE\u003C\u002Fspan>\u003C\u002Fspan>",1786734137717]