[{"data":1,"prerenderedAt":665},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"doc-\u002Fdocs\u002Frecording\u002Fwhat-gets-recorded":17,"docs-nav":523,"nav-compare":637,"editor-n9m1wq":647,"editor-mbc3eg":649,"editor-iirgmr":651,"editor-pf8q07":653,"editor-1xb6i0":655,"editor-c47lhn":657,"editor-1l32p5j":659,"editor-nsj0kd":661,"editor-dz5fst":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: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,"description":514,"extension":515,"meta":516,"navigation":517,"order":78,"path":518,"section":519,"seo":520,"stem":521,"__hash__":522},"docs\u002Fdocs\u002Frecording\u002Fwhat-gets-recorded.md","What gets recorded",{"type":21,"value":22,"toc":504},"minimark",[23,36,41,46,100,112,116,127,133,148,153,160,188,202,208,223,229,249,255,275,292,301,305,312,321,325,357,371,375,378,382,393,399,403,406,446,453,457,500],[24,25,26,27,31,32,35],"p",{},"Playwright watches the page and reports each ",[28,29,30],"strong",{},"action"," — a click, a fill, a key\npress. The recorder turns each one into a ",[28,33,34],{},"Keyword Call"," to a Browser keyword,\nthe same keyword you would have written by hand.",[37,38,40],"h2",{"id":39},"actions","Actions",[42,43],"doc-table",{":head":44,":rows":45},"[\"You\",\"Recorded as\"]","[[\"Click\",\"`Click` with the selector\"],[\"Double-click, right-click, click with Shift \u002F Ctrl \u002F Alt \u002F Meta\",\"`Click With Options` with the button, the modifiers and `clickCount`\"],[\"Type into a field\",\"`Fill Text` with the text — one call per field, however you typed it\"],[\"Press Enter, Tab, Escape, a shortcut\",\"`Press Keys`, modifiers joined with `+`\"],[\"Tick or untick a checkbox\",\"`Check Checkbox` \u002F `Uncheck Checkbox`\"],[\"Choose in a `\u003Cselect>`\",\"`Select Options By` with `value` and the chosen options\"],[\"Navigate by URL or bookmark\",\"`Go To` with the URL\"],[\"Close a tab\",\"`Close Page` — see [Working in several tabs](#working-in-several-tabs)\"]]",[47,48,53],"pre",{"className":49,"code":50,"language":51,"meta":52,"style":52},"language-robot-repl shiki shiki-themes github-light github-dark","Click    role=button[name=\"Save\"s]\nClick With Options    role=row[name*=\"Order 4711\"i]    right    Shift    clickCount=2\nFill Text    role=textbox[name*=\"Email\"i]    jane@example.com\nPress Keys    role=textbox[name*=\"Search\"i]    Enter\nCheck Checkbox    role=checkbox[name*=\"Remember me\"i]\nSelect Options By    role=combobox[name*=\"Country\"i]    value    de\nGo To    https:\u002F\u002Fshop.example.com\u002Fcart\n","robot-repl","",[54,55,56,64,70,76,82,88,94],"code",{"__ignoreMap":52},[57,58,61],"span",{"class":59,"line":60},"line",1,[57,62,63],{},"Click    role=button[name=\"Save\"s]\n",[57,65,67],{"class":59,"line":66},2,[57,68,69],{},"Click With Options    role=row[name*=\"Order 4711\"i]    right    Shift    clickCount=2\n",[57,71,73],{"class":59,"line":72},3,[57,74,75],{},"Fill Text    role=textbox[name*=\"Email\"i]    jane@example.com\n",[57,77,79],{"class":59,"line":78},4,[57,80,81],{},"Press Keys    role=textbox[name*=\"Search\"i]    Enter\n",[57,83,85],{"class":59,"line":84},5,[57,86,87],{},"Check Checkbox    role=checkbox[name*=\"Remember me\"i]\n",[57,89,91],{"class":59,"line":90},6,[57,92,93],{},"Select Options By    role=combobox[name*=\"Country\"i]    value    de\n",[57,95,97],{"class":59,"line":96},7,[57,98,99],{},"Go To    https:\u002F\u002Fshop.example.com\u002Fcart\n",[24,101,102,103,107,108,111],{},"A navigation within five seconds of a click, fill or key press belongs to that\naction — the click on a link ",[104,105,106],"em",{},"is"," the navigation — so it gets no ",[54,109,110],{},"Go To"," of its\nown. A recorded keyword never opens a browser or a page: it runs in whatever page\nits caller set up, which is what makes it reusable.",[37,113,115],{"id":114},"popups-dialogs-downloads-and-uploads","Popups, dialogs, downloads and uploads",[24,117,118,119,122,123,126],{},"Some actions need Browser keywords ",[28,120,121],{},"around"," them. Playwright reports these after\nthe action; the recorder puts the calls where Browser needs them. ",[104,124,125],{},"Undo"," removes\nthem together with the action.",[24,128,129,132],{},[28,130,131],{},"A new tab or popup"," is followed by switching to it:",[47,134,136],{"className":49,"code":135,"language":51,"meta":52,"style":52},"Click    role=link[name=\"Open in new tab\"s]\nSwitch Page    NEW\n",[54,137,138,143],{"__ignoreMap":52},[57,139,140],{"class":59,"line":60},[57,141,142],{},"Click    role=link[name=\"Open in new tab\"s]\n",[57,144,145],{"class":59,"line":66},[57,146,147],{},"Switch Page    NEW\n",[149,150,152],"h3",{"id":151},"working-in-several-tabs","Working in several tabs",[24,154,155,156,159],{},"The recorder knows which tab every action happens in. When the next action is in\nanother tab than the last one, it switches there first. ",[54,157,158],{},"Switch Page"," returns the\nid of the tab it leaves, so the keyword can come back to it; the recorder\nassigns that id to a variable once an action needs it:",[47,161,163],{"className":49,"code":162,"language":51,"meta":52,"style":52},"Click    role=link[name=\"Open in new tab\"s]\n${page}=    Switch Page    NEW\nFill Text    role=textbox[name*=\"Search\"i]    shoes\nSwitch Page    ${page}\nClick    role=button[name=\"Save\"s]\n",[54,164,165,169,174,179,184],{"__ignoreMap":52},[57,166,167],{"class":59,"line":60},[57,168,142],{},[57,170,171],{"class":59,"line":66},[57,172,173],{},"${page}=    Switch Page    NEW\n",[57,175,176],{"class":59,"line":72},[57,177,178],{},"Fill Text    role=textbox[name*=\"Search\"i]    shoes\n",[57,180,181],{"class":59,"line":78},[57,182,183],{},"Switch Page    ${page}\n",[57,185,186],{"class":59,"line":84},[57,187,63],{},[24,189,190,191,194,195,197,198,201],{},"Closing the active tab becomes ",[54,192,193],{},"Close Page","; Browser then returns to the tab\nbefore it. Closing another tab closes it by its id: ",[54,196,193],{}," with ",[54,199,200],{},"${page}",".\nA tab that was already open when the recording started, or that you opened by\nhand, has no id the keyword knows: an action there is recorded without a switch,\nand the toolbar says so.",[24,203,204,207],{},[28,205,206],{},"An alert, confirm or prompt"," gets its handler before the click that opens it.\nPlaywright does not report whether you accepted it, so the recorder accepts:",[47,209,211],{"className":49,"code":210,"language":51,"meta":52,"style":52},"Handle Future Dialogs    action=accept\nClick    role=button[name=\"Delete\"s]\n",[54,212,213,218],{"__ignoreMap":52},[57,214,215],{"class":59,"line":60},[57,216,217],{},"Handle Future Dialogs    action=accept\n",[57,219,220],{"class":59,"line":66},[57,221,222],{},"Click    role=button[name=\"Delete\"s]\n",[24,224,225,228],{},[28,226,227],{},"A download"," is wrapped in a promise:",[47,230,232],{"className":49,"code":231,"language":51,"meta":52,"style":52},"${download}=    Promise To Wait For Download\nClick    role=link[name=\"Export as CSV\"s]\nWait For    ${download}\n",[54,233,234,239,244],{"__ignoreMap":52},[57,235,236],{"class":59,"line":60},[57,237,238],{},"${download}=    Promise To Wait For Download\n",[57,240,241],{"class":59,"line":66},[57,242,243],{},"Click    role=link[name=\"Export as CSV\"s]\n",[57,245,246],{"class":59,"line":72},[57,247,248],{},"Wait For    ${download}\n",[24,250,251,254],{},[28,252,253],{},"An upload"," through a file chooser is wrapped the same way. The page never\nlearns which folder the file came from, so the path starts with a placeholder;\nthe toolbar reminds you to fill it in:",[47,256,258],{"className":49,"code":257,"language":51,"meta":52,"style":52},"${upload}=    Promise To Upload File    \u003Cdefine_path_to_file>\u002Freport.zip\nClick    role=button[name=\"Open Report\"s]\nWait For    ${upload}\n",[54,259,260,265,270],{"__ignoreMap":52},[57,261,262],{"class":59,"line":60},[57,263,264],{},"${upload}=    Promise To Upload File    \u003Cdefine_path_to_file>\u002Freport.zip\n",[57,266,267],{"class":59,"line":66},[57,268,269],{},"Click    role=button[name=\"Open Report\"s]\n",[57,271,272],{"class":59,"line":72},[57,273,274],{},"Wait For    ${upload}\n",[24,276,277,278,281,282,285,286,291],{},"Replace ",[54,279,280],{},"\u003Cdefine_path_to_file>"," with the folder — ",[54,283,284],{},"${CURDIR}\u002Ftestdata"," — or mark\nit in the toolbar and make it an ",[287,288,290],"a",{"href":289},"\u002Fdocs\u002Frecording\u002Farguments","argument",". When no\nclick opened the chooser, the recorder sets the file on the input directly:",[47,293,295],{"className":49,"code":294,"language":51,"meta":52,"style":52},"Upload File By Selector    input[type=\"file\"]    \u003Cdefine_path_to_file>\u002Freport.zip\n",[54,296,297],{"__ignoreMap":52},[57,298,299],{"class":59,"line":60},[57,300,294],{},[37,302,304],{"id":303},"assertions","Assertions",[24,306,307,308,311],{},"A keyword that only clicks proves nothing. ",[28,309,310],{},"Playwright's toolbar"," at the top\ncentre of the page has four assertion tools: pick one, then click the element to\ncheck.",[313,314,318],"doc-video",{"alt":315,"poster":316,"src":317},"The Assertions page with both toolbars. The eye tool in Playwright's toolbar is chosen and the page heading clicked: a visibility check is recorded. Then the text tool is chosen, the heading clicked, and the proposed text Assertions accepted with the check mark: a text check is recorded.","\u002Fvideos\u002Frecorder\u002Fassertions.jpg","\u002Fvideos\u002Frecorder\u002Fassertions.mp4",[24,319,320],{},"Assert visibility, then assert text — each a Keyword Call with a retrying\nassertion.",[42,322],{":head":323,":rows":324},"[\"Tool\",\"Recorded as\"]","[[\"Assert visibility (eye)\",\"`Get Element States` with `*=` and `visible`\"],[\"Assert text (ab)\",\"`Get Text` with `contains` and the text — or `==` when you check the whole text\"],[\"Assert value, on a field\",\"`Get Property` with `value`, `==` and the value\"],[\"Assert value, on a checkbox\",\"`Get Checkbox State` with `==` and `checked` or `unchecked`\"],[\"Assert snapshot\",\"`Get Aria Snapshot` with `yaml`, `==` and the element's accessibility tree\"]]",[47,326,330],{"className":327,"code":328,"language":329,"meta":52,"style":52},"language-robot shiki shiki-themes github-light github-dark","*** Keywords ***\nCheck The Assertions Page\n    [Tags]    recorded\n    Get Element States    role=heading[name*=\"Assertions\"i]    *=    visible\n    Get Text    h1    contains    Assertions\n","robot",[54,331,332,337,342,347,352],{"__ignoreMap":52},[57,333,334],{"class":59,"line":60},[57,335,336],{},"*** Keywords ***\n",[57,338,339],{"class":59,"line":66},[57,340,341],{},"Check The Assertions Page\n",[57,343,344],{"class":59,"line":72},[57,345,346],{},"    [Tags]    recorded\n",[57,348,349],{"class":59,"line":78},[57,350,351],{},"    Get Element States    role=heading[name*=\"Assertions\"i]    *=    visible\n",[57,353,354],{"class":59,"line":84},[57,355,356],{},"    Get Text    h1    contains    Assertions\n",[24,358,359,360,363,364,367,368,370],{},"These are ordinary Browser getters, so they ",[28,361,362],{},"retry"," until the page catches up —\nsee ",[287,365,304],{"href":366},"\u002Fdocs\u002Fconcepts\u002Fassertions",". The expected values are arguments\nlike any other: make ",[54,369,304],{}," an argument and the keyword checks any page.",[37,372,374],{"id":373},"selectors","Selectors",[24,376,377],{},"Playwright picks each selector the way its own code generator does: a test id if\nthe element has one, then role and accessible name, placeholder, label, alt text,\ntext and title, and CSS as a last resort — the best of these that finds only\nthis element. The recorder writes them in Browser's public selector syntax, with\nthe same meaning:",[42,379],{":head":380,":rows":381},"[\"Element\",\"Recorded selector\"]","[[\"A link or button found by its name\",\"`role=link[name=\\\"Keywords\\\"s]` — exact; `name*=\\\"…\\\"i` — contains, any case\"],[\"An element with a test id\",\"`[data-testid=\\\"theme-toggle\\\"]`\"],[\"A field found by its placeholder\",\"`[placeholder*=\\\"Email\\\"i]`\"],[\"Text without a role\",\"`text=\u002F^\\\\s*Plain\\\\s+text\\\\s*$\u002F` — the whole text, exactly\"],[\"One of several similar elements\",\"`… >> nth=1`, or `div:has-text(\\\"Card one\\\")`\"],[\"Inside an iframe\",\"`#frame >>> role=button[name*=\\\"Pay\\\"i]`\"],[\"Two or more frames deep\",\"`>>> #inner >>> role=button[name*=\\\"Pay\\\"i]` — in whichever frame it is\"],[\"A widget known only by its label\",\"`label=\\\"Map\\\"i` — from `aria-label`, `aria-labelledby` or a `\u003Clabel>`\"]]",[24,383,384,385,388,389,392],{},"Every selector finds exactly the element you clicked when it was recorded; the\nlibrary's tests check this for each kind of selector Playwright generates. Whether it\nstill finds it tomorrow depends on the page: a name with a counter in it, like\n",[54,386,387],{},"role=link[name*=\"Get Text 5\"i]",", breaks when the count changes. Shorten such a\nselector, or make the changing part an ",[287,390,290],{"href":391},"\u002Fdocs\u002Frecording\u002Farguments#selectors",".",[394,395,396],"doc-note",{},[24,397,398],{},"Rarely, a selector has no public form — an attribute with an empty value, say. It\nstays in Playwright-internal syntax, which works but may change with a Playwright\nupgrade, and the toolbar says so.",[37,400,402],{"id":401},"values-are-written-exactly","Values are written exactly",[24,404,405],{},"Whatever you typed is what the keyword types, even where it means something to\nRobot Framework. Spaces Robot would read as a cell separator or strip at a cell\nedge are escaped with a backslash, so no two plain spaces meet:",[47,407,409],{"className":49,"code":408,"language":51,"meta":52,"style":52},"Fill Text    id=ref       \\#42                      # not a comment\nFill Text    id=name      two \\ spaces              # not a cell separator\nFill Text    id=path      \\${HOME}\u002Freports          # not a variable\nFill Text    id=note      first line\\nsecond line   # a line break\nFill Text    id=code      \\ padded \\                # edge spaces kept\nFill Text    id=tail      two trailing \\ \\          # both trailing spaces kept\nFill Text    id=empty     ${EMPTY}                  # the field was cleared\n",[54,410,411,416,421,426,431,436,441],{"__ignoreMap":52},[57,412,413],{"class":59,"line":60},[57,414,415],{},"Fill Text    id=ref       \\#42                      # not a comment\n",[57,417,418],{"class":59,"line":66},[57,419,420],{},"Fill Text    id=name      two \\ spaces              # not a cell separator\n",[57,422,423],{"class":59,"line":72},[57,424,425],{},"Fill Text    id=path      \\${HOME}\u002Freports          # not a variable\n",[57,427,428],{"class":59,"line":78},[57,429,430],{},"Fill Text    id=note      first line\\nsecond line   # a line break\n",[57,432,433],{"class":59,"line":84},[57,434,435],{},"Fill Text    id=code      \\ padded \\                # edge spaces kept\n",[57,437,438],{"class":59,"line":90},[57,439,440],{},"Fill Text    id=tail      two trailing \\ \\          # both trailing spaces kept\n",[57,442,443],{"class":59,"line":96},[57,444,445],{},"Fill Text    id=empty     ${EMPTY}                  # the field was cleared\n",[24,447,448,449,392],{},"Password fields get no special treatment: what you type is recorded as typed.\nMake it an argument without a default, so the keyword never holds a secret — see\n",[287,450,452],{"href":451},"\u002Fdocs\u002Frecording\u002Fpractice","Good practice and limits",[37,454,456],{"id":455},"not-recorded","Not recorded",[458,459,460,471,488,494],"ul",{},[461,462,463,466,467,470],"li",{},[28,464,465],{},"Hovering."," Playwright does not report it. Add ",[54,468,469],{},"Hover"," by hand where a menu\nneeds it.",[461,472,473,197,476,479,480,483,484,392],{},[28,474,475],{},"Anything while the toolbar picks a selector",[104,477,478],{},"Pick"," in the toolbar or ",[104,481,482],{},"Pick\nlocator"," in Playwright's — see ",[287,485,487],{"href":486},"\u002Fdocs\u002Frecording\u002Ftoolbar#picking-a-selector","Picking a selector",[461,489,490,493],{},[28,491,492],{},"Actions a later Playwright version adds."," Every action Playwright reports\ntoday has a Browser keyword. One without names itself in a notice; the keyword\nstays as it was.",[461,495,496,499],{},[28,497,498],{},"Other browser contexts."," Only the context that was active when the\nrecording started is recorded.",[501,502,503],"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":52,"searchDepth":66,"depth":66,"links":505},[506,507,510,511,512,513],{"id":39,"depth":66,"text":40},{"id":114,"depth":66,"text":115,"children":508},[509],{"id":151,"depth":72,"text":152},{"id":303,"depth":66,"text":304},{"id":373,"depth":66,"text":374},{"id":401,"depth":66,"text":402},{"id":455,"depth":66,"text":456},"Which Browser keyword each action becomes, how popups, dialogs, downloads and uploads are handled, recording assertions, and the selectors the recorder writes.","md",{},true,"\u002Fdocs\u002Frecording\u002Fwhat-gets-recorded","recording",{"title":19,"description":514},"docs\u002Frecording\u002Fwhat-gets-recorded","8ZAkz-AR3vWXhxqOy5bAJleXZYuHu8Y05YhcX9TTYUA",[524,529,531,535,539,543,547,552,556,560,564,568,572,577,581,585,589,594,598,602,606,609,613,615,619,623,627,628,633],{"path":525,"title":526,"description":527,"section":528,"order":84},"\u002Fdocs\u002Fconcepts\u002Farchitecture","How Browser works","Python, a Node process and Playwright — what runs where, and where the files land.","concepts",{"path":366,"title":304,"description":530,"section":528,"order":72},"Almost every getter can assert, every assertion retries, and each return type allows different operators. The complete AssertionEngine reference.",{"path":532,"title":533,"description":534,"section":528,"order":60},"\u002Fdocs\u002Fconcepts\u002Fbrowser-context-page","Browser, context and page","The three layers Playwright is built on — and why a new context is the cheapest clean slate you will ever get.",{"path":536,"title":537,"description":538,"section":528,"order":90},"\u002Fdocs\u002Fconcepts\u002Flogging","Logging and debugging","Four places Browser tells you what happened — log.html, the Playwright log, traces and coverage.",{"path":540,"title":541,"description":542,"section":528,"order":66},"\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":544,"title":545,"description":546,"section":528,"order":78},"\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":548,"title":549,"description":550,"section":551,"order":84},"\u002Fdocs\u002Fextending\u002Fbrowser-as-a-base","Browser as a base","Own the Browser instance in your own library — what you get free, what one line restores, and what you build yourself.","extending",{"path":553,"title":554,"description":555,"section":551,"order":66},"\u002Fdocs\u002Fextending\u002Fjavascript-basics","Just enough JavaScript","The JavaScript you need to write extensions and Evaluate JavaScript, for people who write Python.",{"path":557,"title":558,"description":559,"section":551,"order":72},"\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":561,"title":562,"description":563,"section":551,"order":78},"\u002Fdocs\u002Fextending\u002Fpython-libraries","Your own Python library","Move business logic out of Robot Framework and keep Browser exactly as it is.",{"path":565,"title":566,"description":567,"section":551,"order":60},"\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":569,"title":570,"description":571,"section":551,"order":90},"\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":573,"title":574,"description":575,"section":576,"order":78},"\u002Fdocs\u002Fmobile\u002Fdevice-list","Every device descriptor","The full list of names Get Device accepts, with the viewport, pixel ratio, touch and engine each one sets — filterable and sortable.","mobile",{"path":578,"title":579,"description":580,"section":576,"order":66},"\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.",{"path":582,"title":583,"description":584,"section":576,"order":60},"\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":586,"title":587,"description":588,"section":576,"order":72},"\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":590,"title":591,"description":592,"section":593,"order":72},"\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":595,"title":596,"description":597,"section":593,"order":78},"\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":599,"title":600,"description":601,"section":593,"order":66},"\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":603,"title":604,"description":605,"section":593,"order":60},"\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":289,"title":607,"description":608,"section":519,"order":72},"Keyword arguments","Turn a recorded value, part of it or part of a selector into an argument while you record — with or without a default, and everywhere it occurs.",{"path":610,"title":611,"description":612,"section":519,"order":84},"\u002Fdocs\u002Frecording\u002Ffiles","Where recorded keywords go","The suite file, a resource file or only the log; written live after every action; what the recorder changes in a file and what it never touches.",{"path":451,"title":452,"description":614,"section":519,"order":96},"How to record keywords worth keeping, what to check before you commit one, what the recorder cannot do, and what to do when it goes wrong.",{"path":616,"title":617,"description":618,"section":519,"order":60},"\u002Fdocs\u002Frecording\u002Frecord-keywords","Recording keywords","Click through the page and get a reusable user keyword, written into your suite while you work. Record Keyword and Record Keywords in five minutes.",{"path":620,"title":621,"description":622,"section":519,"order":90},"\u002Fdocs\u002Frecording\u002Fselectors","Recording selectors","Pick an element in the live browser and get a selector for it — Playwright's or a CSS one, checked against the page while you edit it.",{"path":624,"title":625,"description":626,"section":519,"order":66},"\u002Fdocs\u002Frecording\u002Ftoolbar","The recorder toolbar","Name and start keywords, save, undo and discard them, end the session, and keep the toolbar out of the page's way.",{"path":518,"title":19,"description":514,"section":519,"order":78},{"path":629,"title":630,"description":631,"section":632,"order":66},"\u002Fdocs\u002Fstart\u002Fgetting-started","Getting started","Install Browser, write a first test, and run it.","start",{"path":634,"title":635,"description":636,"section":632,"order":60},"\u002Fdocs\u002Fstart\u002Finstallation","Installation","The two ways to install Browser — with a bundled Node.js runtime, or with one you provide yourself — and how to upgrade and remove each.",[638,641,644],{"to":639,"label":640},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":642,"label":643},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":645,"label":646},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",[648],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=button[name=\"Save\"s]\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click With Options\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=row[name*=\"Order 4711\"i]    right    Shift    clickCount=2\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=textbox[name*=\"Email\"i]    jane@example.com\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Press Keys\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=textbox[name*=\"Search\"i]    Enter\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Check Checkbox\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=checkbox[name*=\"Remember me\"i]\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Select Options By\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=combobox[name*=\"Country\"i]    value    de\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Go To\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    https:\u002F\u002Fshop.example.com\u002Fcart\u003C\u002Fspan>\u003C\u002Fspan>",[650],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=link[name=\"Open in new tab\"s]\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Switch Page\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    NEW\u003C\u002Fspan>\u003C\u002Fspan>",[652],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=link[name=\"Open in new tab\"s]\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">page\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\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=textbox[name*=\"Search\"i]    shoes\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\">page\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=button[name=\"Save\"s]\u003C\u002Fspan>\u003C\u002Fspan>",[654],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Handle Future Dialogs\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    action=accept\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=button[name=\"Delete\"s]\u003C\u002Fspan>\u003C\u002Fspan>",[656],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">download\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Promise To Wait For Download\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=link[name=\"Export as CSV\"s]\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Wait For\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">download\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",[658],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">upload\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Promise To Upload File\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    &#x3C;define_path_to_file>\u002Freport.zip\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Click\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=button[name=\"Open Report\"s]\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Wait For\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">upload\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",[660],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Upload File By Selector\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    input[type=\"file\"]    &#x3C;define_path_to_file>\u002Freport.zip\u003C\u002Fspan>\u003C\u002Fspan>",[662],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Keywords ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Check The Assertions Page\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">    [Tags]\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    recorded\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Get Element States\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    role=heading[name*=\"Assertions\"i]\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    *=\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    visible\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Get Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    h1\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    contains\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    Assertions\u003C\u002Fspan>\u003C\u002Fspan>",[664],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=ref       \\#42\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">                      # not a comment\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=name      two \\ spaces\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">              # not a cell separator\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=path      \u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">\\$\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">{HOME}\u002Freports\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">          # not a variable\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=note      first line\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">second line\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">   # a line break\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=code      \\ padded \\\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">                # edge spaces kept\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=tail      two trailing \\ \\\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">          # both trailing spaces kept\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">Fill Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    id=empty     \u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">EMPTY\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA;font-style:italic\">                  # the field was cleared\u003C\u002Fspan>\u003C\u002Fspan>",1793560509099]