[{"data":1,"prerenderedAt":699},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"doc-\u002Fdocs\u002Fextending\u002Fpython-plugins":17,"docs-nav":606,"nav-compare":679,"editor-nbi2zj":689,"editor-1tnue0t":691,"editor-nb8fqu":693,"editor-vxyxyw":695,"editor-1lcsayh":697},["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":598,"extension":599,"meta":600,"navigation":99,"order":90,"path":601,"section":602,"seo":603,"stem":604,"__hash__":605},"docs\u002Fdocs\u002Fextending\u002Fpython-plugins.md","Python plugins",{"type":21,"value":22,"toc":593},"minimark",[23,35,61,66,77,238,241,292,299,309,312,363,367,374,399,409,416,445,462,466,469,551,586,589],[24,25,26,27,34],"p",{},"The Python plugin API adds keywords to Browser, or replaces existing ones,\nwithout forking the library. It is provided by\n",[28,29,33],"a",{"href":30,"rel":31},"https:\u002F\u002Fgithub.com\u002Frobotframework\u002FPythonLibCore",[32],"nofollow","PythonLibCore",".",[36,37,38],"doc-note",{},[24,39,40,41,45,46,51,52,56,57,60],{},"This is the more capable of the two extension points. A\n",[28,42,44],{"href":43},"\u002Fdocs\u002Fextending\u002Fjavascript-extensions","JavaScript module"," runs only on the Node\nside; a Python plugin can use both, and can use\n",[28,47,50],{"href":48,"rel":49},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002FAssertionEngine",[32],"AssertionEngine"," directly —\ndecorate the keyword with ",[53,54,55],"code",{},"Browser.assertion_engine.with_assertion_polling"," and\ncall ",[53,58,59],{},"verify_assertion"," yourself — to give your keywords the same retrying\nassertion arguments the built-in getters have.",[62,63,65],"h2",{"id":64},"a-python-only-plugin","A Python-only plugin",[24,67,68,69,72,73,76],{},"Subclass ",[53,70,71],{},"LibraryComponent"," and decorate with ",[53,74,75],{},"@keyword",":",[78,79,84],"pre",{"className":80,"code":81,"language":82,"meta":83,"style":83},"language-python shiki shiki-themes github-light github-dark","import json\n\nfrom robot.api import logger\nfrom robot.api.deco import keyword\n\nfrom Browser.base.librarycomponent import LibraryComponent\nfrom Browser.generated.playwright_pb2 import Request\n\n\nclass SimplePythonPlugin(LibraryComponent):\n\n    @keyword\n    def cookie_via_public_api(self) -> dict:\n        \"\"\"Uses Browser's own public API.\"\"\"\n        cookies = self.library.get_cookies()\n        logger.debug(json.dumps(cookies, indent=4, default=str))\n        assert len(cookies) == 1, \"Too many cookies.\"\n        return {\"name\": cookies[0][\"name\"], \"value\": cookies[0][\"value\"]}\n\n    @keyword\n    def cookie_via_grpc(self) -> dict:\n        \"\"\"Calls the Node side directly over gRPC.\"\"\"\n        with self.playwright.grpc_channel() as stub:\n            response = stub.GetCookies(Request().Empty())\n            cookies = json.loads(response.json)\n        return {\"name\": cookies[0][\"name\"], \"value\": cookies[0][\"value\"]}\n","python","",[53,85,86,94,101,107,113,118,124,130,135,140,146,151,157,163,169,175,181,187,193,198,203,209,215,221,227,233],{"__ignoreMap":83},[87,88,91],"span",{"class":89,"line":90},"line",1,[87,92,93],{},"import json\n",[87,95,97],{"class":89,"line":96},2,[87,98,100],{"emptyLinePlaceholder":99},true,"\n",[87,102,104],{"class":89,"line":103},3,[87,105,106],{},"from robot.api import logger\n",[87,108,110],{"class":89,"line":109},4,[87,111,112],{},"from robot.api.deco import keyword\n",[87,114,116],{"class":89,"line":115},5,[87,117,100],{"emptyLinePlaceholder":99},[87,119,121],{"class":89,"line":120},6,[87,122,123],{},"from Browser.base.librarycomponent import LibraryComponent\n",[87,125,127],{"class":89,"line":126},7,[87,128,129],{},"from Browser.generated.playwright_pb2 import Request\n",[87,131,133],{"class":89,"line":132},8,[87,134,100],{"emptyLinePlaceholder":99},[87,136,138],{"class":89,"line":137},9,[87,139,100],{"emptyLinePlaceholder":99},[87,141,143],{"class":89,"line":142},10,[87,144,145],{},"class SimplePythonPlugin(LibraryComponent):\n",[87,147,149],{"class":89,"line":148},11,[87,150,100],{"emptyLinePlaceholder":99},[87,152,154],{"class":89,"line":153},12,[87,155,156],{},"    @keyword\n",[87,158,160],{"class":89,"line":159},13,[87,161,162],{},"    def cookie_via_public_api(self) -> dict:\n",[87,164,166],{"class":89,"line":165},14,[87,167,168],{},"        \"\"\"Uses Browser's own public API.\"\"\"\n",[87,170,172],{"class":89,"line":171},15,[87,173,174],{},"        cookies = self.library.get_cookies()\n",[87,176,178],{"class":89,"line":177},16,[87,179,180],{},"        logger.debug(json.dumps(cookies, indent=4, default=str))\n",[87,182,184],{"class":89,"line":183},17,[87,185,186],{},"        assert len(cookies) == 1, \"Too many cookies.\"\n",[87,188,190],{"class":89,"line":189},18,[87,191,192],{},"        return {\"name\": cookies[0][\"name\"], \"value\": cookies[0][\"value\"]}\n",[87,194,196],{"class":89,"line":195},19,[87,197,100],{"emptyLinePlaceholder":99},[87,199,201],{"class":89,"line":200},20,[87,202,156],{},[87,204,206],{"class":89,"line":205},21,[87,207,208],{},"    def cookie_via_grpc(self) -> dict:\n",[87,210,212],{"class":89,"line":211},22,[87,213,214],{},"        \"\"\"Calls the Node side directly over gRPC.\"\"\"\n",[87,216,218],{"class":89,"line":217},23,[87,219,220],{},"        with self.playwright.grpc_channel() as stub:\n",[87,222,224],{"class":89,"line":223},24,[87,225,226],{},"            response = stub.GetCookies(Request().Empty())\n",[87,228,230],{"class":89,"line":229},25,[87,231,232],{},"            cookies = json.loads(response.json)\n",[87,234,236],{"class":89,"line":235},26,[87,237,192],{},[24,239,240],{},"Load it at import:",[78,242,246],{"className":243,"code":244,"language":245,"meta":83,"style":83},"language-robot shiki shiki-themes github-light github-dark","*** Settings ***\nLibrary    Browser    plugins=${CURDIR}\u002FSimplePythonPlugin.py\n\n*** Test Cases ***\nRead A Cookie\n    New Page    https:\u002F\u002Fexample.com\n    Add Cookie    session    abc123    url=https:\u002F\u002Fexample.com\n    ${cookie} =    Cookie Via Public Api\n    Should Be Equal    ${cookie}[name]    session\n","robot",[53,247,248,253,258,262,267,272,277,282,287],{"__ignoreMap":83},[87,249,250],{"class":89,"line":90},[87,251,252],{},"*** Settings ***\n",[87,254,255],{"class":89,"line":96},[87,256,257],{},"Library    Browser    plugins=${CURDIR}\u002FSimplePythonPlugin.py\n",[87,259,260],{"class":89,"line":103},[87,261,100],{"emptyLinePlaceholder":99},[87,263,264],{"class":89,"line":109},[87,265,266],{},"*** Test Cases ***\n",[87,268,269],{"class":89,"line":115},[87,270,271],{},"Read A Cookie\n",[87,273,274],{"class":89,"line":120},[87,275,276],{},"    New Page    https:\u002F\u002Fexample.com\n",[87,278,279],{"class":89,"line":126},[87,280,281],{},"    Add Cookie    session    abc123    url=https:\u002F\u002Fexample.com\n",[87,283,284],{"class":89,"line":132},[87,285,286],{},"    ${cookie} =    Cookie Via Public Api\n",[87,288,289],{"class":89,"line":137},[87,290,291],{},"    Should Be Equal    ${cookie}[name]    session\n",[24,293,294,295,298],{},"Two routes are shown above deliberately. ",[53,296,297],{},"self.library"," is the supported public\nAPI and should be your default. Dropping to gRPC gets you at anything the Node\nside can do, at the cost of coupling to internals that may change.",[24,300,301,302,305,306,34],{},"Several plugins can be loaded at once — ",[53,303,304],{},"plugins="," takes one name, a\ncomma-separated list, or a real list. Arguments go after the class, separated by\nsemicolons: ",[53,307,308],{},"plugins=pkg.Plugin;arg1;kw=val",[24,310,311],{},"Two rules that fail loudly, and one that does not:",[313,314,315,322,331],"ul",{},[316,317,318,319,34],"li",{},"The class name must match the module or file name, or the import fails with\n",[53,320,321],{},"DataError",[316,323,324,325,327,328,34],{},"A plugin that does not inherit ",[53,326,71],{}," fails with ",[53,329,330],{},"PluginError",[316,332,333,334,338,339,342,343,346,347,350,351,355,356,358,359,362],{},"A plugin keyword whose ",[335,336,337],"strong",{},"method name"," matches a built-in silently replaces\nit. Plugins load last — library keywords, then JavaScript extensions, then\nplugins — so last wins, with no warning. The exception is the handful of\nkeywords declared with an explicit ",[53,340,341],{},"@keyword(name=...)",", such as\n",[53,344,345],{},"Evaluate JavaScript",", ",[53,348,349],{},"Get BoundingBox"," and the storage keywords: matching\ntheir method name creates a duplicate instead, and the suite fails with\n",[352,353,354],"em",{},"Keyword with same name defined multiple times",". Give your method the same\n",[53,357,341],{}," to replace one of those. Every plugin keyword is tagged\n",[53,360,361],{},"Plugin",", which is how you spot one in Libdoc.",[62,364,366],{"id":365},"selectors-inside-a-plugin","Selectors inside a plugin",[24,368,369,370,373],{},"The public keywords resolve the ",[53,371,372],{},"Set Selector Prefix"," value for you, so a\nplugin that calls them needs to do nothing:",[78,375,377],{"className":80,"code":376,"language":82,"meta":83,"style":83},"@keyword\ndef disable_element(self, selector):\n    \"\"\"Disables an element.\"\"\"\n    self.library.evaluate_javascript(selector, \"e => e.disabled = true\")\n",[53,378,379,384,389,394],{"__ignoreMap":83},[87,380,381],{"class":89,"line":90},[87,382,383],{},"@keyword\n",[87,385,386],{"class":89,"line":96},[87,387,388],{},"def disable_element(self, selector):\n",[87,390,391],{"class":89,"line":103},[87,392,393],{},"    \"\"\"Disables an element.\"\"\"\n",[87,395,396],{"class":89,"line":109},[87,397,398],{},"    self.library.evaluate_javascript(selector, \"e => e.disabled = true\")\n",[24,400,401,402,405,406,34],{},"Resolve it yourself with ",[53,403,404],{},"self.resolve_selector(selector)"," only when you bypass\nthe public API — a direct gRPC call, or ",[53,407,408],{},"call_js_keyword",[24,410,411,412,415],{},"For a keyword that should also honour presenter mode — highlighting the element\nand pausing so a human can follow along — use ",[53,413,414],{},"presenter_mode",", which resolves\nthe selector as well:",[78,417,419],{"className":80,"code":418,"language":82,"meta":83,"style":83},"@keyword\ndef highlight_and_blur(self, selector):\n    \"\"\"Blurs the element, honouring presenter mode.\"\"\"\n    selector = self.presenter_mode(selector, self.strict_mode)\n    self.call_js_keyword(\"myBlur\", selector=selector)\n",[53,420,421,425,430,435,440],{"__ignoreMap":83},[87,422,423],{"class":89,"line":90},[87,424,383],{},[87,426,427],{"class":89,"line":96},[87,428,429],{},"def highlight_and_blur(self, selector):\n",[87,431,432],{"class":89,"line":103},[87,433,434],{},"    \"\"\"Blurs the element, honouring presenter mode.\"\"\"\n",[87,436,437],{"class":89,"line":109},[87,438,439],{},"    selector = self.presenter_mode(selector, self.strict_mode)\n",[87,441,442],{"class":89,"line":115},[87,443,444],{},"    self.call_js_keyword(\"myBlur\", selector=selector)\n",[24,446,447,449,450,453,454,457,458,461],{},[53,448,408],{}," reaches a keyword from any JavaScript module registered on the\nNode side — one this plugin loaded with ",[53,451,452],{},"initialize_js_extension",", or one loaded\nthrough the library's ",[53,455,456],{},"jsextension="," argument — it is not a way to call arbitrary Playwright\nmethods, so ",[53,459,460],{},"myBlur"," has to exist in that module.",[62,463,465],{"id":464},"calling-javascript-from-a-python-plugin","Calling JavaScript from a Python plugin",[24,467,468],{},"Load a JS module in the constructor, then call into it:",[78,470,472],{"className":80,"code":471,"language":82,"meta":83,"style":83},"from pathlib import Path\n\nfrom robot.api.deco import keyword\n\nfrom Browser import Browser\nfrom Browser.base.librarycomponent import LibraryComponent\n\n\nclass PythonPlugin(LibraryComponent):\n    def __init__(self, library: Browser):\n        super().__init__(library)\n        self.initialize_js_extension(Path(__file__).parent.resolve() \u002F \"JSPlugin.js\")\n\n    @keyword\n    def my_mouse_wheel(self, x: int, y: int):\n        \"\"\"Calls a custom JavaScript keyword from JSPlugin.js.\"\"\"\n        return self.call_js_keyword(\"myMouseWheel\", x=x, y=y)\n",[53,473,474,479,483,487,491,496,500,504,508,513,518,523,528,532,536,541,546],{"__ignoreMap":83},[87,475,476],{"class":89,"line":90},[87,477,478],{},"from pathlib import Path\n",[87,480,481],{"class":89,"line":96},[87,482,100],{"emptyLinePlaceholder":99},[87,484,485],{"class":89,"line":103},[87,486,112],{},[87,488,489],{"class":89,"line":109},[87,490,100],{"emptyLinePlaceholder":99},[87,492,493],{"class":89,"line":115},[87,494,495],{},"from Browser import Browser\n",[87,497,498],{"class":89,"line":120},[87,499,123],{},[87,501,502],{"class":89,"line":126},[87,503,100],{"emptyLinePlaceholder":99},[87,505,506],{"class":89,"line":132},[87,507,100],{"emptyLinePlaceholder":99},[87,509,510],{"class":89,"line":137},[87,511,512],{},"class PythonPlugin(LibraryComponent):\n",[87,514,515],{"class":89,"line":142},[87,516,517],{},"    def __init__(self, library: Browser):\n",[87,519,520],{"class":89,"line":148},[87,521,522],{},"        super().__init__(library)\n",[87,524,525],{"class":89,"line":153},[87,526,527],{},"        self.initialize_js_extension(Path(__file__).parent.resolve() \u002F \"JSPlugin.js\")\n",[87,529,530],{"class":89,"line":159},[87,531,100],{"emptyLinePlaceholder":99},[87,533,534],{"class":89,"line":165},[87,535,156],{},[87,537,538],{"class":89,"line":171},[87,539,540],{},"    def my_mouse_wheel(self, x: int, y: int):\n",[87,542,543],{"class":89,"line":177},[87,544,545],{},"        \"\"\"Calls a custom JavaScript keyword from JSPlugin.js.\"\"\"\n",[87,547,548],{"class":89,"line":183},[87,549,550],{},"        return self.call_js_keyword(\"myMouseWheel\", x=x, y=y)\n",[36,552,554],{"kind":553},"warning",[24,555,556,557,559,560,563,564,567,568,346,571,574,575,346,578,581,582,585],{},"Every argument to ",[53,558,408],{}," must be ",[335,561,562],{},"named"," and JSON serialisable —\npassing one positionally raises ",[53,565,566],{},"TypeError",". The names ",[53,569,570],{},"page",[53,572,573],{},"context",",\n",[53,576,577],{},"browser",[53,579,580],{},"logger"," and ",[53,583,584],{},"playwright"," are reserved: the Node side injects those\nitself, so you cannot pass your own.",[24,587,588],{},"This combination is usually the one you want: the keyword signature, type\nconversion and documentation are Python, and only the part that genuinely needs\nthe page is JavaScript.",[590,591,592],"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":83,"searchDepth":96,"depth":96,"links":594},[595,596,597],{"id":64,"depth":96,"text":65},{"id":365,"depth":96,"text":366},{"id":464,"depth":96,"text":465},"Add or replace keywords from Python, with access to the library's own API and to the Node side.","md",{},"\u002Fdocs\u002Fextending\u002Fpython-plugins","extending",{"title":19,"description":598},"docs\u002Fextending\u002Fpython-plugins","4GpRmD40nhmXo6HVQ6UIeLeS1SQoKk8QwKbhqMxqLjc",[607,612,616,620,624,628,632,636,639,640,644,649,653,657,662,666,670,674],{"path":608,"title":609,"description":610,"section":611,"order":115},"\u002Fdocs\u002Fconcepts\u002Farchitecture","How Browser works","Python, a Node process and Playwright — what runs where, and which installation to choose.","concepts",{"path":613,"title":614,"description":615,"section":611,"order":103},"\u002Fdocs\u002Fconcepts\u002Fassertions","Assertions","Almost every getter can assert, every assertion retries, and each return type allows different operators. The complete AssertionEngine reference.",{"path":617,"title":618,"description":619,"section":611,"order":90},"\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":621,"title":622,"description":623,"section":611,"order":120},"\u002Fdocs\u002Fconcepts\u002Flogging","Logging and debugging","Four places Browser tells you what happened — log.html, the Playwright log, traces and coverage.",{"path":625,"title":626,"description":627,"section":611,"order":96},"\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":629,"title":630,"description":631,"section":611,"order":109},"\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":633,"title":634,"description":635,"section":602,"order":96},"\u002Fdocs\u002Fextending\u002Fjavascript-basics","Just enough JavaScript","The JavaScript you need to write extensions and Evaluate JavaScript, for people who write Python.",{"path":43,"title":637,"description":638,"section":602,"order":103},"JavaScript extensions","Add keywords that run on the Node side with full Playwright access — and attach a debugger to them.",{"path":601,"title":19,"description":598,"section":602,"order":90},{"path":641,"title":642,"description":643,"section":602,"order":109},"\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":645,"title":646,"description":647,"section":648,"order":96},"\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":650,"title":651,"description":652,"section":648,"order":90},"\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":654,"title":655,"description":656,"section":648,"order":103},"\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":658,"title":659,"description":660,"section":661,"order":103},"\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":663,"title":664,"description":665,"section":661,"order":109},"\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":667,"title":668,"description":669,"section":661,"order":96},"\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":671,"title":672,"description":673,"section":661,"order":90},"\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":675,"title":676,"description":677,"section":678,"order":90},"\u002Fdocs\u002Fstart\u002Fgetting-started","Getting started","Install Browser, write a first test, and run it.","start",[680,683,686],{"to":681,"label":682},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":684,"label":685},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":687,"label":688},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",[690],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> json\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> robot\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">api \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> logger\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> robot\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">api\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">deco \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Browser\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">base\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">librarycomponent \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> LibraryComponent\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Browser\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">generated\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">playwright_pb2 \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Request\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">class\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> SimplePythonPlugin\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">LibraryComponent\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">):\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    @\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> cookie_via_public_api\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> ->\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> dict\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">        \"\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Uses Browser's own public API.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\"\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E2E1D7\">        cookies \u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">library\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">get_cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E2E1D7\">        logger\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">debug\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">json\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">dumps\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> indent\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">4\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> default\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">str\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">))\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">        assert\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> len\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> ==\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Too many cookies.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">name\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">0\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">][\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">name\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">],\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">value\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">0\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">][\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">value\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">]}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    @\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> cookie_via_grpc\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> ->\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> dict\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">        \"\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Calls the Node side directly over gRPC.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\"\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">        with\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">playwright\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">grpc_channel\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">()\u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\"> as\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> stub\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E2E1D7\">            response \u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> stub\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">GetCookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">Request\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">().\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">Empty\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">())\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E2E1D7\">            cookies \u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> json\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">loads\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">response\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">json\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">name\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">0\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">][\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">name\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">],\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">value\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> cookies\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">0\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">][\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">value\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">]}\u003C\u002Fspan>\u003C\u002Fspan>",[692],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Settings ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">Library\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    plugins=\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">CURDIR\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">\u002FSimplePythonPlugin.py\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\">Read A Cookie\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    New Page\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    https:\u002F\u002Fexample.com\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Add Cookie\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    session\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    abc123\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    url=https:\u002F\u002Fexample.com\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">cookie\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">    Cookie Via Public Api\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    Should Be Equal\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">    ${\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\">cookie\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">[name]\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    session\u003C\u002Fspan>\u003C\u002Fspan>",[694],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">@\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> disable_element\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> selector\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">):\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Disables an element.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\"\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFB86B\">    self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">library\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">evaluate_javascript\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">selector\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">e => e.disabled = true\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>",[696],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">@\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> highlight_and_blur\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> selector\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">):\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Blurs the element, honouring presenter mode.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\"\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E2E1D7\">    selector \u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">presenter_mode\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">selector\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">strict_mode\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFB86B\">    self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">call_js_keyword\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">myBlur\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> selector\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">selector\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>",[698],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> pathlib \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Path\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> robot\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">api\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">deco \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Browser \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Browser\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Browser\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">base\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">librarycomponent \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> LibraryComponent\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">class\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> PythonPlugin\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">LibraryComponent\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">):\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> __init__\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> library\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Browser\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">):\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">        super\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">().\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">__init__\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">library\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFB86B\">        self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">initialize_js_extension\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">Path\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">__file__\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">).\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">parent\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">resolve\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\"> \u002F\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">JSPlugin.js\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    @\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">keyword\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">    def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> my_mouse_wheel\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> x\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> int\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> y\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> int\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">):\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">        \"\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Calls a custom JavaScript keyword from JSPlugin.js.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\"\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> self\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">call_js_keyword\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">myMouseWheel\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> x\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">x\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> y\u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">y\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">)\u003C\u002Fspan>\u003C\u002Fspan>",1786734138938]