[{"data":1,"prerenderedAt":634},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"doc-\u002Fdocs\u002Fmobile\u002Fdevices":17,"docs-nav":538,"nav-compare":610,"editor-szgtlr":620,"editor-316sox":622,"editor-1nfplf8":624,"editor-1agslzc":626,"editor-1j2ywey":628,"editor-xqgqk1":630,"editor-1a1eb2r":632},["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":530,"extension":531,"meta":532,"navigation":365,"order":60,"path":533,"section":534,"seo":535,"stem":536,"__hash__":537},"docs\u002Fdocs\u002Fmobile\u002Fdevices.md","Emulating a device",{"type":21,"value":22,"toc":523},"minimark",[23,32,35,40,88,102,105,120,149,155,159,178,183,186,201,205,231,234,265,273,283,287,290,299,302,311,338,342,345,482,485,498,501,519],[24,25,26,27,31],"p",{},"A viewport gets you the layout. A ",[28,29,30],"strong",{},"device descriptor"," gets you the rest: the\nuser agent the page sees, whether it thinks it has a touch screen, and how sharp\nthe screen is.",[24,33,34],{},"Playwright ships descriptors for the common handsets and tablets, plus a few\ndesktop profiles, and Browser\nexposes them as keywords.",[36,37,39],"h2",{"id":38},"using-one","Using one",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-robot shiki shiki-themes github-light github-dark","*** Test Cases ***\nThe Product Page On A Phone\n    ${device} =    Get Device    iPhone 13\n    New Context    &{device}\n    New Page    ${URL}\n    Get Viewport Size    width    ==    ${390}\n","robot","",[48,49,50,58,64,70,76,82],"code",{"__ignoreMap":46},[51,52,55],"span",{"class":53,"line":54},"line",1,[51,56,57],{},"*** Test Cases ***\n",[51,59,61],{"class":53,"line":60},2,[51,62,63],{},"The Product Page On A Phone\n",[51,65,67],{"class":53,"line":66},3,[51,68,69],{},"    ${device} =    Get Device    iPhone 13\n",[51,71,73],{"class":53,"line":72},4,[51,74,75],{},"    New Context    &{device}\n",[51,77,79],{"class":53,"line":78},5,[51,80,81],{},"    New Page    ${URL}\n",[51,83,85],{"class":53,"line":84},6,[51,86,87],{},"    Get Viewport Size    width    ==    ${390}\n",[24,89,90,93,94,97,98,101],{},[48,91,92],{},"Get Device"," returns a dictionary, and ",[48,95,96],{},"&{device}"," expands it into ",[48,99,100],{},"New Context","\nas named arguments. That is the whole idiom — nothing to unpack by hand.",[24,103,104],{},"To find out what is available:",[41,106,108],{"className":43,"code":107,"language":45,"meta":46,"style":46},"${devices} =    Get Devices\nLog Dictionary    ${devices}    # needs Library Collections\n",[48,109,110,115],{"__ignoreMap":46},[51,111,112],{"class":53,"line":54},[51,113,114],{},"${devices} =    Get Devices\n",[51,116,117],{"class":53,"line":60},[51,118,119],{},"Log Dictionary    ${devices}    # needs Library Collections\n",[24,121,122,123,126,127,126,130,126,133,136,137,140,141,144,145,148],{},"The list is Playwright's, so it grows when Playwright updates. Names are exact\nand case-sensitive: ",[48,124,125],{},"iPhone 13",", ",[48,128,129],{},"iPhone 13 Pro Max",[48,131,132],{},"Pixel 7",[48,134,135],{},"Galaxy S9+",",\n",[48,138,139],{},"iPad Mini",", and the ",[48,142,143],{},"landscape"," variants such as ",[48,146,147],{},"iPhone 13 landscape",".",[150,151,152],"doc-note",{},[24,153,154],{},"Pin the descriptor name in a variable rather than scattering it through a suite.\nPin the name in a variable rather than scattering it through a suite — the list\nis Playwright's, and an upgrade is the one thing that can move it under you. One\nvariable is a\none-line fix.",[36,156,158],{"id":157},"what-a-descriptor-actually-sets","What a descriptor actually sets",[24,160,161,162,165,166,169,170,174,175,177],{},"Six or seven properties — most phone and tablet descriptors also carry\n",[48,163,164],{},"screen",", what ",[48,167,168],{},"window.screen"," reports. On a portrait descriptor it is taller\nthan the viewport, which excludes browser chrome; a landscape descriptor keeps\nthe ",[171,172,173],"em",{},"portrait"," screen, so ",[48,176,147],{}," is a 750×342 viewport on a\n390×844 screen. It is worth knowing them individually, because each one changes\nsomething different, and you can set any of them yourself without a descriptor.",[179,180],"doc-table",{":head":181,":rows":182},"[\"Property\",\"What it changes\"]","[[\"`viewport`\",\"The layout size. This is what your CSS media queries react to.\"],[\"`userAgent`\",\"The string the page reads. Anything doing server-side or JavaScript device sniffing branches on this.\"],[\"`deviceScaleFactor`\",\"Device pixel ratio — 2 to 4.5 depending on the handset, 3 on an iPhone 13 and 2.625 on a Pixel 7, down to 1 on older hardware. Decides which image a `srcset` picks, and the resolution of your screenshots.\"],[\"`isMobile`\",\"Sets the meta viewport behaviour, so the page is laid out the way a phone lays it out rather than a shrunken desktop. **Not supported in Firefox.**\"],[\"`hasTouch`\",\"Makes touch events available. Required before `Tap` will work, and it is what `@media (pointer: coarse)` and `'ontouchstart' in window` detect.\"],[\"`defaultBrowserType`\",\"Which engine Playwright would launch for this device — `webkit` for Apple hardware, `chromium` for Android. See the caveat below.\"]]",[24,184,185],{},"Setting them directly is perfectly reasonable when you want one property rather\nthan a whole handset:",[41,187,189],{"className":43,"code":188,"language":45,"meta":46,"style":46},"# A touch device, without pretending to be any particular phone.\nNew Context    viewport={'width': 400, 'height': 900}    hasTouch=True    isMobile=True\n",[48,190,191,196],{"__ignoreMap":46},[51,192,193],{"class":53,"line":54},[51,194,195],{},"# A touch device, without pretending to be any particular phone.\n",[51,197,198],{"class":53,"line":60},[51,199,200],{},"New Context    viewport={'width': 400, 'height': 900}    hasTouch=True    isMobile=True\n",[36,202,204],{"id":203},"the-caveat-that-matters","The caveat that matters",[24,206,207,210,211,214,215,217,218,220,221,223,224,226,227,230],{},[28,208,209],{},"A descriptor changes the engine only when nothing is open yet."," Every\ndescriptor carries ",[48,212,213],{},"defaultBrowserType",", and ",[48,216,100],{}," honours it if there\nis no browser running — so ",[48,219,92],{}," for ",[48,222,125],{}," followed by ",[48,225,100],{},"\ndoes launch WebKit. Applied to an ",[171,228,229],{},"already running"," Chromium it changes nothing\nbut the emulation: a Chromium reporting an iPhone user agent at an iPhone\nviewport. It is not Safari either way.",[24,232,233],{},"If iOS is the thing you care about, be explicit about the engine:",[41,235,237],{"className":43,"code":236,"language":45,"meta":46,"style":46},"*** Test Cases ***\nThe Checkout On Something Close To An iPhone\n    ${device} =    Get Device    iPhone 13\n    New Browser    webkit    headless=True\n    New Context    &{device}\n    New Page    ${URL}\n",[48,238,239,243,248,252,257,261],{"__ignoreMap":46},[51,240,241],{"class":53,"line":54},[51,242,57],{},[51,244,245],{"class":53,"line":60},[51,246,247],{},"The Checkout On Something Close To An iPhone\n",[51,249,250],{"class":53,"line":66},[51,251,69],{},[51,253,254],{"class":53,"line":72},[51,255,256],{},"    New Browser    webkit    headless=True\n",[51,258,259],{"class":53,"line":78},[51,260,75],{},[51,262,263],{"class":53,"line":84},[51,264,81],{},[24,266,267,268,148],{},"That is as close as automation gets: the same engine family Safari is built on,\nat the right size, with touch enabled. It is genuinely useful — WebKit catches\nCSS and JavaScript differences that Chromium never will — and it is still not\nSafari on an actual iPhone. Keep that last mile for\n",[269,270,272],"a",{"href":271},"\u002Fdocs\u002Fmobile\u002Fresponsive","real humans on real devices",[150,274,276],{"kind":275},"warning",[24,277,278,279,282],{},"Playwright's API documentation still lists ",[48,280,281],{},"isMobile"," as unsupported in Firefox,\nbut the version Browser bundles applies it: Firefox honours the meta viewport\nexactly as Chromium does, and raises no error. Treat that note as stale rather\nthan as a reason to skip Firefox — but check it against the Playwright you\nship, since this is undocumented behaviour.",[36,284,286],{"id":285},"orientation","Orientation",[24,288,289],{},"There is no rotate keyword. Landscape is a viewport whose width exceeds its\nheight, so either use the landscape descriptor:",[41,291,293],{"className":43,"code":292,"language":45,"meta":46,"style":46},"${device} =    Get Device    iPhone 13 landscape\n",[48,294,295],{"__ignoreMap":46},[51,296,297],{"class":53,"line":54},[51,298,292],{},[24,300,301],{},"or set the size yourself:",[41,303,305],{"className":43,"code":304,"language":45,"meta":46,"style":46},"Set Viewport Size    750    342\n",[48,306,307],{"__ignoreMap":46},[51,308,309],{"class":53,"line":54},[51,310,304],{},[24,312,313,314,316,317,319,320,322,323,326,327,330,331,333,334,337],{},"Read those numbers off the descriptor rather than transposing the portrait ones\n— ",[48,315,125],{}," is 390×664 and its landscape descriptor is 750×342, not a swap.\nAnd the two routes are not equivalent: the descriptor also carries ",[48,318,164],{},", the\nuser agent and ",[48,321,281],{},", while ",[48,324,325],{},"Set Viewport Size"," leaves those alone and\n",[171,328,329],{},"overwrites"," ",[48,332,168],{}," with the new size, so the screen\u002Fviewport\ndistinction disappears.\nIf your app listens for ",[48,335,336],{},"orientationchange",", the resize is what fires it.",[36,339,341],{"id":340},"a-worked-example","A worked example",[24,343,344],{},"Putting the chapter together — one device, one context, a real check:",[41,346,349],{"className":43,"code":347,"filename":348,"language":45,"meta":46,"style":46},"*** Settings ***\nLibrary     Browser\n\n*** Variables ***\n${PHONE}        iPhone 13\n${URL}          https:\u002F\u002Fwww.imbus.de\u002Fen\u002Facademy\u002Frfcp-robot-framework-certified-professional\n\n*** Test Cases ***\nThe Certification Page On A Phone\n    ${device} =    Get Device    ${PHONE}\n    New Browser    webkit    headless=True\n    New Context    &{device}\n    New Page    ${URL}\n\n    # A real cookie banner, in the way of everything until it is dealt with.\n    Tap                        text=\"allow all cookies\"\n    Wait For Elements State    button.cc-allow-all    hidden\n\n    Get Text    h1    *=    Certified Professional\n\n    # …and the page never scrolls sideways.\n    ${overflow} =    Evaluate JavaScript    ${None}\n    ...    () => document.documentElement.scrollWidth > document.documentElement.clientWidth\n    Should Not Be True    ${overflow}\n","mobile.robot",[48,350,351,356,361,367,372,377,382,387,392,398,404,409,414,419,424,430,436,442,447,453,458,464,470,476],{"__ignoreMap":46},[51,352,353],{"class":53,"line":54},[51,354,355],{},"*** Settings ***\n",[51,357,358],{"class":53,"line":60},[51,359,360],{},"Library     Browser\n",[51,362,363],{"class":53,"line":66},[51,364,366],{"emptyLinePlaceholder":365},true,"\n",[51,368,369],{"class":53,"line":72},[51,370,371],{},"*** Variables ***\n",[51,373,374],{"class":53,"line":78},[51,375,376],{},"${PHONE}        iPhone 13\n",[51,378,379],{"class":53,"line":84},[51,380,381],{},"${URL}          https:\u002F\u002Fwww.imbus.de\u002Fen\u002Facademy\u002Frfcp-robot-framework-certified-professional\n",[51,383,385],{"class":53,"line":384},7,[51,386,366],{"emptyLinePlaceholder":365},[51,388,390],{"class":53,"line":389},8,[51,391,57],{},[51,393,395],{"class":53,"line":394},9,[51,396,397],{},"The Certification Page On A Phone\n",[51,399,401],{"class":53,"line":400},10,[51,402,403],{},"    ${device} =    Get Device    ${PHONE}\n",[51,405,407],{"class":53,"line":406},11,[51,408,256],{},[51,410,412],{"class":53,"line":411},12,[51,413,75],{},[51,415,417],{"class":53,"line":416},13,[51,418,81],{},[51,420,422],{"class":53,"line":421},14,[51,423,366],{"emptyLinePlaceholder":365},[51,425,427],{"class":53,"line":426},15,[51,428,429],{},"    # A real cookie banner, in the way of everything until it is dealt with.\n",[51,431,433],{"class":53,"line":432},16,[51,434,435],{},"    Tap                        text=\"allow all cookies\"\n",[51,437,439],{"class":53,"line":438},17,[51,440,441],{},"    Wait For Elements State    button.cc-allow-all    hidden\n",[51,443,445],{"class":53,"line":444},18,[51,446,366],{"emptyLinePlaceholder":365},[51,448,450],{"class":53,"line":449},19,[51,451,452],{},"    Get Text    h1    *=    Certified Professional\n",[51,454,456],{"class":53,"line":455},20,[51,457,366],{"emptyLinePlaceholder":365},[51,459,461],{"class":53,"line":460},21,[51,462,463],{},"    # …and the page never scrolls sideways.\n",[51,465,467],{"class":53,"line":466},22,[51,468,469],{},"    ${overflow} =    Evaluate JavaScript    ${None}\n",[51,471,473],{"class":53,"line":472},23,[51,474,475],{},"    ...    () => document.documentElement.scrollWidth > document.documentElement.clientWidth\n",[51,477,479],{"class":53,"line":478},24,[51,480,481],{},"    Should Not Be True    ${overflow}\n",[24,483,484],{},"Two details in there are worth more than the example itself.",[24,486,487,490,491,494,495,497],{},[48,488,489],{},"hidden",", not ",[48,492,493],{},"detached",": that banner is still in the document after you accept\nit, sized to nothing. Reaching for ",[48,496,493],{}," — the obvious guess — waits out\nthe full timeout and fails.",[24,499,500],{},"And it is a page you can actually run this against, which is the point. An\nexample that only works against an app you do not have teaches the syntax and\nhides every problem the syntax exists for.",[24,502,503,506,507,510,511,514,515,148],{},[48,504,505],{},"Tap"," rather than ",[48,508,509],{},"Click"," is deliberate, and it only works because the\ndescriptor set ",[48,512,513],{},"hasTouch",". That is the subject of\n",[269,516,518],{"href":517},"\u002Fdocs\u002Fmobile\u002Ftouch","the next page",[520,521,522],"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":46,"searchDepth":60,"depth":60,"links":524},[525,526,527,528,529],{"id":38,"depth":60,"text":39},{"id":157,"depth":60,"text":158},{"id":203,"depth":60,"text":204},{"id":285,"depth":60,"text":286},{"id":340,"depth":60,"text":341},"Device descriptors, what the six or seven properties they set actually change, and the one that emulation cannot give you.","md",{},"\u002Fdocs\u002Fmobile\u002Fdevices","mobile",{"title":19,"description":530},"docs\u002Fmobile\u002Fdevices","Eh-9DRSFMdwi62xav4o98f5dd6S3vq4S4l5kxK1QDjA",[539,544,548,552,556,560,564,569,573,577,581,582,585,588,593,597,601,605],{"path":540,"title":541,"description":542,"section":543,"order":78},"\u002Fdocs\u002Fconcepts\u002Farchitecture","How Browser works","Python, a Node process and Playwright — what runs where, and which installation to choose.","concepts",{"path":545,"title":546,"description":547,"section":543,"order":66},"\u002Fdocs\u002Fconcepts\u002Fassertions","Assertions","Almost every getter can assert, every assertion retries, and each return type allows different operators. The complete AssertionEngine reference.",{"path":549,"title":550,"description":551,"section":543,"order":54},"\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":553,"title":554,"description":555,"section":543,"order":84},"\u002Fdocs\u002Fconcepts\u002Flogging","Logging and debugging","Four places Browser tells you what happened — log.html, the Playwright log, traces and coverage.",{"path":557,"title":558,"description":559,"section":543,"order":60},"\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":561,"title":562,"description":563,"section":543,"order":72},"\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":565,"title":566,"description":567,"section":568,"order":60},"\u002Fdocs\u002Fextending\u002Fjavascript-basics","Just enough JavaScript","The JavaScript you need to write extensions and Evaluate JavaScript, for people who write Python.","extending",{"path":570,"title":571,"description":572,"section":568,"order":66},"\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":574,"title":575,"description":576,"section":568,"order":54},"\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":578,"title":579,"description":580,"section":568,"order":72},"\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":533,"title":19,"description":530,"section":534,"order":60},{"path":271,"title":583,"description":584,"section":534,"order":54},"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":517,"title":586,"description":587,"section":534,"order":66},"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":589,"title":590,"description":591,"section":592,"order":66},"\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":594,"title":595,"description":596,"section":592,"order":72},"\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":598,"title":599,"description":600,"section":592,"order":60},"\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":602,"title":603,"description":604,"section":592,"order":54},"\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":606,"title":607,"description":608,"section":609,"order":54},"\u002Fdocs\u002Fstart\u002Fgetting-started","Getting started","Install Browser, write a first test, and run it.","start",[611,614,617],{"to":612,"label":613},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":615,"label":616},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":618,"label":619},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",[621],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Test Cases ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">The Product Page On A Phone\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Get Device\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    iPhone 13\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Context\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    &#x26;{\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Page\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">URL\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Get Viewport Size\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    width\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    ==\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">390\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",[623],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#96A2A8;font-style:italic\">${devices} =    Get Devices\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#96A2A8;font-style:italic\">Log Dictionary    ${devices}    # needs Library Collections\u003C\u002Fspan>\u003C\u002Fspan>",[625],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#96A2A8;font-style:italic\"># A touch device, without pretending to be any particular phone.\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#96A2A8;font-style:italic\">New Context    viewport={'width': 400, 'height': 900}    hasTouch=True    isMobile=True\u003C\u002Fspan>\u003C\u002Fspan>",[627],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Test Cases ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">The Checkout On Something Close To An iPhone\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Get Device\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    iPhone 13\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    webkit\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    headless=True\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Context\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    &#x26;{\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Page\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">URL\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",[629],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#96A2A8;font-style:italic\">${device} =    Get Device    iPhone 13 landscape\u003C\u002Fspan>\u003C\u002Fspan>",[631],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#96A2A8;font-style:italic\">Set Viewport Size    750    342\u003C\u002Fspan>\u003C\u002Fspan>",[633],"\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>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Variables ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">PHONE\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">        iPhone 13\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">URL\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">          https:\u002F\u002Fwww.imbus.de\u002Fen\u002Facademy\u002Frfcp-robot-framework-certified-professional\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Test Cases ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">The Certification Page On A Phone\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Get Device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">PHONE\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    webkit\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    headless=True\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Context\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    &#x26;{\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">device\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Page\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">URL\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA;font-style:italic\">    # A real cookie banner, in the way of everything until it is dealt with.\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Tap\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">                        text=\"allow all cookies\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Wait For Elements State\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    button.cc-allow-all\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    hidden\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Get Text\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    h1\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    *=\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    Certified Professional\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA;font-style:italic\">    # …and the page never scrolls sideways.\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">overflow\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Evaluate JavaScript\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">None\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E\">    ...\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    () => document.documentElement.scrollWidth > document.documentElement.clientWidth\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Should Not Be True\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">overflow\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",1786734140319]