[{"data":1,"prerenderedAt":575},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"release-21.0.0":17,"releases-nav":518,"nav-compare":565},["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:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);border-bottom: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,"date":505,"description":478,"extension":506,"headline":507,"meta":508,"navigation":510,"path":511,"playwright":512,"seo":513,"stem":514,"supports":515,"version":516,"__hash__":517},"releases\u002Freleases\u002F21.0.0.md","Browser 21.0.0",{"type":21,"value":22,"toc":477},"minimark",[23,28,50,54,63,66,75,78,87,94,107,110,114,123,126,130,139,142,151,154,158,468],[24,25,27],"h2",{"id":26},"most-important-enhancements","Most important enhancements",[29,30,32,33,37,38,41,42,49],"h3",{"id":31},"record-keywords-in-the-live-browser-record-keyword-and-record-keywords-5408","Record keywords in the live browser: ",[34,35,36],"code",{},"Record Keyword"," and ",[34,39,40],{},"Record Keywords"," (",[43,44,48],"a",{"href":45,"rel":46},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5408",[47],"nofollow","#5408",")",[51,52,53],"p",{},"Now can record their interactions in the browser at any point during a test run, naming\nkeywords, turning values into arguments and undoing mistakes as they go, so that they\ncan get reusable User Keywords built from Browser keywords, without whole tests being\ngenerated and without translating generated Playwright code.",[29,55,57,58,49],{"id":56},"let-libraries-built-on-browser-hand-over-their-own-browsercontext-5317","Let libraries built on Browser hand over their own BrowserContext (",[43,59,62],{"href":60,"rel":61},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5317",[47],"#5317",[51,64,65],{},"Playwright can drive more than Chromium, Firefox and WebKit. It can drive Electron\napplications with playwright._electron, and Chrome on Android devices with\nplaywright._android. Requests to support such platforms in Browser come up again\nand again in different issues. Each platform needs its own lifecycle, its own test\nsetup and people who know it well. None of that fits into Browser or should land on\nits maintainers. Now we have opened the Plugin API to build on top of Browser library\nto support other platforms too. Stay tuned for new libraries in this front.",[29,67,69,70,49],{"id":68},"splitting-a-large-response-body-blocks-the-node-event-loop-5349","Splitting a large response body blocks the Node event loop (",[43,71,74],{"href":72,"rel":73},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5349",[47],"#5349",[51,76,77],{},"Splitting a large response body blocks the Node event loop was done by one character\nat the time. With large response this causes blocking operation in the NodeJS side\nand caused problems with Pabot. Now there is better logic for splitting large\nresponse and it should improve the performance of the library",[29,79,81,82,49],{"id":80},"extending-the-selector-syntax-with-frame-and-label-selectors-5410","Extending the selector syntax with frame and label selectors (",[43,83,86],{"href":84,"rel":85},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5410",[47],"#5410",[51,88,89,90,93],{},"we now support ",[34,91,92],{},">>> id=btn"," syntax in with the frame locator. See the issue\nfor more details.",[29,95,97,98,101,102,49],{"id":96},"rebuild-record-selector-on-playwrights-element-picker-and-the-recorder-toolbar-5411","Rebuild ",[34,99,100],{},"Record Selector"," on Playwright's element picker and the recorder toolbar (",[43,103,106],{"href":104,"rel":105},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5411",[47],"#5411",[51,108,109],{},"We have enhanced Record Selector feature. There has been several problems with it\nand we have made several enhancement to the feature. See issue for more details.",[24,111,113],{"id":112},"backwards-incompatible-changes","Backwards incompatible changes",[29,115,117,118,49],{"id":116},"ship-nodejs-26-lts-in-browserbatteries-5400","Ship NodeJS 26 LTS in BrowserBatteries (",[43,119,122],{"href":120,"rel":121},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5400",[47],"#5400",[51,124,125],{},"NodeJS 26 moved to LTS and we moved BrowserBatteries to use NodeJS 26 in the\nBrowserBatteries wheels. This is the main reason to mark this release as\nBackwards incompatible.",[24,127,129],{"id":128},"acknowledgements","Acknowledgements",[29,131,133,134,49],{"id":132},"when-a-keyword-fails-and-presenter_mode-is-enabled-the-browser-is-not-closed-3644","When a keyword fails and presenter_mode is enabled the browser is not closed (",[43,135,138],{"href":136,"rel":137},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F3644",[47],"#3644",[51,140,141],{},"When a keyword fails and presenter_mode is enabled the browser is not closed when\nthe test finishes. he reason is that the keyword Record Selector is called when a\nkeyword fails and presenter_mode is enabled. This is now fixed. Many thanks for\nMarduk Bolaños reporting the problem and ShryukGrandhi to provide a fix for\nthe bug.",[29,143,145,146,49],{"id":144},"new-browser-fails-with-filenotfounderror-for-playwright-logtxt-when-all-output-files-are-disabled-5313","New Browser fails with FileNotFoundError for playwright-log.txt when all output files are disabled (",[43,147,150],{"href":148,"rel":149},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5313",[47],"#5313",[51,152,153],{},"If ${OUTPUT_DIR} did not exist, then starting the Browser library would fail in error,\nthis can happen example when output is disabled with these: --output NONE --log NONE\n--report NONE command line switches. This problem has been reported and fixed by\nDaniel Biehl",[24,155,157],{"id":156},"full-list-of-fixes-and-enhancements","Full list of fixes and enhancements",[159,160,161,180],"table",{},[162,163,164],"thead",{},[165,166,167,171,174,177],"tr",{},[168,169,170],"th",{},"ID",[168,172,173],{},"Type",[168,175,176],{},"Priority",[168,178,179],{},"Summary",[181,182,183,200,215,229,244,258,275,289,305,322,338,354,370,386,402,419,436,452],"tbody",{},[165,184,185,191,194,197],{},[186,187,188],"td",{},[43,189,138],{"href":136,"rel":190},[47],[186,192,193],{},"bug",[186,195,196],{},"critical",[186,198,199],{},"When a keyword fails and presenter_mode is enabled the browser is not closed",[165,201,202,207,209,212],{},[186,203,204],{},[43,205,150],{"href":148,"rel":206},[47],[186,208,193],{},[186,210,211],{},"high",[186,213,214],{},"New Browser fails with FileNotFoundError for playwright-log.txt when all output files are disabled",[165,216,217,222,224,226],{},[186,218,219],{},[43,220,74],{"href":72,"rel":221},[47],[186,223,193],{},[186,225,211],{},[186,227,228],{},"Splitting a large response body blocks the Node event loop",[165,230,231,236,239,241],{},[186,232,233],{},[43,234,62],{"href":60,"rel":235},[47],[186,237,238],{},"feature",[186,240,211],{},[186,242,243],{},"Let libraries built on Browser hand over their own BrowserContext",[165,245,246,251,253,255],{},[186,247,248],{},[43,249,122],{"href":120,"rel":250},[47],[186,252,238],{},[186,254,211],{},[186,256,257],{},"Ship NodeJS 26 LTS in BrowserBatteries",[165,259,260,265,267,269],{},[186,261,262],{},[43,263,48],{"href":45,"rel":264},[47],[186,266,238],{},[186,268,211],{},[186,270,32,271,37,273],{},[34,272,36],{},[34,274,40],{},[165,276,277,282,284,286],{},[186,278,279],{},[43,280,86],{"href":84,"rel":281},[47],[186,283,238],{},[186,285,211],{},[186,287,288],{},"Extending the selector syntax with frame and label selectors",[165,290,291,296,298,300],{},[186,292,293],{},[43,294,106],{"href":104,"rel":295},[47],[186,297,238],{},[186,299,211],{},[186,301,97,302,304],{},[34,303,100],{}," on Playwright's element picker and the recorder toolbar",[165,306,307,314,316,319],{},[186,308,309],{},[43,310,313],{"href":311,"rel":312},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5260",[47],"#5260",[186,315,193],{},[186,317,318],{},"medium",[186,320,321],{},"RF suite\u002Ftest context in the node logger is module-global, so log lines are attributed to the wrong worker when a node process is shared",[165,323,324,331,333,335],{},[186,325,326],{},[43,327,330],{"href":328,"rel":329},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5302",[47],"#5302",[186,332,193],{},[186,334,318],{},[186,336,337],{},"Keyword documentation bugs found while translating 20.6.0",[165,339,340,347,349,351],{},[186,341,342],{},[43,343,346],{"href":344,"rel":345},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5320",[47],"#5320",[186,348,193],{},[186,350,318],{},[186,352,353],{},"JavaScript extensions get the string \"RESERVED\" instead of null or undefined when there is no page, context or browser",[165,355,356,363,365,367],{},[186,357,358],{},[43,359,362],{"href":360,"rel":361},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5321",[47],"#5321",[186,364,238],{},[186,366,318],{},[186,368,369],{},"defaultTimeout is a reserved argument name for JavaScript extension keywords",[165,371,372,379,381,383],{},[186,373,374],{},[43,375,378],{"href":376,"rel":377},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5346",[47],"#5346",[186,380,238],{},[186,382,318],{},[186,384,385],{},"Support fps and showActions in recordVideo of New Context",[165,387,388,395,397,399],{},[186,389,390],{},[43,391,394],{"href":392,"rel":393},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5378",[47],"#5378",[186,396,238],{},[186,398,318],{},[186,400,401],{},"Drop Python 3.10 and support Python 3.11 to 3.15",[165,403,404,411,414,416],{},[186,405,406],{},[43,407,410],{"href":408,"rel":409},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5324",[47],"#5324",[186,412,413],{},"---",[186,415,318],{},[186,417,418],{},"New Persistent Context indexes only the first page, and a failed close leaves the persistent context open",[165,420,421,428,430,433],{},[186,422,423],{},[43,424,427],{"href":425,"rel":426},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5357",[47],"#5357",[186,429,193],{},[186,431,432],{},"low",[186,434,435],{},"Tracing with tracing_group_mode=Browser fails with IndexError when a context is created from plain Python",[165,437,438,445,447,449],{},[186,439,440],{},[43,441,444],{"href":442,"rel":443},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5368",[47],"#5368",[186,446,193],{},[186,448,432],{},[186,450,451],{},"Pages that exist when Connect To Browser connects stay in the page stack after they close",[165,453,454,461,463,465],{},[186,455,456],{},[43,457,460],{"href":458,"rel":459},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues\u002F5325",[47],"#5325",[186,462,193],{},[186,464,413],{},[186,466,467],{},"Processes forked after a gRPC channel opens can crash on macOS",[51,469,470,471,476],{},"Altogether 18 issues. View on the ",[43,472,475],{"href":473,"rel":474},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser\u002Fissues?q=milestone%3Av21.0.0",[47],"issue tracker",".",{"title":478,"searchDepth":479,"depth":479,"links":480},"",2,[481,494,498,504],{"id":26,"depth":479,"text":27,"children":482},[483,486,488,490,492],{"id":31,"depth":484,"text":485},3,"Record keywords in the live browser: Record Keyword and Record Keywords (#5408)",{"id":56,"depth":484,"text":487},"Let libraries built on Browser hand over their own BrowserContext (#5317)",{"id":68,"depth":484,"text":489},"Splitting a large response body blocks the Node event loop (#5349)",{"id":80,"depth":484,"text":491},"Extending the selector syntax with frame and label selectors (#5410)",{"id":96,"depth":484,"text":493},"Rebuild Record Selector on Playwright's element picker and the recorder toolbar (#5411)",{"id":112,"depth":479,"text":113,"children":495},[496],{"id":116,"depth":484,"text":497},"Ship NodeJS 26 LTS in BrowserBatteries (#5400)",{"id":128,"depth":479,"text":129,"children":499},[500,502],{"id":132,"depth":484,"text":501},"When a keyword fails and presenter_mode is enabled the browser is not closed (#3644)",{"id":144,"depth":484,"text":503},"New Browser fails with FileNotFoundError for playwright-log.txt when all output files are disabled (#5313)",{"id":156,"depth":479,"text":157},"November 1, 2026","md","Record keywords in the live browser: `Record Keyword` and `Record Keywords`",{"source":509},"Generated from the library repository by scripts\u002Fbuild-releases.ts",true,"\u002Freleases\u002F21.0.0","1.64.1",{"title":19,"description":478},"releases\u002F21.0.0","Python 3.11+, Node 22\u002F24 LTS and Node 26, and Robot Framework 7.1.1+","21.0.0","Lvk5FjryzUWo7JpJJ-ROWSL0t2MN2eL4JGkHTBbGVrw",[519,522,525,528,531,534,537,540,543,546,549,552,555,558,561,564],{"path":520,"version":521},"\u002Freleases\u002F19.12.4","19.12.4",{"path":523,"version":524},"\u002Freleases\u002F19.12.5","19.12.5",{"path":526,"version":527},"\u002Freleases\u002F19.12.6","19.12.6",{"path":529,"version":530},"\u002Freleases\u002F19.12.7","19.12.7",{"path":532,"version":533},"\u002Freleases\u002F19.13.0","19.13.0",{"path":535,"version":536},"\u002Freleases\u002F19.14.2","19.14.2",{"path":538,"version":539},"\u002Freleases\u002F19.15.0","19.15.0",{"path":541,"version":542},"\u002Freleases\u002F19.15.1","19.15.1",{"path":544,"version":545},"\u002Freleases\u002F20.0.0","20.0.0",{"path":547,"version":548},"\u002Freleases\u002F20.1.0","20.1.0",{"path":550,"version":551},"\u002Freleases\u002F20.2.0","20.2.0",{"path":553,"version":554},"\u002Freleases\u002F20.3.0","20.3.0",{"path":556,"version":557},"\u002Freleases\u002F20.4.0","20.4.0",{"path":559,"version":560},"\u002Freleases\u002F20.5.0","20.5.0",{"path":562,"version":563},"\u002Freleases\u002F20.6.0","20.6.0",{"path":511,"version":516},[566,569,572],{"to":567,"label":568},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":570,"label":571},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":573,"label":574},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",1793560487316]