[{"data":1,"prerenderedAt":561},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"doc-\u002Fdocs\u002Foperations\u002Fdocker":17,"docs-nav":473,"nav-compare":543,"editor-qr3v8j":553,"editor-1vjpcvi":555,"editor-xn2h97":557,"editor-v7p4q5":559},["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":464,"extension":465,"meta":466,"navigation":467,"order":135,"path":468,"section":469,"seo":470,"stem":471,"__hash__":472},"docs\u002Fdocs\u002Foperations\u002Fdocker.md","Running in Docker",{"type":21,"value":22,"toc":450},"minimark",[23,32,35,40,43,78,83,94,98,183,190,209,213,216,223,245,258,264,281,290,296,299,312,323,333,339,342,346,361,373,377,385,389,395,399,421,424,428,446],[24,25,26,27,31],"p",{},"Browser needs a browser, and a browser needs a long list of system libraries that\ndiffer between distributions. On a laptop ",[28,29,30],"code",{},"rfbrowser init"," handles it. On a CI\nrunner, a colleague's machine, or a distribution nobody tested, it is the part\nthat goes wrong.",[24,33,34],{},"The published image removes that problem: Python, Node, Robot Framework, Browser\nand the browser binaries that ship in Playwright's base image, in versions\nknown to work together.",[36,37,39],"h2",{"id":38},"pull-it","Pull it",[24,41,42],{},"The same image is published to two registries. Pick whichever your infrastructure\nalready authenticates against — the same recipe, built from one\nDockerfile in the same release job.",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-bash shiki shiki-themes github-light github-dark","docker pull marketsquare\u002Frobotframework-browser:%%browser%%\ndocker pull ghcr.io\u002Fmarketsquare\u002Frobotframework-browser\u002Frfbrowser-stable:%%browser%%\n","bash","",[28,51,52,68],{"__ignoreMap":49},[53,54,57,61,65],"span",{"class":55,"line":56},"line",1,[53,58,60],{"class":59},"sScJk","docker",[53,62,64],{"class":63},"sZZnC"," pull",[53,66,67],{"class":63}," marketsquare\u002Frobotframework-browser:%%browser%%\n",[53,69,71,73,75],{"class":55,"line":70},2,[53,72,60],{"class":59},[53,74,64],{"class":63},[53,76,77],{"class":63}," ghcr.io\u002Fmarketsquare\u002Frobotframework-browser\u002Frfbrowser-stable:%%browser%%\n",[79,80],"doc-table",{":head":81,":rows":82},"[\"Tag\",\"Points at\"]","[[\"`%%browser%%`\",\"That exact release. **Use this in CI.**\"],[\"`%%browserMinor%%`\",\"Latest patch of that minor. Picks up fixes, not features.\"],[\"`%%browserMajor%%`\",\"Latest release of that major.\"],[\"`latest`\",\"Whatever released most recently. Fine for a local experiment; a moving target in a pipeline.\"]]",[24,84,85,86,89,90,93],{},"Both ",[28,87,88],{},"linux\u002Famd64"," and ",[28,91,92],{},"linux\u002Farm64\u002Fv8"," are built, so it runs natively on an\nApple Silicon machine as well as on an x86 runner.",[36,95,97],{"id":96},"run-your-suite","Run your suite",[44,99,101],{"className":46,"code":100,"language":48,"meta":49,"style":49},"docker run --rm \\\n  -v \"$(pwd)\u002Ftests:\u002Ftest\" \\\n  --ipc=host \\\n  --user pwuser \\\n  --security-opt seccomp=seccomp_profile.json \\\n  marketsquare\u002Frobotframework-browser:%%browser%% \\\n  bash -c \"robot --outputdir \u002Ftest\u002Foutput \u002Ftest\"\n",[28,102,103,117,133,141,152,163,171],{"__ignoreMap":49},[53,104,105,107,110,114],{"class":55,"line":56},[53,106,60],{"class":59},[53,108,109],{"class":63}," run",[53,111,113],{"class":112},"sj4cs"," --rm",[53,115,116],{"class":112}," \\\n",[53,118,119,122,125,128,131],{"class":55,"line":70},[53,120,121],{"class":112},"  -v",[53,123,124],{"class":63}," \"$(",[53,126,127],{"class":112},"pwd",[53,129,130],{"class":63},")\u002Ftests:\u002Ftest\"",[53,132,116],{"class":112},[53,134,136,139],{"class":55,"line":135},3,[53,137,138],{"class":112},"  --ipc=host",[53,140,116],{"class":112},[53,142,144,147,150],{"class":55,"line":143},4,[53,145,146],{"class":112},"  --user",[53,148,149],{"class":63}," pwuser",[53,151,116],{"class":112},[53,153,155,158,161],{"class":55,"line":154},5,[53,156,157],{"class":112},"  --security-opt",[53,159,160],{"class":63}," seccomp=seccomp_profile.json",[53,162,116],{"class":112},[53,164,166,169],{"class":55,"line":165},6,[53,167,168],{"class":63},"  marketsquare\u002Frobotframework-browser:%%browser%%",[53,170,116],{"class":112},[53,172,174,177,180],{"class":55,"line":173},7,[53,175,176],{"class":63},"  bash",[53,178,179],{"class":112}," -c",[53,181,182],{"class":63}," \"robot --outputdir \u002Ftest\u002Foutput \u002Ftest\"\n",[24,184,185,186,189],{},"Your suite is mounted in rather than copied, and the output directory is inside\nthat same mount — which is what gets ",[28,187,188],{},"log.html"," back onto your machine after the\ncontainer exits. A container writing its report to its own filesystem and then\nbeing removed is the classic first mistake.",[24,191,192,193,196,197,200,201,204,205,208],{},"The container writes as ",[28,194,195],{},"pwuser",", not as your user, so the mounted directory has\nto be writable by that account. If it is not, the run dies trying to create\n",[28,198,199],{},"output\u002F",". Create it up front and open it up — this project's own CI does\n",[28,202,203],{},"mkdir output && chmod -R 777 output"," — or skip the mount and ",[28,206,207],{},"docker cp"," the\nresults out afterwards.",[36,210,212],{"id":211},"the-flags-and-why-each-one-is-there","The flags, and why each one is there",[24,214,215],{},"None of these are ceremony. Each fixes a specific, confusing failure.",[217,218,220],"h3",{"id":219},"user-pwuser",[28,221,222],{},"--user pwuser",[24,224,225,229,230,233,234,237,238,240,241,244],{},[226,227,228],"strong",{},"Insurance, not a requirement."," The image already ends on ",[28,231,232],{},"USER pwuser",", so it\nruns as that user by default and this flag changes nothing — keep it only if\nyour platform is liable to force root. What matters is not overriding it with\n",[28,235,236],{},"--user root",": everything is installed for ",[28,239,195],{},", from the virtualenv at\n",[28,242,243],{},"\u002Fhome\u002Fpwuser\u002F.venv"," to the caches and file permissions, and running as root\ncauses failures that look like browser crashes.",[246,247,249],"doc-note",{"kind":248},"warning",[24,250,251,252,254,255,257],{},"Running as root, or as any user other than ",[28,253,195],{},", is unsupported and causes\nproblems that look like Browser bugs. If a derived image needs root for a build\nstep, switch back with ",[28,256,232],{}," before the image is used.",[217,259,261],{"id":260},"ipchost",[28,262,263],{},"--ipc=host",[24,265,266,268,269,276,277,280],{},[28,267,263],{}," is what this project recommends for Chromium, and it is what its\nown container tests use. The reason comes from\n",[270,271,275],"a",{"href":272,"rel":273},"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fdocker",[274],"nofollow","Playwright's Docker guide"," rather than from\nBrowser: Chromium allocates shared memory through ",[28,278,279],{},"\u002Fdev\u002Fshm",", Docker's default is 64 MB,\nwhich a real page will exhaust — and Chromium's response to running out is to\ncrash a renderer, mid-test, non-deterministically. It presents as flakiness, and\nyou will look for it in your test before you look for it in your container\nruntime.",[24,282,283,285,286,289],{},[28,284,263],{}," gives the container the host's IPC namespace and the problem\ndisappears. If your platform will not allow it, ",[28,287,288],{},"--shm-size=2gb"," is the\nsecond-best answer.",[217,291,293],{"id":292},"security-opt-seccompseccomp_profilejson",[28,294,295],{},"--security-opt seccomp=seccomp_profile.json",[24,297,298],{},"Chromium's sandbox needs syscalls that Docker's default seccomp profile\nblocks. Playwright publishes a profile that permits exactly those:",[44,300,302],{"className":46,"code":301,"language":48,"meta":49,"style":49},"wget https:\u002F\u002Fraw.githubusercontent.com\u002Fmicrosoft\u002Fplaywright\u002Fmaster\u002Futils\u002Fdocker\u002Fseccomp_profile.json\n",[28,303,304],{"__ignoreMap":49},[53,305,306,309],{"class":55,"line":56},[53,307,308],{"class":59},"wget",[53,310,311],{"class":63}," https:\u002F\u002Fraw.githubusercontent.com\u002Fmicrosoft\u002Fplaywright\u002Fmaster\u002Futils\u002Fdocker\u002Fseccomp_profile.json\n",[24,313,314,315,318,319,322],{},"The alternative you will find on the internet is ",[28,316,317],{},"--cap-add=SYS_ADMIN"," or\n",[28,320,321],{},"--no-sandbox",". Both work by turning the sandbox off. The seccomp profile keeps\nit on, which for a container that loads arbitrary web pages is the difference\nthat matters.",[246,324,325],{},[24,326,327,328,332],{},"The profile is Playwright's, not ours, and Playwright's\n",[270,329,331],{"href":272,"rel":330},[274],"Docker documentation"," is the place to check\nif it stops matching a newer Chromium.",[217,334,336],{"id":335},"rm",[28,337,338],{},"--rm",[24,340,341],{},"Housekeeping. Test containers are disposable, and without it a CI runner\naccumulates them until the disk fills.",[36,343,345],{"id":344},"headless-and-headful","Headless and headful",[24,347,348,349,352,353,356,357,360],{},"The image is built on Microsoft's Playwright image, which includes the\ndependencies for ",[226,350,351],{},"headful"," runs as well as headless. ",[28,354,355],{},"New Browser"," is headless\nby default and that is what you want in CI — note that ",[28,358,359],{},"Open Browser"," defaults\nthe other way.",[24,362,363,364,367,368,372],{},"Headful needs a display, and the image already carries Xvfb: prefix the command\nwith ",[28,365,366],{},"xvfb-run",", which is exactly what this project's own headful container\ntests do. A VNC sidecar is only needed if you want to ",[369,370,371],"em",{},"watch"," the run.",[36,374,376],{"id":375},"what-is-actually-in-the-image","What is actually in the image",[24,378,379,380,384],{},"Worth knowing, because it explains the constraints in\n",[270,381,383],{"href":382},"\u002Fdocs\u002Foperations\u002Fdocker-images","Building your own image",":",[79,386],{":head":387,":rows":388},"[\"Layer\",\"What it provides\"]","[[\"`%%playwrightDockerImage%%`\",\"Ubuntu Noble, Node.js, the browser binaries and every system library they need. Its Playwright is whatever the Dockerfile's `FROM` line pins, and that can lag the one the release was built against.\"],[\"Python 3.14 in a virtualenv\",\"`\u002Fhome\u002Fpwuser\u002F.venv`, already on `PATH`. `pip` inside the container installs into it.\"],[\"Robot Framework and Browser\",\"Browser is installed from PyPI at an exact pin. Robot Framework is not pinned — the image gets whatever was current when it was built.\"],[\"`init --skip-browsers`\",\"Browser's Node dependencies, **without** downloading browser binaries — the base image already has them.\"]]",[24,390,391,392,394],{},"That last row is the non-obvious one. The browsers in this image come from the\nPlaywright base image, not from ",[28,393,30],{},". It is why the image is far\nsmaller than an install that downloads its own browser binaries on top of the\nbase image's — and also why the base image's Playwright can differ from the one\nBrowser was built against, since nothing in the image re-downloads browsers to\nmatch.",[36,396,398],{"id":397},"checking-what-you-got","Checking what you got",[44,400,402],{"className":46,"code":401,"language":48,"meta":49,"style":49},"docker run --rm marketsquare\u002Frobotframework-browser:%%browser%% rfbrowser --version\n",[28,403,404],{"__ignoreMap":49},[53,405,406,408,410,412,415,418],{"class":55,"line":56},[53,407,60],{"class":59},[53,409,109],{"class":63},[53,411,113],{"class":112},[53,413,414],{"class":63}," marketsquare\u002Frobotframework-browser:%%browser%%",[53,416,417],{"class":63}," rfbrowser",[53,419,420],{"class":112}," --version\n",[24,422,423],{},"Prints the Browser library version, the Robot Framework version and the\nPlaywright version in one go. When something behaves differently in the container\nthan on your machine, run it in both places first — the answer is usually in the\ndiff.",[36,425,427],{"id":426},"next","Next",[429,430,431,438],"ul",{},[432,433,434,435,437],"li",{},"Adding your own dependencies, and pinning safely:\n",[270,436,383],{"href":382},".",[432,439,440,441,445],{},"If you run suites in parallel, read\n",[270,442,444],{"href":443},"\u002Fdocs\u002Foperations\u002Fnode-process","The Node process"," first: each Robot Framework\nprocess starts its own Node process, inside a container as much as outside it.",[447,448,449],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":49,"searchDepth":70,"depth":70,"links":451},[452,453,454,460,461,462,463],{"id":38,"depth":70,"text":39},{"id":96,"depth":70,"text":97},{"id":211,"depth":70,"text":212,"children":455},[456,457,458,459],{"id":219,"depth":135,"text":222},{"id":260,"depth":135,"text":263},{"id":292,"depth":135,"text":295},{"id":335,"depth":135,"text":338},{"id":344,"depth":70,"text":345},{"id":375,"depth":70,"text":376},{"id":397,"depth":70,"text":398},{"id":426,"depth":70,"text":427},"The published Browser image, the four docker run flags that matter, and why running as root breaks Chromium.","md",{},true,"\u002Fdocs\u002Foperations\u002Fdocker","operations",{"title":19,"description":464},"docs\u002Foperations\u002Fdocker","lY1JMCbOnw_1t_ujT6Texe-OOG9ZCcbjLdKM1WbMimQ",[474,479,483,487,491,495,499,504,508,512,516,521,525,529,530,532,536,538],{"path":475,"title":476,"description":477,"section":478,"order":154},"\u002Fdocs\u002Fconcepts\u002Farchitecture","How Browser works","Python, a Node process and Playwright — what runs where, and which installation to choose.","concepts",{"path":480,"title":481,"description":482,"section":478,"order":135},"\u002Fdocs\u002Fconcepts\u002Fassertions","Assertions","Almost every getter can assert, every assertion retries, and each return type allows different operators. The complete AssertionEngine reference.",{"path":484,"title":485,"description":486,"section":478,"order":56},"\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":488,"title":489,"description":490,"section":478,"order":165},"\u002Fdocs\u002Fconcepts\u002Flogging","Logging and debugging","Four places Browser tells you what happened — log.html, the Playwright log, traces and coverage.",{"path":492,"title":493,"description":494,"section":478,"order":70},"\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":496,"title":497,"description":498,"section":478,"order":143},"\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":500,"title":501,"description":502,"section":503,"order":70},"\u002Fdocs\u002Fextending\u002Fjavascript-basics","Just enough JavaScript","The JavaScript you need to write extensions and Evaluate JavaScript, for people who write Python.","extending",{"path":505,"title":506,"description":507,"section":503,"order":135},"\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":509,"title":510,"description":511,"section":503,"order":56},"\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":513,"title":514,"description":515,"section":503,"order":143},"\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":517,"title":518,"description":519,"section":520,"order":70},"\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":522,"title":523,"description":524,"section":520,"order":56},"\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":526,"title":527,"description":528,"section":520,"order":135},"\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":468,"title":19,"description":464,"section":469,"order":135},{"path":382,"title":383,"description":531,"section":469,"order":143},"Extending the published image with your dependencies, the version lock between Browser and Playwright, and using it as a CI job container.",{"path":533,"title":534,"description":535,"section":469,"order":70},"\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":443,"title":444,"description":537,"section":469,"order":56},"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":539,"title":540,"description":541,"section":542,"order":56},"\u002Fdocs\u002Fstart\u002Fgetting-started","Getting started","Install Browser, write a first test, and run it.","start",[544,547,550],{"to":545,"label":546},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":548,"label":549},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":551,"label":552},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",[554],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> pull\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> marketsquare\u002Frobotframework-browser:20.3.0\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> pull\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> ghcr.io\u002Fmarketsquare\u002Frobotframework-browser\u002Frfbrowser-stable:20.3.0\u003C\u002Fspan>\u003C\u002Fspan>",[556],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> run\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> --rm\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">  -v\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"$(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">pwd\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">\u002Ftests:\u002Ftest\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">  --ipc=host\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">  --user\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> pwuser\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">  --security-opt\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> seccomp=seccomp_profile.json\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">  marketsquare\u002Frobotframework-browser:20.3.0\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">  bash\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> -c\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">robot --outputdir \u002Ftest\u002Foutput \u002Ftest\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003C\u002Fspan>",[558],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">wget\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> https:\u002F\u002Fraw.githubusercontent.com\u002Fmicrosoft\u002Fplaywright\u002Fmaster\u002Futils\u002Fdocker\u002Fseccomp_profile.json\u003C\u002Fspan>\u003C\u002Fspan>",[560],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> run\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> --rm\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> marketsquare\u002Frobotframework-browser:20.3.0\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> rfbrowser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> --version\u003C\u002Fspan>\u003C\u002Fspan>",1786734140543]